Problemas en mi codigo (Arduino uno, sensor HC-SR04 y rele)

Buenas estimados. Paso a comentarles mi proyecto.

Tengo una bomba de agua que por la baja presión de agua no anda el automatico, asi que hice que un sensor avise al Arduino que encienda el rele que alimenta la bomba (que manualmente siempre esta encendida al enchufar el cable a la corriente) para asi tener agua. Entonces, me encontré con algo que no entiendo, si revisan mi código, de alguna manera el programa se activa solo siendo que no hay nadie ni nada frente al sensor... observen la captura de pantalla que adjunto..

int RELE_PIN = 2;
int TRIGGER_PIN = 5;
int ECHO_PIN = 6;
int LED_PIN = 8;
int contMax = 0;
int contMin = 0;
unsigned long timeTeapot = 19000;
unsigned long timeWash = 60000;
unsigned long timeWashingMachine = 240000;
boolean stateHand = false;
boolean stateMachine = false;
unsigned long lastTime;
unsigned long timeOff;
unsigned long timeWait;

void setup() {
  pinMode(RELE_PIN, OUTPUT);
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  
  Serial.println(obtenerDistancia());
  delay(200);
  
  if (obtenerDistancia() > 0 && obtenerDistancia() <= 20 && stateHand == false) {
    digitalWrite(LED_PIN, HIGH);
    digitalWrite(RELE_PIN, HIGH);
    timeWait = millis() + 10000;
    lastTime = millis();
    stateHand = true;
    Serial.println("PROGRAMA ACTIVADO......");
    delay(200);  
  }
  
  if (millis() - lastTime < 2900 && stateMachine == false && stateHand == true){  
    if (obtenerDistancia() >= 20){
      contMax++;  
    }else {
      contMin++;}
  }

  if (millis() - lastTime >= 2900 && millis() - lastTime <= 3100 && stateMachine == false && stateHand == true){
    if (contMax > contMin){
      timeOff = millis() + timeTeapot;
      stateMachine = true;
    }else {
      contMax = 0;
      contMin = 0;}
  }
  
  if (millis() - lastTime > 3100 && millis() - lastTime < 5900 && stateMachine == false && stateHand == true){ 
    if (obtenerDistancia() >= 20){
      contMax++;
    }else {
      contMin++;} 
  }

  if (millis() - lastTime >= 5900 && millis() - lastTime <= 6100 && stateMachine == false && stateHand == true){
    if (contMax > contMin){
      timeOff = millis() + timeWash;
      stateMachine = true;
    }else {
      contMax = 0;
      contMin = 0;}      
  }
  
  if (millis() - lastTime > 6100 && stateMachine == false && stateHand == true){ 
    if (obtenerDistancia() >= 20){
      contMax++;       
    }else {
      contMin++;}
  }

  if (millis() - lastTime >= 7500 && millis() - lastTime <= 7700 && stateMachine == false && stateHand == true){
      timeOff = millis() + timeWashingMachine;
      stateMachine = true;    
  }
  
  if (timeWait < millis()){
     if (timeOff <= millis()){
        digitalWrite(LED_PIN, LOW);
        digitalWrite(RELE_PIN, LOW);
        stateMachine = false;
        stateHand = false;
        contMax = 0;
        contMin = 0;
     }else if (obtenerDistancia() <= 20){
           digitalWrite(LED_PIN, LOW);
           digitalWrite(RELE_PIN, LOW); 
           timeWait = millis() + 2000;
           timeOff = millis();}
   }
        
}

float obtenerDistancia(){
  digitalWrite(TRIGGER_PIN, HIGH);
  delay(1);
  digitalWrite(TRIGGER_PIN, LOW);
  int DUR = pulseIn(ECHO_PIN, HIGH);
  return DUR / 58.2;
  }

A que se debe esto?. Lo ultimo que hice fue imprimir en 3D una carcasa para el sensor pero este esta zumbando a muy bajito volumen dentro de la carcasa, antes cuando no la tenia no sonaba asi, a lo mejor eso tiene que ver nose necesito ideas.

Lo que yo veo es esto:

  if (timeWait < millis()) {
    if (timeOff <= millis()) {
      digitalWrite(LED_PIN, LOW);
      digitalWrite(RELE_PIN, LOW);
      stateMachine = false;
      stateHand = false;
      contMax = 0;
      contMin = 0;
    } else if (distancia <= 20) {
      digitalWrite(LED_PIN, LOW);
      digitalWrite(RELE_PIN, LOW);
      timeWait = millis() + 2000;
      timeOff = millis();
    }
  }

Solo en esta porción de código pones en falso stateMachine y se requiere que este en falso para indicar Maquina Activada ademas de que haya ALGO delante del sensor.
Si dices que nada hay delante del sensor, entonces esta midiendo mal. Y eso puede deberse a mala elección del tipo de variables
Usa esto

float obtenerDistancia() {
  digitalWrite(TRIGGER_PIN, HIGH);
  delay(1);
  digitalWrite(TRIGGER_PIN, LOW);
  long DUR = pulseIn(ECHO_PIN, HIGH);
  return (float) DUR / 58.2;
}

En lugar de int usa long y agrega un float al final para que la conversión sea correcta.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.