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
