Programa de huerto domótico.
// Programa realizado por Diego Bote para domotizar el huerto// del IES Carolina Coronado de Almendralejo.// El programa se escribe tomando de aquí y de allí por internet,// retocando y creando lo que ha sido neceesario.#include <OneWire.h>#include <DallasTemperature.h>const int oneWirePin = 5;OneWire oneWireBus(oneWirePin);DallasTemperature sensors(&oneWireBus);DeviceAddress Thermometer0 = { 0x28, 0x96, 0x92, 0xC3, 0x0D, 0x00, 0x00, 0x88 }; // 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };// DeviceAddress outsideThermometer = { 0x28, 0xF2, 0xCE, 0xC4, 0x0D, 0x00, 0x00, 0xA5 }; //0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };DeviceAddress Thermometer1 = { 0x28, 0xE6, 0xDF, 0xDE, 0x0D, 0x00, 0x00, 0xB0 };#include <DHT.h>//Incluyo la librería del sensor DHT11 de humedad y temperatura.#include <Wire.h> // Incluyo la librería para usar I2C, esto es SDA y SCL.////////////////////////////////Para la pantalla LCD#include <LiquidCrystal_I2C.h> // Debe descargar la Libreria que controla el I2CLiquidCrystal_I2C lcd(0x27, 20, 4); //SI no va, se puede poner 0x20 para probar//el modulo es de 16 por 2. el protocolo es 0x27. si no va, probar con 0x20//Pines del módulo I2C//VCC GND SON LA TENSIÓN Y LA TIERRA//SDA VA AL A4//SCL VA AL A5//////////////////////////Configuro pines y variablesint sensor0 = 2;//Pin 2 para el valor del sensor DHT11 del huerto 0int sensor1 = 3;//Pin 3 para el valor del sensor DHT11 del huerto 1int temp0, humedad0;//Configuro las variables de temperatura y humedad del DHT11 del huerto 0.int temp1, humedad1;//Configuro las variables de temperatura y humedad del DHT11 del huerto 1.//int boton = 4;//Pin 4 para activar manualmente la bomba // Ese botón no está.// const int nivel = 9; //Pin 9 para medir el nivel de agua // Que no hay medidor de nivel de agua.const int bomba1 = 13; //Pin 13 para la bomba1const int bomba0 = 12; //Pin 12 para la bomba0const int resis1 = 11; //Pin 11 para la resistencia calefactora 1const int resis0 = 10; //Pin 10 para la resistencia calefactora 0const int humedadsuelo0 = A0; //A0 para la humedad del suelo del huerto 0const int humedadsuelo1 = A1; //A1 para la humedad del suelo del huerto 1const int dry = 625; // value for dry sensorconst int wet = 239; // value for wet sensorint tempminimasuelo = 18;float tempC; // temperatura del sensor de tierra solicitadoDHT dht0 (sensor0, DHT11);//Configuro el modelo de DHT. Es el DHT11 del huerto 0DHT dht1 (sensor1, DHT11);//Configuro el modelo de DHT. Es el DHT11 del huerto 1// int botonest = 0; //Inicializamos a 0 el estado del boton // El botón de riego manual no está.///////////////////////////////Parte de humedad suelo y riegovoid setup(){Serial.begin(9600);//Arrancamos el puerto serie a 9600sensors.begin();sensors.setResolution(Thermometer0, 10);sensors.setResolution(Thermometer1, 10);dht0.begin();//Arranco el sensor DHT11dht1.begin();//Arranco el sensor DHT11//Configuramos entradas y salidaspinMode(humedadsuelo0, INPUT);//Configuro humedadsuelo0 como entradapinMode(humedadsuelo1, INPUT);//Configuro humedadsuelo1 como entradapinMode(bomba0, OUTPUT);//Configuro bomba0 como salidapinMode(bomba1, OUTPUT);//Configuro bomba1 como salidapinMode(resis0, OUTPUT);//Configuro resis0 como salidapinMode(resis1, OUTPUT);//Configuro resis1 como salida// pinMode(nivel, INPUT);//Configuro el nivel de agua como entrada // No hay sensor de nivel de agua.// pinMode(boton, INPUT);//Configuro el boton como entrada // No hay botón de riego manual//Para la pantalla LCDlcd.init(); //Inicializamos el LCDlcd.backlight(); //Activamos la luz de fondolcd.clear(); //Limpiamos lo que haya en pantallalcd.setCursor(0, 0); //Iniciamos el cursor en el punto 0,0}void printTemperature(DeviceAddress deviceAddress){// float tempC = sensors.getTempC(deviceAddress);tempC = sensors.getTempC(deviceAddress);if (tempC == -127.00) {Serial.print("Error getting temperature");} else {Serial.print(tempC);Serial.println(" ºC");}}void loop(){Serial.println("Leyendo temperaturas");sensors.requestTemperatures();Serial.print("Temperatura del suelo del huerto 0: ");printTemperature(Thermometer0);//Serial.print(sensors.getTempCByIndex(0));Serial.print("Temperatura del suelo del huerto 1: ");printTemperature(Thermometer1);//Serial.print(sensors.getTempCByIndex(1));Serial.println("-------");//delay(2000);int SensorValue0 = analogRead(humedadsuelo0);//Leo el valor de la humedad y lo meto en SensorValue0int SensorValue1 = analogRead(humedadsuelo1);//Leo el valor de la humedad y lo meto en SensorValue1//Serial.print("Humedad del suelo del huerto 0: ");//Serial.println(SensorValue0);//Serial.print("Humedad del suelo del huerto 1: ");//Serial.print(SensorValue1);// int SensorNivel = digitalRead(nivel); //Leo lo que marca el nivel de agua, pero no hay sensor para ello.// int botonest = digitalRead(boton);//Leo lo que marca el boton que no está puesto// digitalWrite(bomba, HIGH);// delay(2000);// digitalWrite(bomba, LOW);//Convertir la humedad en %.// int sensorVal0 = analogRead(A0);int percentageHumidity0 = map(SensorValue0, wet, dry, 100, 0);Serial.print("valor del sensor de humedad0: ");Serial.println(SensorValue0);//Serial.println("%");Serial.print("valor de porcentaje de humedad0: ");Serial.print(percentageHumidity0);Serial.println("%");// int sensorVal = analogRead(A0);int percentageHumidity1 = map(SensorValue1, wet, dry, 100, 0);Serial.print("valor del sensor de humedad1: ");Serial.println(SensorValue1);Serial.print("valor de porcentaje de humedad1: ");Serial.print(percentageHumidity1);Serial.println("%");//delay(1000);//Leo los DHT11 y meto los valores de temperatura y humedad en las variables temp y humedadhumedad0 = dht0.readHumidity();temp0 = dht0.readTemperature();humedad1 = dht1.readHumidity();temp1 = dht1.readTemperature();if (isnan(humedad0) || isnan(temp0) || isnan(humedad1) || isnan(temp1)) {Serial.println(F("Failed to read from DHT sensor!"));return;}// Compute heat index in Fahrenheit (the default)// float hif = dht.computeHeatIndex(f, h);// Compute heat index in Celsius (isFahreheit = false)// float hic = dht.computeHeatIndex(t, h, false);/////Puerto serie//Imprimo por el puerto serie los valores de temperatura y humedad del DHT11Serial.print("Temperatura en el huerto 0: "); Serial.print(temp0);Serial.print("ºC. Humedad en el huerto 0: "); Serial.print(humedad0); Serial.println("%");Serial.print("Temperatura en el huerto 1: "); Serial.print(temp1);Serial.print("ºC Humedad en el huerto 1: "); Serial.print(humedad1); Serial.println("%");//Imprimo por el puerto serie el valor de la humedad del sueloSerial.print("Humedad del suelo del huerto 0: "); Serial.print(percentageHumidity0); Serial.println("%");Serial.print("Humedad del suelo del huerto 1: "); Serial.print(percentageHumidity1); Serial.println("%");//delay(5000);/////Para mostrarlo en el LCDlcd.init(); //Inicializamos el LCDlcd.backlight(); //Activamos la luz de fondolcd.clear();//blanqueamos la pantallalcd.setCursor(2, 0); //Posicion: columna 2 fila cerolcd.print("Carolina Coronado");lcd.setCursor(5, 2);lcd.print("Proyecto de");lcd.setCursor(3, 3);lcd.print("Huerto domotico");delay(4000);lcd.clear();lcd.setCursor(0, 0);lcd.print("Temp.ambiente:");lcd.setCursor(0,1);lcd.print("DHT:H0:");lcd.print(temp0);lcd.print("C ");//lcd.setCursor(14, 0);lcd.print("H1:");lcd.print(temp1);lcd.print("C");lcd.setCursor(0, 2);lcd.print("Hum. ambiente:");lcd.setCursor(0,3);lcd.print("Hum.:H0:");lcd.print(humedad0);lcd.print("% ");//lcd.setCursor(14, 1);lcd.print("H1:");lcd.print(humedad1);lcd.print("%");delay(10000);lcd.clear();lcd.setCursor(0, 0); //Posicion: columna cero fila unolcd.print("Humedad Suelo:");lcd.setCursor(0,1);lcd.print("H0:");//lcd.print(SensorValue0);lcd.print(percentageHumidity0);lcd.print("% ");//lcd.setCursor(15, 2); //Posicion: columna cero fila//lcd.print(SensorValue1);lcd.print("H1:");lcd.print(percentageHumidity1);lcd.print("%");lcd.setCursor(0, 2);lcd.print("Temp. suelo:");lcd.setCursor(0,3);printTemperature(Thermometer0);lcd.print("H0:");lcd.print(tempC);lcd.print("C ");printTemperature(Thermometer1);lcd.print("H1:");lcd.print(tempC);lcd.print("C");// lcd.print("Imprimiendo esto.");delay(10000);lcd.clear();/*//esto si quiero que la pantalla vaya de izquierda a derecha.for(int c=0;c<12;c++){ //hace una secuencia hacia la izquierda y luego hacia la derecha, por 12 pasoslcd.scrollDisplayLeft();delay(600); }for(int c=0; c<12;c++){lcd.scrollDisplayRight();delay(600); }lcd.clear();//blanqueamos la pantalla*//*if (SensorNivel == 0 && botonest == 1){ Serial.println("Nivel bajo de Agua. Rellenar el tanque");lcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Nivel bajo agua");lcd.setCursor(0, 1); //Posicion: columna cero fila cerolcd.print("Rellenar tanque");delay (2000);lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("DHT:");lcd.print(temp0);lcd.print("C/");lcd.print(humedad0);lcd.print("%");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print("HS:");lcd.print(SensorValue0);lcd.print("%");delay (5000);}*/// Vamos a encender las resistencias necesarias para tener la tierra de las plantas a la temperatura adecuada.//Huerto 0.printTemperature(Thermometer0);//if ( tempC < 28.0 )if ( int(tempC) < tempminimasuelo ){lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Temp suelo H0");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print(tempC);//lcd.print(SensorValue0);//lcd.print(percentageHumidity1);lcd.print(" C");lcd.setCursor(0, 2);lcd.print("Calefactando");digitalWrite(resis0, HIGH); // Enciende la resistencia del huerto 0.delay(4000); // La mantiene encendida durante 4 segundos.digitalWrite(resis0, LOW); //la vuelve a apagar.lcd.clear();}//Huerto 1.printTemperature(Thermometer1);if ( int(tempC) < tempminimasuelo ){lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Temp suelo H1");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print(tempC);//lcd.print(SensorValue0);//lcd.print(percentageHumidity1);lcd.print(" C");lcd.setCursor(0, 2);lcd.print("Calefactando");digitalWrite(resis1, HIGH); // Enciende la resistencia del huerto 1.delay(4000); // La mantiene encendida durante 4 segundos.digitalWrite(resis1, LOW); //la vuelve a apagar.lcd.clear();}/*if (SensorValue1 >= 700) // el valor que considero seco y hay que regar es de 700{// Si la tierra está seca, comenzara a regar// Riega durante 4 segundoS y espera a comprobar la humedad otro segundoSerial.println("La tierra del huerto 1 está seca, comienza el riego automático");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Riego automatico del huerto 1");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print("HS:");//lcd.print(SensorValue0);lcd.print(percentageHumidity1);lcd.print("%");digitalWrite(bomba1, HIGH);delay(4000);digitalWrite(bomba1, LOW);delay(1000);*//* mientras no haya botón puesto no tiene sentido este párrafoif (botonest == 0){ Serial.println("No se puede activar riego manual. Riego automático activo");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Regando automatico");lcd.setCursor(0, 1); //Posicion: columna cero fila cerolcd.print("NO MANUAL");delay(1000);}*/// }/*if (SensorNivel == 0 && botonest == 0){ Serial.println("Imposible regar, nivel bajo de agua. Debe rellenar el tanque");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("IMPOSIBLE REGAR");lcd.setCursor(0, 1); //Posicion: columna cero fila cerolcd.print("Nivel bajo");}*/// if (SensorNivel == 1)// {// Serial.println("Nivel de agua correcto, se puede regar");// Regar o no el huerto 0.if (SensorValue0 >= dry) // el valor que considero seco y hay que regar es de 700{// Si la tierra está seca, comenzara a regar// Riega durante 2 segundoS y espera a comprobar la humedad otro segundoSerial.println("La tierra está seca, comienza el riego automático");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Riego automatico H0:");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print("Humedad Suelo 0: ");//lcd.print(SensorValue0);lcd.print(percentageHumidity0);lcd.print("%");digitalWrite(bomba0, HIGH);delay(4000);digitalWrite(bomba0, LOW);// delay(1000);/* mientras no haya botón puesto no tiene sentido este párrafoif (botonest == 0){ Serial.println("No se puede activar riego manual. Riego automático activo");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Regando automatico");lcd.setCursor(0, 1); //Posicion: columna cero fila cerolcd.print("NO MANUAL");delay(1000);}*/}/* if (SensorValue0 < 700) //No es necesario el riego automático, pero se puede regar de forma manual{if (botonest == 0) {Serial.println("Regando de forma manual");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Riego manual");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print("HS:");lcd.print(SensorValue0);lcd.print("%");digitalWrite(bomba0, HIGH);}if (botonest == 1) {digitalWrite(bomba0, LOW);}}*///Ahora el otro huerto, el 1.if (SensorValue1 >= dry) // el valor que considero seco y hay que regar es de 700{// Si la tierra está seca, comenzara a regar// Riega durante 4 segundoS y espera a comprobar la humedad otro segundoSerial.println("La tierra del huerto 1 está seca, comienza el riego automático");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Riego automatico H1:");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print("Humedad Suelo 1: ");//lcd.print(SensorValue0);lcd.print(percentageHumidity1);lcd.print("%");digitalWrite(bomba1, HIGH);delay(4000);digitalWrite(bomba1, LOW);//delay(1000);/* mientras no haya botón puesto no tiene sentido este párrafoif (botonest == 0){ Serial.println("No se puede activar riego manual. Riego automático activo");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Regando automatico");lcd.setCursor(0, 1); //Posicion: columna cero fila cerolcd.print("NO MANUAL");delay(1000);}*/}/* if (SensorValue0 < 700) //No es necesario el riego automático, pero se puede regar de forma manual{if (botonest == 0) {Serial.println("Regando de forma manual");lcd.clear();//blanqueamos la pantallalcd.setCursor(0, 0); //Posicion: columna cero fila cerolcd.print("Riego manual");lcd.setCursor(0, 1); //Posicion: columna cero fila unolcd.print("HS:");lcd.print(SensorValue0);lcd.print("%");digitalWrite(bomba0, HIGH);}if (botonest == 1) {digitalWrite(bomba0, LOW);}}*/// } // Esta llave va con el if de SensorNivel de más arriba para comprobar el niver de agua antes de regar. Hay que comprar un sensor de nivel de agua.}
Que programado en arduino hace la magia de poner todo a funcionar.