Invernadero Hidroponico Automatizado con Arduino

Hola... soy nuevo en el foro (y también en Arduino :confused: ) bueno les contare un poco sobre mi proyecto.

Hace un mes que me compre el Arduino UNO con algunos componentes electrónicos y a la vez empece a estudiarlo un poco, ya tiempo que quería aprender alguna plataforma de este tipo y bueno pensé en algún proyecto que fuera productivo y no tan laborioso, así que pensé en un invernadero automatizado con Arduino.

Todo este mes me la pase tanto estudiando como elaborando el invernadero, el invernadero lo hice con pura chatarra y fierro viejo que tenia tirado por ahí. también use componentes de un microondas que ya no me servia como el ventilador y el foco, casi todo fue reciclado!.

Ahora ya tengo un gran progreso y poco a poco voy mejorando en la programación en Arduino :slight_smile:

Les hablare un poco del funcionamiento:

El invernadero tiene un funcionamiento bastante básico, funciona con un sensor DHT22 y un LDR, cuando este detecte una temperatura o humedad no estable tiene que entrar un revelador.

Para la ventilación del invernadero hice una ventana no muy pesada para poder levantarla con 2 servo SG90 cuando la temperatura sea alta

Incluí un modulo de 4 reveladores para ventilador, calentador, humidificador y foco (le incluí una pequeña borneara).

También incluí un LCD 16x2 para poder visualizar las lecturas de mis sensores, así como un modulo HC-05 para poder monitorear las lecturas desde mi celular si estoy en otra parte de mi casa.

(el "gabinete" lo hice con una cajita de ferrero rocher :stuck_out_tongue: )

Cuenta con un Mini Buzzer para que cuando se encuentre algún error el buzzer sonara.

El Arduino UNO me quedo muy chico para este proyecto tendré que comprar un Arduino MEGA debido a que todavía me faltan pines para 2 reveladores.

También conseguiré un mini protoboard para pegarlo por debajo de la caja y dejarla dentro.

Al igual que me falta forrarla de algún plástico, calentador, humidificador y obvio... las plantas!
así que iré actualizando este hilo poco a poco

les dejo el código por si quieren basarse o ayudarme 8) :wink:

Saludos!!!

ArduINV_1.1.ino (6.75 KB)

los sketch se adjuntan con sus correspondientes tags (dale un repaso a las normas del foro).las entradas analogicas que no uses se pueden usar como digitales y usando una lcd i2c tambien hubieras ahorrado pines.

jose:
los sketch se adjuntan con sus correspondientes tags (dale un repaso a las normas del foro).las entradas analogicas que no uses se pueden usar como digitales y usando una lcd i2c tambien hubieras ahorrado pines.

Vaya perdon... lo tomare en cuenta no se me da eso de leer bien las reglas :stuck_out_tongue: :confused:

pues de hecho iba a comprar la interfaz pero por donde vivo no la encontre, no sabia eso de los analogico lo tomare en cuenta ;D

Gracias!!!! :wink:

Puedes usar 74HC595 shift registers para expandir salidas al número que gustes.. si quieres seguir con el UNO aunque el MEGA será mucho mejor ( si lo pediste olvídalo).
Entonces con variso 595 vas expandiendo salidas de 8 en 8 (8 x chip usado).
Te queda todo el resto del UNO para lo que gustes, entradas y las analógicas o i2C o lo que fuere.
Solo consumes 3 pines con el 595.

surbyte:
Puedes usar 74HC595 shift registers para expandir salidas al número que gustes.. si quieres seguir con el UNO aunque el MEGA será mucho mejor ( si lo pediste olvídalo).
Entonces con variso 595 vas expandiendo salidas de 8 en 8 (8 x chip usado).
Te queda todo el resto del UNO para lo que gustes, entradas y las analógicas o i2C o lo que fuere.
Solo consumes 3 pines con el 595.

Pues gracias a jose que me dio la idea de los pines analogicos como digitales, ya conecte los pines que me faltaban de los reveladores :slight_smile:

Aunque no es mala la idea de los 595 si quiero expender todavía mas con la misma UNO :smiley:
(para usar esa misma cajita)

