martes, 31 de enero de 2017

Sistema de riego hecho con Arduino y varios sensores de luz, temperatura y humedad que usa una minibomba de agua

Estuve buscando información en Internet para conseguir un sistema de riego automático con Arduino. Después de leer diversas webs, el proyecto más interesante y que me ha servido como fuente de inspiración se llama Jarduino y aparece en la web  http://www.interorganic.com.ar. No lo he plagiado, he tenido que hacer modificaciones como reescribir el código porque algunos materiales usados en el proyecto de Jarduino son diferentes de los que yo dispongo. Hace tiempo, compré un Kit de Arduino vendido por Elegoo y disponía de diversos componentes electrónicos y de manual de instrucciones en español y en pdf y casi todo los componentes electrónicos son de ese kit. El montaje de los diferentes componentes sobre la placa de pruebas (breadboard) también es diferente al del proyecto Jarduino.

Componentes del proyecto

1 microcontrolador Arduino UNO R3



1 placa de pruebas (breadboard) para Arduino


1 sensor de temperatura y humedad relativa en el aire DHT11


1 sensor de humedad de suelo con higlómetro YL-69 (Este sensor es muy popular pero goza de mala fama y dicen que dura poco tiempo por culpa de la  corrosión) si pueden compren otro. También pueden intentar hacer un sensor de humedad de suelo casero.


1 mini bomba de agua sumergible DC 3V 120L/H Arduino 2,5-6V


1 diodo 1N4007



1 transistor PN2222



1 resistencia de 220 Ohmios


1 fotoresistencia LDR


Una resistencia de 10000 Ohmios



Cables macho a macho para Arduino



Cables macho a hembra para Arduino

Montaje

El montaje de los componentes electrónicos sobre la placa de pruebas (breadboard) quedaría como aparece en la imagen hecha con  Fritzing, que es es un programa libre de automatización de diseño electrónico que busca ayudar a diseñadores y artistas para que puedan pasar de prototipos (usando, por ejemplo, placas de pruebas) a productos finales. Algunos componentes no aparecían en la lista de Fritzing así que he tenido que improvisar con Gimp.

Pinche en la imagen para agrandar.



Este sistema de riego automático con Arduino riega cuando detecta una combinación de bajos niveles de luz (noche, oscuridad), temperatura en el aire y la humedad en el suelo y deja de regar cuando esos niveles de luz, temperatura y humedad son altos. Los valores de riego o no riego los determina el usuario a través del código que hay que compilar y subir a la placa del microcontrolador Arduino.

Código

#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 humidity_sensor_pin A0
//Se define variable del sensor de humedad en el suelo en el pin A0
#define ldr_pin A5
//Defino 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 ldr_value = 0;
//Se declara la variable ldr_value (fotoresistencia) y 
int water_pump_pin = 3;
//Se declara la variable mini bomba de agua y lo asocio al pin 3
int water_pump_speed = 255;
//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

void setup() {
  Serial.begin(9600);
}

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 ground_humidity_value = map(analogRead(humidity_sensor_pin), 0, 1023, 100, 0);
  Serial.print("Ground humidity: ");
  Serial.print(ground_humidity_value);
  Serial.println("%");

  // Light value in %
// Mide la luminosidad en % y muestra el resultado

  int ldr_value = map(analogRead(ldr_pin), 1023, 0, 100, 0);
  Serial.print("Light: ");
  Serial.print(ldr_value);
  Serial.println("%");
   Serial.println("*******************************");

//**************************************************************
// 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( ground_humidity_value <= 50 && ldr_value < 30 && temperature < 30) {
 digitalWrite(water_pump_pin, HIGH);
 Serial.println("Irrigate");
 analogWrite(water_pump_pin, water_pump_speed);
//El motor de la bomba de agua arranca con la velocidad elegida anteriormente en el código
 }
 else{
 digitalWrite(water_pump_pin, LOW);
 Serial.println("Do not irrigate");
//El motor de la bomba de agua se para y no riega
 }
 delay (100); 
// Ejecuta el código cada 100 milisegundos
}

Algunos expertos consideran que medir la intensidad de luz en porcentaje no  es muy apropiado pero no he querido liarme con unidades como lux, luminancia o candela que no estoy acostumbrado a usar. He comprobado que cuando tapo la fotoresistencia LDR con una prenda de ropa, la iluminación se reduce practicamente a 0% y eso es lo que importa.

Existen otras posibilidades como programar el riego automático para que se ejecute a una hora determinada durante el periodo de tiempo. He leído que se puede introducir una hora y guardarla pero que si la placa de Arduino deja de alimentarse de corriente eléctrica durante unos instantes, esa hora se borra y hay que volver a introducirla y estar pendiente es un problema.  También he estudiado la posibilidad de usar un motor de pasos para dirigir el tubo por donde sale el agua impulsada por una minibomba de agua en varias direcciones y así regar varias macetas colocadas de forma estratégica pero he visto un vídeo y el chorro de agua a veces impactaba en la planta cosa que no me gusta nada. 

No descarto investigar estas posibilidades y llevarlas a cabo pero considero que este sistema de riego es bastante completo y funcionará siempre que la placa esté alimentada de corriente eléctrica y no haya un eclipse total.

El suministro de corriente eléctrica puede ser una pila rectangular de 9V, una batería de móvil o un puerto USB del ordenador. Sería interesante estudiar como alimentar la placa de Arduino con una batería de móvil y un panel solar, aunque de noche no haga sol, de día siempre lo hace en mayor o menor intensidad. El problema de usar una placa solar en Invierno es que no hay mucho sol y si hay muchos días de cielo nublado y lluvia pero eso es bueno porque no haría falta regar ni que nuestro sistema de riego automático estuviese operativo y los días de Invierno que haga sol, supongo que sería suficiente como alimentar una batería de móvil que puede durar encendida varios días.