Como sensores utilizaron el sensor de luz UV LTR 390 de Adafruit con comunicación por I2C, el sensor digital de temperatura y humedad DHT22 y un sensor de humedad del suelo Gravity Capacitive soil moisture sensor v1.0.
Para el control de las condiciones ambientales del invernadero utilizaron tres actuadores: una tira de leds UV para aumentar la iluminación cundo el sensor detecta iluminación baja, una bomba de agua para el riego cuando la humedad del suelo es baja y un ventilador para aumentar el flujo de aire cuando la temperatura en el interior del invernadero es alta. Los tres actuadores los controlaron a través de relés con lógica inversa. Esto quiere decir que se activan con una señal LOW del microcontrolador Arduino y se desactivan con una señal HIGH. Por esta razón en la parte de configuración del programa (void setup) se sitúan los tres pines que controlan estos relés (3,4,5) en posición HIGH, para que queden desactivados.
El programa para el controlador Arduino es el siguiente:
El sensor LTR 390 de Adafruit se comunica con Arduino mediante un puerto I2C que tiene cuatro cables, dos para la alimentación eléctrica (rojo y negro), uno para el pin SCL (amarillo) y otro para el pin SDA (azul).
Reconstrucción del invernadero
Con los materiales de este proyecto posteriormente hemos diseñado un modelo de invernadero más pequeño y manejable para realizar prácticas de programación.
A continuación podemos ver un programa creado para comprobar el funcionamiento del sensor DHT22 conectado en el pin 2.
El programa listado es el siguiente:
#include "DHT.h"
#define DHTPIN 2#define DHTTYPE DHT22DHT dht(DHTPIN, DHTTYPE);void setup() {Serial.begin (9600);dht.begin();}void loop() {delay(2000);float t = dht.readTemperature ();float h = dht.readHumidity();Serial.print("Temperatura: ");Serial.print(t);Serial.println(" ºC ");Serial.print("Humedad ");Serial.print(h);Serial.println(" %");}
Configuración para medir nivel de infrarrojos
Ahora vamos a añadir un poco más de código para incluir el sensor LTR390. uint32_t indica el tipo de variable de ltr_index. Esta variable ocupa 4 bytes en un número entero entre 0 y 4294967295.
#define DHTPIN 2#include "DHT.h"DHT dht(DHTPIN, DHTTYPE);#define DHTTYPE DHT22Adafruit_LTR390 ltr = Adafruit_LTR390 ();#include "Adafruit_LTR390.h"
void setup() {Serial.begin (9600);dht.begin();ltr.begin();ltr.setMode(LTR390_MODE_UVS);ltr.setGain(LTR390_GAIN_3);ltr.setResolution(LTR390_RESOLUTION_16BIT);ltr.setThresholds (100, 1000);ltr.configInterrupt(true, LTR390_MODE_UVS);}
void loop() {delay(2000);float t = dht.readTemperature ();float h = dht.readHumidity();Serial.print("Temperatura: ");Serial.print(t);Serial.println(" ºC ");Serial.print("Humedad ");Serial.print(h);Serial.println(" %");uint32_t ltr_index = ltr.readUVS();Serial.print("Valor UVS: ");Serial.println(ltr.readUVS());Serial.print("UV Index: ");Serial.println(ltr_index);}
Temperatura: 19.30 ºCHumedad 52.60 %Valor UVS: 0UV Index: 0Temperatura: 19.30 ºCHumedad 52.60 %Valor UVS: 0UV Index: 0Temperatura: 19.30 ºCHumedad 52.50 %Valor UVS: 0UV Index: 0
Si retiramos en el sensor uno de los cables del puerto serie Arduino no puede identificar la información que no le llega y nos proporciona un mensaje de error, el número 4294967295. Nos devuelve el mismo valor de error si quitamos uno de los cables de alimentación (VIN o GND).
Temperatura: 19.20 ºCHumedad 52.60 %Valor UVS: 4294967295UV Index: 4294967295Temperatura: 19.20 ºCHumedad 52.60 %Valor UVS: 4294967295UV Index: 4294967295
Si en el programa retiramos la línea ltr.begin(); nos vuelve a enviar el valor 4294967295 al no poner en marcha el sensor LTR390.
#define DHTPIN 2#include "DHT.h"DHT dht(DHTPIN, DHTTYPE);#define DHTTYPE DHT22Adafruit_LTR390 ltr = Adafruit_LTR390 ();#include "Adafruit_LTR390.h"void setup() {Serial.begin (9600);dht.begin();ltr.setMode(LTR390_MODE_UVS);ltr.setGain(LTR390_GAIN_3);ltr.setResolution(LTR390_RESOLUTION_16BIT);ltr.setThresholds (100, 1000);ltr.configInterrupt(true, LTR390_MODE_UVS);}void loop() {delay(2000);float t = dht.readTemperature ();float h = dht.readHumidity();Serial.print("Temperatura: ");Serial.print(t);Serial.println(" ºC ");Serial.print("Humedad ");Serial.print(h);Serial.println(" %");uint32_t ltr_index = ltr.readUVS();Serial.print("Valor UVS: ");Serial.println(ltr.readUVS());Serial.print("UV Index: ");Serial.println(ltr_index);}
Ahora lo que obtenemos en el monitor del puerto serie también es:
Temperatura: 19.20 ºCHumedad 52.60 %Valor UVS: 4294967295UV Index: 4294967295Temperatura: 19.20 ºCHumedad 52.60 %Valor UVS: 4294967295UV Index: 4294967295
En el siguiente programa el condicional existente en el setup inicializa el sensor LTR390 y si no lo encuentra envía al monitor del puerto serie un mensaje indicando este particular.
#include "DHT.h"#define DHTPIN 2#define DHTTYPE DHT22DHT dht(DHTPIN, DHTTYPE);#include "Adafruit_LTR390.h"Adafruit_LTR390 ltr = Adafruit_LTR390 ();void setup() {Serial.begin (9600);dht.begin();if (!ltr.begin()) {Serial.println("El sensor LTR390 no está conectado");}ltr.setMode(LTR390_MODE_UVS);ltr.setGain(LTR390_GAIN_3);ltr.setResolution(LTR390_RESOLUTION_16BIT);ltr.setThresholds (100, 1000);ltr.configInterrupt(true, LTR390_MODE_UVS);}void loop() {delay(2000);float t = dht.readTemperature ();float h = dht.readHumidity();Serial.print("Temperatura: ");Serial.print(t);Serial.println(" ºC ");Serial.print("Humedad ");Serial.print(h);Serial.println(" %");uint32_t ltr_index = ltr.readUVS();Serial.print("Valor UVS: ");Serial.println(ltr.readUVS());Serial.print("UV Index: ");Serial.println(ltr_index);}
En el caso de que el sensor LTR390 tenga algún problema veremos esto en el monitor del puerto serie:
El sensor LTR390 no está conectadoTemperatura: 19.50 ºCHumedad 50.40 %Valor UVS: 4294967295UV Index: 4294967295Temperatura: 19.50 ºCHumedad 50.40 %Valor UVS: 4294967295UV Index: 4294967295
Configuración para medir nivel de luz
En la configuración del sensor LTR390 se ha de elegir el modo ALS que mide el nivel de luz del ambiente. Para medirlo se ha de usar el comando readALS.
#include "DHT.h"#define DHTPIN 2#define DHTTYPE DHT22DHT dht(DHTPIN, DHTTYPE);#include "Adafruit_LTR390.h"Adafruit_LTR390 ltr = Adafruit_LTR390 ();void setup() {Serial.begin (9600);dht.begin();if (!ltr.begin()) {Serial.println("El sensor LTR390 no está conectado");}ltr.setMode(LTR390_MODE_ALS);ltr.setGain(LTR390_GAIN_3);ltr.setResolution(LTR390_RESOLUTION_16BIT);ltr.setThresholds (100, 1000);ltr.configInterrupt(true, LTR390_MODE_UVS);}void loop() {delay(2000);float t = dht.readTemperature ();float h = dht.readHumidity();Serial.print("Temperatura: ");Serial.print(t);Serial.println(" ºC ");Serial.print("Humedad ");Serial.print(h);Serial.println(" %");uint32_t ltr_index = ltr.readALS();Serial.print("Valor ALS: ");Serial.println(ltr.readALS());Serial.print("ALS Index: ");Serial.println(ltr_index);}
En el monitor del puerto serie se puede ver algo similar a esto:
Temperatura: 19.90 ºCHumedad 56.20 %Valor ALS: 10UV Index: 10Temperatura: 19.90 ºC
Humedad 56.20 %Valor ALS: 15ALS Index: 15
Programa para medir nivel de luz y de infrarrojos
En el siguiente programa se ha eliminado gran parte de la configuración del LTR390 y nos devuelve información del nivel de luz y de infrarrojos.
#include "DHT.h"#define DHTPIN 2#define DHTTYPE DHT22DHT dht(DHTPIN, DHTTYPE);#include "Adafruit_LTR390.h"Adafruit_LTR390 ltr = Adafruit_LTR390 ();void setup() {Serial.begin (9600);dht.begin();ltr.begin();}void loop() {delay(2000);float t = dht.readTemperature ();float h = dht.readHumidity();Serial.print("Temperatura: ");Serial.print(t);Serial.println(" ºC ");Serial.print("Humedad ");Serial.print(h);Serial.println(" %");Serial.print("Valor LUZ: ");Serial.println(ltr.readALS());Serial.print("Valor UV: ");Serial.println(ltr.readUVS());}
En el monitor del puerto serie se puede ver algo similar a esto:
Temperatura: 20.40 ºCHumedad 55.70 %Valor LUZ: 21Valor UV: 0Temperatura: 20.40 ºCHumedad 55.70 %Valor LUZ: 21Valor UV: 0
No hay comentarios:
Publicar un comentario