Pues ya modifique el código y use los pines A1 y A2 como digitales para mis reveladores y añadí las instrucciones para el humidificador y el calentador

/* ArduINV 1.1

Para automatizar el invernadero se utilizaron los siguientes componentes:

 *  Arduino UNO R3 SMD
 *  Sensor de temperatura y humedad DHT22
 *  Sensor LDR (con su resistencia de 10K)
 *  Modulo 4 Relevadores
 *  LCD 16 x 2 (con potenciometro p/contraste)
 *  Moudlo Bluetooth HC-05
 *  2 Servomotores TowerPro SG90
 *  Mini Buzzer

 Componentes 127VAC:
 
 * Ventilador
 * Foco
 * Calentador
 * Humidificador
 
El proyecto consiste en regular la estabilidad de nuestro invernadero automaticamente gracias a los sensores
estos sensores nos entregaran las lecturas de temperatura, humedad y luminosidad (DHT22, LDR)
cuando detecten una lectura por debajo o superior de lo reglamentado debe entrar el componente correspondiente (Ventilador, Foco, Calentador, Humidicador)
tambien se encuentran los "Servomotores SG90" para abrir una pequeña ventana para aclimatar la temperaura
tenemos un Display de cristal liquido para poder checar las lecturas manualmente 
y un modulo bluetooth HC-05 para leer y tambien activar componentes manuealmente desde nuestro dispositivo movil con Android.
 */

//Incluimos las librerias para algunos componentes como...
#include <Servo.h>                                  // Servomotores
#include <LiquidCrystal.h>                          // LCD 16 x 2
#include "DHT.h"                                    // Sensor DHT22 (esta se descarga de Adafruit)
#include "pitches.h"                                // Notas musicales

#define DHTPIN 13                                   // Definimos el pin 13 como el pin del sensor.
#define DHTTYPE DHT22                               // Definimos el tipo de de DHT que tengamos en este caso el 22.

//Variables
Servo servo1;                                       // Declararemos 2 motores en este sketch
Servo servo2;
int Rele1 = 7;                                      // Declararemos los pines en los que se encuentran cada uno de nuestros reles
int Rele2 = A1;
int Rele3 = 6;
int Rele4 = A2;
int Buzzer = 8;
int LDR = A0;                                       // Declararemos el pin de nuestro LDR
int valLDR = 0;                                     // Esta variable sera la que usaremos para el valor de nuestro LDR
int sonido = NOTE_E5;                               // Declaramos la nota musical elegida como el sonido

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);             // Definimos los pines de nuestro LCD

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  //Declaramos lo necesario para nuestros servos
  servo1.attach(9);                                 // Declaramos el pin del servo 1
  servo2.attach(10);                                // Declaramos el pin del servo 2
  servo1.write(65);                                 // Escribimos el angulo comun de nuestros servos (ventana cerrada)
  servo2.write(90);
  
  // Declaramos los reles como salidas
  pinMode(Rele1, OUTPUT);
  pinMode(Rele2, OUTPUT);
  pinMode(Rele3, OUTPUT);
  pinMode(Rele4, OUTPUT);

  digitalWrite(Rele1, HIGH);
  digitalWrite(Rele2, HIGH);                        
  digitalWrite(Rele3, HIGH);
  digitalWrite(Rele4, HIGH);
  
  digitalWrite(Buzzer, LOW);
 
  // Iniciamos la comunicacion serial en 9600 baudios
  Serial.begin(9600);
  Serial.println("ArduINV 1.1 BT");
  
  lcd.begin(16, 2);                                 // Iniciamos la interfaz del LCD y incluimos las dimensiones de caracteres
  lcd.setCursor(2,0);
  lcd.print("Iniciando...");                        // Bienvenida para el sistema de "ArduINV" en el LCD
  lcd.setCursor(2,1);
  lcd.print("ArduINV 1.1");
  delay(4000);
  lcd.clear();
  dht.begin();                                      // Iniciamos la interfaz del sensor DHT
}

