Sistema de riego: La bomba de agua sigue funcionando con el depósito vacio

He diseñado un código para un sistema de riego.

He usado un sensor de nivel de líquidos (interruptor de flotador) y la función switch para establecer condiciones de riego y no riego en función de si el depósito está lleno (valor 0) o vacio (valor 1). El sensor nivel de líquidos detecta si el depósito está lleno o vacio pero el problema es que el motor de la bomba de agua sigue funcionando cuando no hay agua en el depósito Al margen de eso, si el depósito está lleno debería regar solamente si la temperatura ambiente es menor que 30º, si la luminosidad es menor que 30 y si la humedad de suelo es menor que 50, en caso contrario aunque el depósito esté lleno no debería regar en absoluto.

Este es el código:

/* SISTEMA DE RIEGO AUTOMÁTICO CON SENSOR DE HUMEDAD DE SUELO, SENSOR
DE HUMEDAD DE AIRE, SENSOR DE LUZ Y SENSOR DE NIVEL DE LÍQUIDOS */
#include <SimpleDHT.h>
// Librería  <SimpleDHT.h> del sensor de temperatura y humedad relativa
#include <SPI.h>
// Librería <SPI.h> del motor DC compatible con la minibomba de agua DC
#define soil_moisture A0
// Se define variable del sensor de humedad en el suelo en el pin A0
#define photorresistor A5
// Se define variable del sensor de fotoresistencia LDR en el pin A5
// for DHT11, 
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2
int pinDHT11 = 2;
// Se declara la variable pinDHT11 y lo asocio al pin 2
SimpleDHT11 dht11;
int photorresistor_value = 0;
// Se declara el valor de la velocidad de la bomba de agua
int water_pump = 3;
int water_pump_speed = 200;
//Velocidad de la minibomba de agua oscila entre 100 como mínimo y 255 como máximo. Yo he //elegido 255 pero ustedes pueden elegir la que estimen conveniente. A más velocidad, mayor //bombeo de agua
int water_tank = 13;

void setup() {
  Serial.begin(9600);
  pinMode(water_tank,INPUT);
  pinMode(water_pump,OUTPUT);
}
void loop() {
    // start working...
// Mide la temperatura y humedad relativa y muestra resultado
  Serial.println("*******************************");
  Serial.println("Sample DHT11...");
    
    // read with raw sample data.
    byte temperature = 0;
    byte humidity_in_air = 0;
    byte data[40] = {0};
    if (dht11.read(pinDHT11, &temperature, &humidity_in_air, data)) {
      Serial.print("Read DHT11 failed");
      return;
    }
    
    Serial.print("Sample RAW Bits: ");
    for (int i = 0; i < 40; i++) {
      Serial.print((int)data[i]);
      if (i > 0 && ((i + 1) % 4) == 0) {
        Serial.print(' ');
      }
    }
    Serial.println("");
    
    Serial.print("Sample OK: ");
    Serial.print("Temperature: ");Serial.print((int)temperature); Serial.print(" *C, ");
    Serial.print("Relative humidity in air: ");Serial.print((int)humidity_in_air); Serial.println(" %");
    
    // DHT11 sampling rate is 1HZ.
  
    // Ground humidity value in %
  // Mide la humedad en el suelo en % y muestra el resultado
    
    int soil_moisture_value = map(analogRead(soil_moisture), 0, 1023, 0, 100);
    Serial.print("Soil_moisture: ");
    Serial.print(soil_moisture_value);
    Serial.println("%");
  
    // Light value in %
  // Mide la luminosidad en % y muestra el resultado
  
    int photorresistor_value = map(analogRead(photorresistor), 0, 1023, 0, 100);
    Serial.print("Light: ");
    Serial.print(photorresistor_value);
    Serial.println("%");
     Serial.println("*******************************");
  
    int state = digitalRead(water_tank);
    Serial.print("Estado sensor de nivel de agua: ");
    Serial.println(state);

switch(state) {
    case 0: // Hay agua en el depósito
     //**************************************************************
     // Condiciones de riego 
     // Si la humedad en el suelo es igual o inferior al 50%, si la luminosidad es inferior al 30%,
     // Si la temperatura es inferior al 30%, entonces el sistema de riego riega. 
     // En caso de que no se  cumpla alguno o ninguno de los 3 requisitos anteriores,
     // el sistema de riego no riega
     //**************************************************************
       if( soil_moisture_value <= 50 && photorresistor_value < 30 && temperature < 30) {
       Serial.println("Irrigate");
         analogWrite(water_pump,water_pump_speed);
         digitalWrite(water_pump,HIGH);
       }
     //El motor de la bomba de agua arranca con la velocidad elegida anteriormente en el código     
       else{
       digitalWrite(water_pump, LOW);
       Serial.println("Do not irrigate");
       //El motor de la bomba de agua se para y no riega
       }
      break;
    case 1: // No hay agua en el depósito
        Serial.println("NO WATER");
        digitalWrite(water_pump, LOW);
      break;
  } 
  delayMicroseconds (50);
}

