Control de nivel de agua con sensor de ultrasonido, electrovalvula y bomba.

Hola compañeros del foro,

Soy nuevo en el mundillo de la programación en Arduino y tengo un proyecto en el cual tengo que pedir un número o porcentaje de llenado del nivel de agua, cuando la persona envíe este porcentaje o número, se debe activar la electroválvula para dejar pasar el agua. Si el porcentaje sobre pasa cierto nivel la bomba debe activarse para expulsar el agua.

Aún no he dado con el truco ya que no consigo que la electroválvula me deje pasar el porcentaje especificado, tengo este código pero sé que algo falla.

const int Trigger = 2;   //Pin digital 2 para el Trigger del sensor
const int Echo = 3;   //Pin digital 3 para el Echo del sensor
const int valvula = 8;     //Valvula
const int Bomba = 9;    //Electro Bomba
int cm = 0;

#define DEBUG(a) Serial.println(a);
void setup() {
  Serial.begin(9600);//iniciailzamos la comunicación
  pinMode(Trigger, OUTPUT); //pin como salida
  pinMode(Echo, INPUT);  //pin como entrada
  digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
  Serial.setTimeout(50);
  Serial.println("Introduzca la cantidad que desea llenar: ");
  pinMode(valvula, OUTPUT);  //definir pin como salida Valvula
  pinMode(Bomba, OUTPUT);  //definir pin como salida Bomba agua
}

void loop()
{

  long t; //timepo que demora en llegar el eco
  long d; //distancia en centimetros
  long distancia;

  digitalWrite(Trigger, HIGH);
  delayMicroseconds(10);          //Enviamos un pulso de 10us
  digitalWrite(Trigger, LOW);
  
  t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso
  d = t/59;             //escalamos el tiempo a una distancia en cm
  distancia = d+4; //reajuste de error
  cm = distancia;
  
  Serial.print("Distancia: ");
  Serial.print(distancia);      //Enviamos serialmente el valor de la distancia
  Serial.print("cm");
  Serial.println();
  delay(1000);          //Hacemos una pausa 

  if (Serial.available())
   {
      int data = Serial.parseInt();
      DEBUG((int)data);
      delay(100);
    
      if (data <= 0 && data > 17){
        Serial.println("Valor no válido. Introduzca entre un rango de 1 a 16.");
        digitalWrite(valvula, LOW);
        delay(1000);   
        digitalWrite(Bomba, LOW);
        delay(1000);
      }else{        
        
        cm = data;
        digitalWrite(valvula, HIGH);   // poner el Pin en HIGH
        delay(2000);               // esperar dos segundo
        digitalWrite(valvula, LOW);    // poner el Pin en LOW
        delay(2000);               // esperar 2 segundo
       }
       if (cm > 7){
          digitalWrite(Bomba, HIGH);
          delay(10000);
          digitalWrite(Bomba, LOW);
          delay(1000);
          
       }
      

       delay(1000); // Wait for 1 second(s)
}
}

La verdad me he atascado pues no funciona como querría, osea aplicando la cantidad especificada.

muchas gracias de antemano por la ayuda :smiley:

Como se entiende esta parte del código, se lo que dice pero no entiendo la idea.

if (data <= 0 && data > 17){
 Serial.println("Valor no válido. Introduzca entre un rango de 1 a 16.");
 digitalWrite(valvula, LOW);
 delay(1000);   
 digitalWrite(Bomba, LOW);
 delay(1000);
 } else {        
 cm = data;
 digitalWrite(valvula, HIGH);   // poner el Pin en HIGH
 delay(2000);               // esperar dos segundo
 digitalWrite(valvula, LOW);    // poner el Pin en LOW
 delay(2000);               // esperar 2 segundo
 }

Es una supuesta rutina de validación donde esperas valores de 1 a 16, sin embargo, tomas acciones sobre la valvula y la bomba.

De acuerdo a como tengas conectado el rele esos dos digitalWrite(pin, LOW) accionan el rele y no lo apagan y por otro lado, si son correctos estas apagando la Valvula y luego la estas acccionando luego de 2 seg de pausa en cada caso.

Algo que cada vez que lo veo, realmente me preocupa porque tienes 4 segundos en los que nada se hace.

Y finalmente si cm > 7
apagas la bomba x 10 seg y luego la enciendes

digitalWrite(Bomba, HIGH);
 delay(10000);
 digitalWrite(Bomba, LOW);
 delay(1000);

Es asi como se esta comportando no?

Entonces LOW habitualmente enciende y HIGH apaga. confirma esto!!