void loop() {
  // Definiremos las variables de nuestro sensor DHT22 tanto temperatura como humedad
  delay(200);
  float h = dht.readHumidity();                     // Establecemos el valor h como la humedad (lectura en porcentaje)
  float t = dht.readTemperature();                  // Establecemos el valor t como la temperatura (lectura en grados celcios)
  float f = dht.readTemperature(true);              // Establecemos el valor f como la temperatura (lectura en grados farenheit) (true al ser la correcta en temperatura)
  delay(2000);                            
  
  // Con esto cuando se detecte un error en las lecturas del sensor, la pantalla imprimira un aviso de error  y el buzzer sonara
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.clear();
    lcd.setCursor(3,0);
    lcd.print("Error al");                       
    lcd.setCursor(1,1);
    lcd.print("leer el sensor");
    tone(Buzzer, sonido);                          // Señal acustica de aviso 
    Serial.println("¡Error al leer el sensor!");
    return;
  }
  if ((h>1) || (t>1) || (f>1)){
    lcd.clear();
    delay(1);
    noTone(Buzzer);
  }
  
  float hif = dht.computeHeatIndex(f, h);           // Establecemos las lecturas correctas
  float hic = dht.computeHeatIndex(t, h, false);    // Establecemos las lecturas falsas

  //Impresion de lecturas en el LCD
  lcd.print("H: ");                                 // Imprimimos en el LCD la lectura de Humedad
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0,1);                               // Imprimimos en el LCD la lectura de Temperatura
  lcd.print("T: ");
  lcd.print(t);
  lcd.print(" C* ");
  lcd.setCursor(12,0);
  lcd.print("Luz:");                                // Imprimimos en el LCD la lectura del LDR
  lcd.setCursor(12,1);
  lcd.print(valLDR);

  //Impresion del lecturas en el puerto serial (Bluetooth)
  Serial.print("Humedad:    ");                    // Imprimimos la lectura de humedad
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");                    // Imprimimos la lectura de Temperatura
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(" Luz: ");                           // y la lectura de luminosidad
  Serial.print(valLDR);

  //Accion temperatura alta (DHT22, Ventilador)
  if (t>26) {                                     // Establecemos que cuando la temperatura sea superior a los 25°C;
    servo1.write(20);                             // Los motores deben girar a un angulo que le corresponda para tener la ventana abierta
    servo2.write(140);
    delay(10000);                                 // Dejamos este delay de 10 segundos para que despues entre el ventilador
    digitalWrite(Rele1, LOW);
  } else {                                        // valor else para que cuando se vuelva a temperatura estable apaga el ventilador y los motores vuelcan a su posicion
    servo1.write(65);
    servo2.write(90);
    digitalWrite(Rele1, HIGH);
  }

  //Accion temperatura baja (DHT22, Calentador)
  if (t<21) {                                     // Establecemos que cuando la temperatura sea superior a los 25°C
    digitalWrite(Rele2, LOW);
  } else {                                        // valor else para que cuando se vuelva a temperatura estable apaga el ventilador y los motores vuelcan a su posicion
    digitalWrite(Rele2, HIGH);
  }
  
  //Accion Luminosidad (LDR, Foco)
  valLDR = analogRead(LDR);                       // "valLDR" debe leer el pin analogico (pinLDR) para dar la lectura de luminosidad
  if(valLDR>400){                                 // Establecemos que si la lectura es menor a 400 el rele3 (Foco) debe encender
    digitalWrite(Rele3, HIGH);
  } else {
    digitalWrite(Rele3, LOW);                     // y si sube el valor de nuevo, debe apagars
  }

  //Accion humedad baja (DHT22, Calentador)
  if (h<55) {                                     // Establecemos que cuando la temperatura sea superior a los 25°C
    digitalWrite(Rele4, LOW);
  } else {                                        // valor else para que cuando se vuelva a temperatura estable apaga el ventilador y los motores vuelcan a su posicion
    digitalWrite(Rele4, HIGH);
  }
}

Mal posteado el código.
El código se postea usando este tag, </> no quote como has usado. Ve a More, luego Modify y cuando veas tu post, solo edita la palabra quote por code y listo.
O borra todo, pegas nuevamente y usas </>