Y esta es la parte del código

Esa fuente que citas es mi blog. Y para ser honestos, partes de este código corresponden a otros códigos como el código del módulo DHT11 del kit de Elegoo.y de otros códigos que he leido por Internet. De hecho, ese código que citas está basado en el código de Jarduino con respectivas modificaciones. También tengo un código de sistema de riego con display LCD y sensor de ultrasonidos, pero quería hacer uno con sensor de nivel de líquido.
He tratado de hacer una modificación y veo que no funciona.

¿Me echas un cable? Gracias. :slight_smile:

Moderador: No repitas lo que se lee arriba

Si estas comandando la bomba simplemente con arduino tu problema es de potencia.

No veo que tiene que ver la velocidad que indicas acá

int water_pump = 3;         // Se declara el valor de la velocidad de la bomba de agua
int water_pump_speed = 200; //Velocidad de la minibomba de agua oscila entre 100 como mínimo y 255 como máximo. Yo he //elegido 255 pero ustedes pueden elegir la que estimen conveniente. A más velocidad, mayor //bombeo de agua

La variable water_pump_speed es si le das velocidad a tu bomba pero solo usas un control SI/NO o sea un control digital. Igualmente esto no explica tu problema.

Intenta explicarnos con un esquema como controlas la bomba desde el pin 3.

Espero que no sea directamente!!

si el depósito está lleno (valor 0) o vacio (valor 1). El sensor nivel de líquidos detecta si el depósito está lleno o vacio pero el problema es que el motor de la bomba de agua sigue funcionando cuando no hay agua en el depósito

Estas seguro que 0 es tanque lleno ?

Porque la doble asignación de water_pump ? comenta con // alguno en todo caso.

analogWrite(water_pump, water_pump_speed);
digitalWrite(water_pump, HIGH);

El estado "0" indica que el tanque está lleno. Hay 2 formas de usar el sensor de nivel de líquidos, boca arriba o boca abajo, yo lo dejo en el agua y es el resultado que me da el código.

La doble asignación es un error, tienes toda la razón, sobra "digitalWrite(water_pump, HIGH)"; debió quedar ahí cuando hice pruebas con un relé.

Kike_GL:
Estas seguro que 0 es tanque lleno ?

Porque la doble asignación de water_pump ? comenta con // alguno en todo caso.

analogWrite(water_pump, water_pump_speed);

digitalWrite(water_pump, HIGH);

Este es el esquema del sistema de riego que he hecho con Fritzing, el panel solar lo he sacado de la web instructables pero no es el mismo, he hecho una serie de modificaciones. Alimento el circuito con un panel solar y una pila de 3,7V, quizá por eso ande un poco justo el motor, no sé si alimentarlo con una pila de 9V, aunque me gustaria que la pila de 3,7V pudiera alimentar todo el circuito sin problema.

Quizá lo ideal sería un panel solar para Arduino y los sensores, otro para el motor y otro para módulo Bluetooth, Wifi, visualizador LCD, LEDs indicadores, buzzer, lo que fuere.

Ya he solucionado el problema, no es un problema de código (funciona perfectamente), es un problema de hardware.

El motor DC de la bomba de agua de acuario utiliza un transistor NPN, un diodo y una resistencia. Pues bien, he detectado que en mi montaje sobre la placa protoboard que las patillas de estos componentes electrónicos hacian contacto entre sí, fue aislarlos los unos de los otros y todo volvió a funcionar de forma correcta. El motor paraba, cuando el código daba la instrucción de que parase y funcionaba cuando el motor Ya me pasó un problema similar hace tiempo.

Saludos a todos y gracias por vuestra ayuda.