Un consejo que te ayudará a emprolijar tu trabajo con visión de futuro es el que te describo:
No uses delay y quitarlo significa que aprendas a operar con millis().
Me preocupa tu código cuando vaya creciendo con cosas como esta.

if (t>26) {                                     // Establecemos que cuando la temperatura sea superior a los 25°C;
    servo1.write(20);                             // Los motores deben girar a un angulo que le corresponda para tener la ventana abierta
    servo2.write(140);
    // Dejamos este delay de 10 segundos para que despues  entre el ventilador
    delay(10000);                                
    digitalWrite(Rele1, LOW);
  } else {                                        // valor else para que cuando se vuelva a temperatura estable apaga el ventilador y los motores vuelcan a su posicion
    servo1.write(65);
    servo2.write(90);
    digitalWrite(Rele1, HIGH);
  }

También tienes otro delay de 2 seg al comienzo del loop.
En general en un invernadero las cosas ocurren lentamente, pero, puede haber algún evento que exija atención inmediata.

surbyte:
Mal posteado el código.
El código se postea usando este tag, </> no quote como has usado. Ve a More, luego Modify y cuando veas tu post, solo edita la palabra quote por code y listo.
O borra todo, pegas nuevamente y usas </>

Un consejo que te ayudará a emprolijar tu trabajo con visión de futuro es el que te describo:
No uses delay y quitarlo significa que aprendas a operar con millis().
Me preocupa tu código cuando vaya creciendo con cosas como esta.

if (t>26) {                                     // Establecemos que cuando la temperatura sea superior a los 25°C;

servo1.write(20);                            // Los motores deben girar a un angulo que le corresponda para tener la ventana abierta
    servo2.write(140);
    // Dejamos este delay de 10 segundos para que despues  entre el ventilador
    delay(10000);                               
    digitalWrite(Rele1, LOW);
  } else {                                        // valor else para que cuando se vuelva a temperatura estable apaga el ventilador y los motores vuelcan a su posicion
    servo1.write(65);
    servo2.write(90);
    digitalWrite(Rele1, HIGH);
  }




También tienes otro delay de 2 seg al comienzo del loop.
En general en un invernadero las cosas ocurren lentamente, pero, puede haber algún evento que exija atención inmediata.

Post corregido capitán! :wink: :smiley:

el delay de 10 segundos que mencionas es necesario ya que quien me esta asesorando en cuestión al invernadero y la condición de las plantas me dijo que seria buena idea que el ventilador entrara unos 10 segundos después, no estudiado mucho millis, ¿podría hacer lo mismo?

y el delay de 2 segundos no lo había visto :confused: menos mal que me corregiste, lo deje botado sin saber por que :o

Ahh veo que no entendiste lo que quise decir.
Yo no cuestiono el retardo, si el uso de delay.
Delay detiene el flujo del programa. Por ahora tu programa funciona bien y tal vez mi sugerencia (solo es eso) no tenga sentido alguno. Solo si crece tu programa y requieres atender cosas con velocidad considera que tu programa tal como esta durante esos 10 segundos no atiende mas nada al igual que el retardo de 2 segundos que existe cuando lee los sensores.

Solo es para tenerlo presente si hiciera falta.

surbyte:
Ahh veo que no entendiste lo que quise decir.
Yo no cuestiono el retardo, si el uso de delay.
Delay detiene el flujo del programa. Por ahora tu programa funciona bien y tal vez mi sugerencia (solo es eso) no tenga sentido alguno. Solo si crece tu programa y requieres atender cosas con velocidad considera que tu programa tal como esta durante esos 10 segundos no atiende mas nada al igual que el retardo de 2 segundos que existe cuando lee los sensores.

Solo es para tenerlo presente si hiciera falta.

Podrías ilustrarme con un ejemplo? :slight_smile:

julioesca me puedes dar mas informacion si lo culminaste me interesa hacer uno igual

No has visto que el hilo es del 2016?
Crea un hilo nuevo y si no sabes por favor no empieces por esta sección, comienza por dudas mas simples.
Hilo cerrado.
Lee las normas del foro