commit eca57217e8fba03aafb337d925e1be12a73349d2 Author: jp.av.dev Date: Thu Jul 16 01:59:44 2020 -0400 Inicio Repositorio BabylonGardener diff --git a/BabylonGardener-RELEASE-1.0.0.ino b/BabylonGardener-RELEASE-1.0.0.ino new file mode 100644 index 0000000..6ee16d2 --- /dev/null +++ b/BabylonGardener-RELEASE-1.0.0.ino @@ -0,0 +1,1114 @@ +//MANEJAR EXCEPCIONES de sensado. +#include +#include +#include +#include +#include +#include +#include "globales.h" +//#include +//SoftwareSerial esp(0,1); +DHT dhtSup(DHTPINSUP, DHTTYPE); +DHT dhtInf(DHTPININF, DHTTYPE); +LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //I2C address [0x27 o 0x3F] +DateTime fecha; +RTC_DS3231 reloj; + +void setup() { + corrMins=59; // minutos de retraso + 55 (siempre que el retraso sea menor que 5 minutos) + corrSegs=38; // segundos de retraso + estado = 1;//escritura=1; + pinMode(btn1, INPUT); + pinMode(btn2, INPUT); + pinMode(relLuz, OUTPUT); + pinMode(relVentEx, OUTPUT); + pinMode(relVentIn, OUTPUT); + pinMode(relBomb, OUTPUT); + digitalWrite(relLuz,1);// 1 = releOff / 0 = releON + digitalWrite(relVentEx,1); + digitalWrite(relVentIn,1); + digitalWrite(relBomb,1); + riegoManual=false; + lcdON = 1; + varControl();//Carga valores a variables de control + lcd.begin(20,4); + lcd.createChar(1, grado); + lcd.createChar(2, gota); + lcd.createChar(3, luz); + lcd.createChar(4, vent); + lcd.createChar(5, luma); + dhtSup.begin(); + dhtInf.begin(); + if(!reloj.begin()) { + lcd.setCursor(1,5); + lcd.print(F("RTC no encontrado")); + //lcd.setCursor(2,4); + //lcd.print(F("no encontrado")); + //return; // para cancelar la ejecucion + } + if(!SD.begin(CS)) { + lcd.clear(); + lcd.setCursor(1,2); + lcd.print(F("Tarjeta MicroSD")); + lcd.setCursor(2,4); + lcd.print(F("no encontrada")); + //return; // para cancelar la ejecucion + } + File archivo = SD.open("registro.csv", FILE_WRITE); + archivo.println(F("Fecha-Hora,Humedad A,Humedad B,Humedad C,Humedad D,Humedad-Superior,Humedad-Inferior,Temperatura-Superior,Temperatura-Inferior")); + archivo.close(); + lcd.clear(); + //Ajustar fecha y hora segun hora de compliacion + //reloj.adjust(DateTime(__DATE__, __TIME__)); +} + +void loop() { + actualMillis = millis(); + switch (estado) { + case 1: + if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) { + fecha = reloj.now(); + tomaDatos(); //MANEJAR EXCEPCIONES// + horaLCD(); + selecMOD(); + releLuz(); + releVentEx(); // Rele:Extractor(N.A.)+VentiladorInterno(N.C.) <--segun Temperatura DHT + releVentIn(); // Rele:Intractor(N.A.) <-- segun Humedad DHT; + releBomba(); + guardarSD(); // guarda los datos de sensores en microSD + correcHora(); // Correccion horaria por desface RTC + previoMillisLoop = millis();// guarda tiempo "actual" + } + leerBotones(); + break; + case 2: + if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) { + fecha = reloj.now(); + lcd.clear(); + lcd.print(F("Modificar fecha/hora")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 para aceptar")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 para salir")); + lcd.setCursor(0,3); + lcd.print(fecha.day()); + lcd.print('/'); + lcd.print(fecha.month()); + lcd.print('/'); + lcd.print(fecha.year()); + lcd.setCursor(11,3); + if(fecha.hour()>6&&fecha.hour()<20) { + lcd.write(3); + } else { + lcd.write(5); + } + lcd.setCursor(12,3); + lcd.print(getHora('h')); + lcd.print(':'); + lcd.print(getHora('m')); + if(cursor) { + lcd.print(':'); + } else { + lcd.print(" "); + } + lcd.print(getHora('s')); + cursor=!cursor; + previoMillisLoop = millis(); + } + leerBotones(); + break; + case 3: + if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) { + lcd.clear(); + lcd.print(F("Modificar Modo/Riego")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 para aceptar")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 para salir")); + lcd.setCursor(0,3); + lcd.print(F("MODO")); + impModo(); + lcd.setCursor(13,3); + lcd.write(2); + lcd.print(':'); + lcd.print(minutosRiego); + lcd.print(F("mins")); + previoMillisLoop = millis(); + } + leerBotones(); + break; + case 4: + if ((unsigned long)(actualMillis - previoMillisLoop) >= intervalo_loop) { + lcd.clear(); + lcd.print(F("++Config. Avanzada++")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 para entrar")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 para salir")); + lcd.setCursor(0,3); + lcd.print(F("11VariablesDeControl")); + previoMillisLoop = millis(); + } + leerBotones(); + break; + default: + estado=1; + break; + } +} + +void leerBotones() { + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)&&digitalRead(btn2)) { + if(lcdON) { + lcd.noBacklight(); + lcdON=0; + previoMillisBoton=millis(); + } else { + lcd.backlight(); + lcdON=1; + previoMillisBoton=millis(); + } + } else { + if(digitalRead(btn1)) { + switch(estado) { + case 1: + previoMillisBoton=millis(); + riegoManual = !riegoManual; + break; + case 2: + previoMillisBoton=millis(); + configFecha(); + break; + case 3: + previoMillisBoton=millis(); + config3(); + break; + case 4: + previoMillisBoton=millis(); + config4(); + break; + } + } + // Mejorar control de estado=estado+1(bug al volver a modificar las variables en cualquier estado, limpia LCD y espera pulsacion) + if(digitalRead(btn2)) { + estado+=1; + if(estado>4) { + estado=1; + lcd.clear(); + } + previoMillisBoton=millis(); + } + } + } +} + +//Funcion para usar el Boton2 como ENTER +bool boton2enter() { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_loop ) { + if(digitalRead(btn2)) { + previoMillisBoton=millis(); + return 1; + } + return 0; + } else { + return 0; + } +} + +//desde EEPROM +void varControl() { + //Ajustar segun caudal y tiempo de respuesta sensores humedad en macetas. + minutosRiego = EEPROM.read(dirMINSRIEGO); //EEPROM.put(dirMINSRIEGO, minutosRiego); + modo = EEPROM.read(dirMODO); //EEPROM.put(dirMODO, modo); + intSens = EEPROM.read(dirINTSENS); //EEPROM.put(dirINTSENS, intSens); + humedadMIN = EEPROM.read(dirHUMMIN); //EEPROM.put(dirHUMMIN, humedadMIN); + humedadMAX = EEPROM.read(dirHUMMAX); //EEPROM.put(dirHUMMAX, humedadMAX); + rangoT = EEPROM.read(dirRANGOT); //EEPROM.put(dirRANGOT, rangoT); + tempSupMIN = EEPROM.read(dirTSUPMIN); //EEPROM.put(dirTSUPMIN, tempSupMIN); + tempSupMAX = EEPROM.read(dirTSUPMAX); //EEPROM.put(dirTSUPMAX, tempSupMAX); + tempInfMIN = EEPROM.read(dirTINFMIN); //EEPROM.put(dirTINFMIN, tempInfMIN) + tempInfMAX = EEPROM.read(dirTINFMAX); //EEPROM.put(dirTINFMAX, tempInfMAX); + humSupMIN = EEPROM.read(dirHUMSUPMIN); //EEPROM.put(dirHUMSUPMIN, humSupMIN); + humSupMAX = EEPROM.read(dirHUMSUPMAX); //EEPROM.put(dirHUMSUPMAX, humSupMAX); + humInfMIN = EEPROM.read(dirHUMINFMIN); //EEPROM.put(dirHUMINFMIN, humInfMIN); + humInfMAX = EEPROM.read(dirHUMINFMAX); //EEPROM.put(dirHUMINFMAX, humInfMAX); +} + +//Sensar Humedad * REVISAR CAST +byte sensarHumedad(byte sensor) { + humTemp=0; + for(byte x=0;x<10;x++){ + humTemp += map(analogRead(sensor), 0, 1023, 0, 99); + } + humTemp=(humTemp/10); + return (byte)humTemp;//Probar si es necesario el 'Cast' +} + +void dhtLCD() { + //primera linea + lcd.setCursor(0, 0); + lcd.print(F("T:")); + lcd.print(tempSup); + lcd.setCursor(6, 0); + lcd.write(1); + lcd.print(F("C H:")); + lcd.print(humSup); + lcd.print('%'); + //segunda linea + lcd.setCursor(0, 1); + lcd.print(F("T:")); + lcd.print(tempPro); + lcd.setCursor(6, 1); + lcd.write(1); + lcd.print(F("C H:")); + lcd.print(humProm); + lcd.print('%'); + //tercera linea + lcd.setCursor(0, 2); + lcd.print(F("T:")); + lcd.print(tempInf); + lcd.setCursor(6, 2); + lcd.write(1); + lcd.print(F("C H:")); + lcd.print(humInf); + lcd.print('%'); +} + +//Muestra datos de los 4 sensores humedad de macetas en LCD +void HumTierraLCD() { + lcd.setCursor(0, 3); + lcd.print(F("A:")); + lcd.print(hum1); + lcd.setCursor(4, 3); + lcd.print(F(" B:")); + lcd.print(hum2); + lcd.setCursor(9, 3); + lcd.print(F(" C:")); + lcd.print(hum3); + lcd.setCursor(14, 3); + lcd.print(F(" D:")); + lcd.print(hum4); +} + +void tomaDatos() { + if ((unsigned long)(actualMillis - previoMillisSens) >= intervalo_sensado) { + hum1 = sensarHumedad(sHum1); + hum2 = sensarHumedad(sHum2); + hum3 = sensarHumedad(sHum3); + hum4 = sensarHumedad(sHum4); + datosDHT(); + dhtLCD(); + HumTierraLCD(); + previoMillisSens = millis(); + } +} + +//VERIFICAR variables elimin +void config4() { + // Pantalla config avanzada var 1-9 + actualMillis=millis(); + lcd.clear(); + lcd.print("1:"); + lcd.print(humedadMIN); + lcd.setCursor(4,0); + lcd.print("<-"); + lcd.setCursor(7,0); + lcd.print("2:"); + lcd.print(humedadMAX); + lcd.setCursor(14,0); + lcd.print("3:"); + lcd.print(rangoT); + lcd.setCursor(0,1); + lcd.print("4:"); + lcd.print(tempSupMIN); + lcd.setCursor(7,1); + lcd.print("5:"); + lcd.print(tempSupMAX); + lcd.setCursor(14,1); + lcd.print("6:"); + lcd.print(tempInfMIN); + lcd.setCursor(0,2); + lcd.print("7:"); + lcd.print(tempInfMAX); + lcd.setCursor(7,2); + lcd.print("8:"); + lcd.print(humSupMIN); + lcd.setCursor(14,2); + lcd.print("9:"); + lcd.print(humSupMAX); + lcd.setCursor(0,3); + lcd.print(F("boton1:+|boton2:sgte")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + humedadMIN += 1; + if(humedadMIN > 70){ + humedadMIN=10; + } + lcd.setCursor(2,0); + lcd.print(humedadMIN); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(4,0); + lcd.print(" "); + lcd.setCursor(11,0); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + humedadMAX += 1; + if(humedadMAX > 99){ + humedadMAX=60; + } + lcd.setCursor(9,0); + lcd.print(humedadMAX); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(11,0); + lcd.print(" "); + lcd.setCursor(18,0); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + rangoT += 1; + if(rangoT > 9){ + rangoT=1; + } + lcd.setCursor(16,0); + lcd.print(rangoT); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(18,0); + lcd.print(" "); + lcd.setCursor(4,1); + lcd.print("<-"); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + tempSupMIN += 1; + if(tempSupMIN > 20){ + tempSupMIN=15; + } + lcd.setCursor(2,1); + lcd.print(tempSupMIN); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(4,1); + lcd.print(" "); + lcd.setCursor(11,1); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + tempSupMAX += 1; + if( tempSupMAX > 35){ + tempSupMAX=25; + } + lcd.setCursor(9,1); + lcd.print(tempSupMAX); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(11,1); + lcd.print(" "); + lcd.setCursor(18,1); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + tempInfMIN += 1; + if(tempInfMIN > 25){ + tempInfMIN=15; + } + lcd.setCursor(16,1); + lcd.print(tempInfMIN); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(18,1); + lcd.print(" "); + lcd.setCursor(4,2); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + tempInfMAX += 1; + if(tempInfMAX > 35){ + tempInfMAX=25; + } + lcd.setCursor(2,2); + lcd.print(tempInfMAX); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(4,2); + lcd.print(" "); + lcd.setCursor(11,2); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + humSupMIN += 1; + if(humSupMIN > 60){ + humSupMIN=30; + } + lcd.setCursor(9,2); + lcd.print(humSupMIN); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(11,2); + lcd.print(" "); + lcd.setCursor(18,2); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + humSupMAX += 1; + if(humSupMAX > 90){ + humSupMAX=60; + } + lcd.setCursor(16,2); + lcd.print(humSupMAX); + previoMillisBoton=millis(); + } + } + } + // Pantalla config avanzada var 10-11 + lcd.clear(); + actualMillis=millis(); + lcd.print(F("10:")); + lcd.print(humInfMIN); + lcd.setCursor(5,0); + lcd.print(F("<-")); + lcd.setCursor(7,0); + lcd.print(F("11:")); + lcd.print(humInfMAX); + lcd.setCursor(0,3); + lcd.print(F("boton1:+|boton2:sgte")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + humInfMIN += 1; + if(humInfMIN > 60){ + humInfMIN=30; + } + lcd.setCursor(3,0); + lcd.print(humInfMIN); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(5,0); + lcd.print(" "); + lcd.setCursor(12,0); + lcd.print(F("<-")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + humInfMAX += 1; + if(humInfMAX > 90){ + humInfMAX=60; + } + lcd.setCursor(10,0); + lcd.print(humInfMAX); + previoMillisBoton=millis(); + } + } + } + lcd.setCursor(12,0); + lcd.print(" "); + // Pantalla Salvar Configuracion + actualMillis=millis(); + lcd.clear(); + lcd.print(F("+ Guardando Config.+")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 modif. datos")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 grabar datos")); + lcd.setCursor(0,3); + lcd.print(F("Apagar Para Cancelar")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + previoMillisBoton=millis(); + config4(); + } + } + } + EEPROM.put(dirHUMMIN, humedadMIN); + EEPROM.put(dirHUMMAX, humedadMAX); + EEPROM.put(dirRANGOT, rangoT); + EEPROM.put(dirTSUPMIN, tempSupMIN); + EEPROM.put(dirTSUPMAX, tempSupMAX); + EEPROM.put(dirTINFMIN, tempInfMIN); + EEPROM.put(dirTINFMAX, tempInfMAX); + EEPROM.put(dirHUMSUPMIN, humSupMIN); + EEPROM.put(dirHUMSUPMAX, humSupMAX); + EEPROM.put(dirHUMINFMIN, humInfMIN); + EEPROM.put(dirHUMINFMAX, humInfMAX); + varControl(); + lcd.clear(); +} + +void config3() { + actualMillis=millis(); + lcd.clear(); + lcd.print(F("Configurando Modo:")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 cambiar modo")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 selec. modo")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(6,3); + impModo(); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + modo += 1; + if(modo > 4){ + modo=1; + } + lcd.setCursor(6,3); + impModo(); + previoMillisBoton=millis(); + } + } + } + lcd.clear(); + lcd.print(F("Conf. minutos Riego:")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 suma un min")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 graba mins.")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(10,3); + lcd.print(minutosRiego); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + minutosRiego += 1; + if(minutosRiego > 5){ + minutosRiego=1; + } + lcd.setCursor(10,3); + lcd.print(minutosRiego); + previoMillisBoton=millis(); + } + } + } + lcd.clear(); + lcd.print(F("Guardando Modo/Riego")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 modif. datos")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 grabar datos")); + lcd.setCursor(0,3); + lcd.setCursor(0,3); + lcd.print(F("MODO")); + impModo(); + lcd.setCursor(13,3); + lcd.write(2); + lcd.print(':'); + lcd.print(minutosRiego); + lcd.print(F("mins")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + previoMillisBoton=millis(); + config3(); + } + } + } + EEPROM.put(dirMODO, modo); + EEPROM.put(dirMINSRIEGO, minutosRiego); + varControl(); + lcd.clear(); +} + +void configFecha() { + actualMillis=millis(); + //Config Dia + dia = fecha.day(); + lcd.clear(); + lcd.print(F("Configurando Dia :")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 suma un dia")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 graba el dia")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(9,3); + lcd.print(dia); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + dia += 1; + if(dia > 31){ + dia=1; + lcd.setCursor(10,3); + lcd.print(' '); + } + lcd.setCursor(9,3); + lcd.print(dia); + previoMillisBoton=millis(); + } + } + } + //Config Mes + mes = fecha.month(); + lcd.clear(); + lcd.print(F("Configurando Mes :")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 suma un mes")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 graba el mes")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(9,3); + lcd.print(mes); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + mes += 1; + if(mes > 12){ + mes=1; + lcd.setCursor(10,3); + lcd.print(' '); + } + lcd.setCursor(9,3); + lcd.print(mes); + previoMillisBoton=millis(); + } + } + } + //Config Ano + ano = fecha.year(); + lcd.clear(); + lcd.print(F("Configurando Ano :")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 suma un ano")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 graba el ano")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(8,3); + lcd.print(ano); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + ano += 1; + if(ano > 2070){ano=2018;} + lcd.setCursor(8,3); + lcd.print(ano); + previoMillisBoton=millis(); + } + } + } + //Config Hora + hora = fecha.hour(); + lcd.clear(); + lcd.print(F("Configurando Hora :")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 suma una Hr")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 graba la Hr")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(9,3); + lcd.print(hora); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + hora += 1; + if(hora > 23){ + hora=0; + lcd.setCursor(10,3); + lcd.print(' '); + } + lcd.setCursor(9,3); + lcd.print(hora); + previoMillisBoton=millis(); + } + } + } + //Config Minutos + minutos = fecha.minute(); + lcd.clear(); + lcd.print(F("Configurando Minutos")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 suma un Min")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 graba Minuts")); + lcd.setCursor(0,3); + lcd.print(F("--->>>")); + lcd.setCursor(9,3); + lcd.print(minutos); + lcd.setCursor(14,3); + lcd.print(F("<<<---")); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + minutos += 1; + if(minutos > 59){ + minutos=0; + lcd.setCursor(10,3); + lcd.print(' '); + } + lcd.setCursor(9,3); + lcd.print(minutos); + previoMillisBoton=millis(); + } + } + } + //Guardando Fecha/Hora + lcd.clear(); + lcd.print(F("Guardando Fecha/Hora")); + lcd.setCursor(0,1); + lcd.print(F("boton 1 modif. datos")); + lcd.setCursor(0,2); + lcd.print(F("boton 2 grabar fecha")); + lcd.setCursor(0,3); + lcd.print(dia); + lcd.print('/'); + lcd.print(mes); + lcd.print('/'); + lcd.print(ano); + lcd.print(' '); + lcd.print(hora); + lcd.print(':'); + lcd.print(minutos); + while(!boton2enter()) { + actualMillis=millis(); + if( (unsigned long)(actualMillis - previoMillisBoton) >= intervalo_boton ) { + if(digitalRead(btn1)) { + previoMillisBoton=millis(); + configFecha(); + } + } + } + reloj.adjust(DateTime(ano, mes, dia, hora, minutos, 0)); + lcd.clear(); +} + +//Control INTRACTOR Segun humedad +void releVentIn() { + if( humSup>=humSupMAX || humInf>=humInfMAX) { + digitalWrite(relVentIn, 0); + lcd.setCursor(14, 2); + lcd.write(4); + } + if( ((humSup>=humSupMIN) && (humSup=humInfMIN) && (humInf=tempSupMAX) || (tempInf>=tempInfMAX) ) { + digitalWrite(relVentEx, 0); + } + if ( (tempSup<(tempSupMAX-rangoT)) || (tempInf<(tempInfMAX-rangoT)) ) { + digitalWrite(relVentEx, 1); + } + if(!digitalRead(relVentEx)) { + lcd.setCursor(14, 0); + lcd.write(4); + lcd.setCursor(14, 1); + lcd.print(' '); + } else { + lcd.setCursor(14, 0); + lcd.print(' '); + lcd.setCursor(14, 1); + lcd.write(4); + } +} + +//MODO 1=18/6 2=12/12 3=24/00 4=20/04 Luz/Oscuridad +void selecMOD() { + switch(modo) { + case 1: + horaEncLuz=19; + horaApgLuz=13; + lcd.setCursor(16, 1); + lcd.print("MOD"); + lcd.setCursor(15, 2); + lcd.print("18-06"); + break; + case 2: + horaEncLuz=22; + horaApgLuz=10; + lcd.setCursor(16, 1); + lcd.print("MOD"); + lcd.setCursor(15, 2); + lcd.print("12-12"); + break; + case 3: + horaEncLuz=0; + horaApgLuz=0; + lcd.setCursor(16, 1); + lcd.print("MOD"); + lcd.setCursor(15, 2); + lcd.print("24-00"); + break; + case 4: + horaEncLuz=18; + horaApgLuz=14; + lcd.setCursor(16, 1); + lcd.print("MOD"); + lcd.setCursor(15, 2); + lcd.print("20-04"); + break; + default://Modo 4 por defecto + horaEncLuz=18; + horaApgLuz=14; + lcd.setCursor(16, 1); + lcd.print("MOD"); + lcd.setCursor(15, 2); + lcd.print("20-04"); + } +} + +void impModo(){ + lcd.print(modo); + if(modo==1){ + lcd.print("(18-06)"); + } + if(modo==2){ + lcd.print("(12-12)"); + } + if(modo==3){ + lcd.print("(24-00)"); + } + if(modo==4){ + lcd.print("(20-04)"); + } +} + +//Control LUZ +void releLuz() { + if(modo != '3') { + if(fecha.hour() >= horaEncLuz || fecha.hour() < horaApgLuz) { + digitalWrite(relLuz, 0); + } else { + digitalWrite(relLuz, 1); + } + } else { + digitalWrite(relLuz, 0); + } + if(!digitalRead(relLuz)) { + lcd.setCursor(15, 1); + lcd.write(3); + lcd.setCursor(19, 1); + lcd.print(' '); + } else { + lcd.setCursor(15, 1); + lcd.write(' '); + lcd.setCursor(19, 1); + lcd.write(5); + } +} + +// riego ocurre 'minutosRiego' minutos cada 10 minutos, calcular valor OPTIMO según caudal de la bomba y respuesta de sensores ||VAR: minutosRiego|| +void releBomba() { + if(!riegoManual) { + //Riego manual se puede usar en cualquier momento, Riego automatico, solo cuando la luz esta apagagada entre minutos 0 y 'minutosRiego' + if( fecha.minute()=10 && fecha.minute()<(10+minutosRiego)) || (fecha.minute()>=20 && fecha.minute()<(20+minutosRiego)) || (fecha.minute()>=30 && fecha.minute()<(30+minutosRiego)) || (fecha.minute()>=40 && fecha.minute()<(40+minutosRiego)) || (fecha.minute()>=50 && fecha.minute()<(50+minutosRiego)) ) { + if(modo != 3) { + //No hay riego si un sensor y promedio exceden valores maximos + if( digitalRead(relLuz) &&( hum1<=humedadMIN || hum2<=humedadMIN || hum3<=humedadMIN || hum4<=humedadMIN )) { + alarmaRiego = true; + } + if( !digitalRead(relLuz) || hum1>=humedadMAX || hum2>=humedadMAX || hum3>=humedadMAX || hum4>=humedadMAX ) { + alarmaRiego = false; + } + } else { + if( hum1<=humedadMIN || hum2<=humedadMIN || hum3<=humedadMIN || hum4<=humedadMIN ) { + alarmaRiego = true; + } + //No hay riego si un sensor o promedio exceden valores maximos + if( hum1>=humedadMAX || hum2>=humedadMAX || hum3>=humedadMAX || hum4>=humedadMAX ) { + alarmaRiego = false; + } + } + } else { + alarmaRiego = false; + } + if(alarmaRiego) { + digitalWrite(relBomb, 0); + lcd.setCursor(4, 3); + lcd.print(' '); + lcd.setCursor(9, 3); + lcd.print(' '); + lcd.setCursor(14, 3); + lcd.print(' '); + lcd.setCursor(19, 3); + lcd.write(2); + } else { + digitalWrite(relBomb, 1); + lcd.setCursor(4, 3); + lcd.print(' '); + lcd.setCursor(9, 3); + lcd.print(' '); + lcd.setCursor(14, 3); + lcd.print(' '); + lcd.setCursor(19, 3); + lcd.print(' '); + } + } else { + //Si riego manual esta activado... + digitalWrite(relBomb, 0); + lcd.setCursor(4, 3); + lcd.write(2); + lcd.setCursor(9, 3); + lcd.write(2); + lcd.setCursor(14, 3); + lcd.write(2); + lcd.setCursor(19, 3); + lcd.write(2); + } +} + +//DHT11 Superior e Inferior sensado debe ser > 1 segundo ** if (isnan(humSup)) {Añardir control de mal funcionamiento} !!** +void datosDHT() { + humSup = dhtSup.readHumidity(); //(byte)dhtSup.readHumidity(); + tempSup = dhtSup.readTemperature(); //(byte)dhtSup.readTemperature(); + humInf = dhtInf.readHumidity(); //(byte)dhtInf.readHumidity(); + tempInf = dhtInf.readTemperature(); //(byte)dhtInf.readTemperature(); + humProm = (humSup+humInf)/2; + tempPro = (tempSup+tempInf)/2; +} + +//Añade un 0 a los valores horarios menores a 10 +String getHora(char var) { + switch (var) { + case 'h': + if(fecha.hour() < 10) { + return ("0"+(String)fecha.hour()); break; + } else { + return (String)fecha.hour();break; + } + case 'm': + if(fecha.minute() <10) { + return ("0"+(String)fecha.minute()); break; + } else { + return (String)fecha.minute();break; + } + case 's': + if(fecha.second() <10) { + return ("0"+(String)fecha.second()); break; + } else { + return (String)fecha.second();break; + } + } +} + +//Hora en LCD +void horaLCD() { + lcd.setCursor(15, 0); + lcd.print(getHora('h')); + if(cursor) { + lcd.print(':'); + cursor=false; + } else { + lcd.print(' '); + cursor=true; + } + lcd.print(getHora('m')); +} + +void correcHora() { + if(fecha.hour() == 3 && fecha.minute() == 55 && fecha.second() == 0) { + reloj.adjust(DateTime(fecha.year(), fecha.month(), fecha.day(), fecha.hour(), corrMins, corrSegs)); + } +} + +void guardarSD() { + if(fecha.minute()%30 == 0) { + if(!escritura) { + String linea = String(fecha.day()); + linea += "/"; + linea += String(fecha.month()); + linea += "/"; + linea += String(fecha.year()); + linea += " "; + linea += String(fecha.hour()); + linea += ":"; + linea += String(fecha.minute()); + linea += ","; + linea += String(hum1); + linea += ","; + linea += String(hum2); + linea += ","; + linea += String(hum3); + linea += ","; + linea += String(hum4); + linea += ","; + linea += String(humSup); + linea += ","; + linea += String(humInf); + linea += ","; + linea += String(tempSup); + linea += ","; + linea += String(tempInf); + File archivo = SD.open("registro.csv", FILE_WRITE); + archivo.println(linea); + archivo.close(); + escritura=1; + Serial.println(linea); + } + } else { + escritura=0; + } +} diff --git a/globales.h b/globales.h new file mode 100755 index 0000000..3f0914c --- /dev/null +++ b/globales.h @@ -0,0 +1,64 @@ +#define dirMODO 0 +#define dirINTSENS 1 +#define dirHUMMIN 2 +#define dirHUMMAX 3 +#define dirRANGOT 6 +#define dirTSUPMIN 7 +#define dirTSUPMAX 8 +#define dirTINFMIN 9 +#define dirTINFMAX 10 +#define dirHUMSUPMIN 13 +#define dirHUMSUPMAX 14 +#define dirHUMINFMIN 15 +#define dirHUMINFMAX 16 +#define dirMINSRIEGO 19 +#define btn1 2 +#define btn2 3 +#define DHTPINSUP 4 +#define DHTPININF 5 +#define DHTTYPE DHT11 +//Reles +#define relBomb 6 +#define relVentIn 7 +#define relVentEx 8 +#define relLuz 9 +// Pines MicroSd +#define CS 10 // Cable Select +#define MOSI 11 // Master Out Slave In +#define MISO 12 // Master In Slave Out +#define SCK 13 // System Clock +// A0 -> A3 +#define sHum1 0 //humedad A +#define sHum2 1 //humedad B +#define sHum3 2 //humedad C +#define sHum4 3 //humedad D + +bool escritura, cursor, alarmaRiego, tempo, lcdON, riegoManual; +byte dia, mes, hora, minutos; +int humTemp, ano; +byte hum1, hum2, hum3, hum4; +byte humedadMIN, humedadMAX; +byte humSup, humSupMIN, humSupMAX; +byte humInf, humInfMIN, humInfMAX; +byte horaEncLuz, horaApgLuz, minutosRiego;// minutosRiego MAXIMO 5 +byte rangoT; // Termperatura umbral para apagar extracción cuando temperatura baje "rangoT" grados, respecto a la máxima +byte tempSup, tempSupMIN, tempSupMAX;//DHT +byte tempInf, tempInfMIN, tempInfMAX;//DHT +byte tempPro, humProm; +byte gota[] = { 0x08, 0x04, 0x06, 0x0F, 0x1D, 0x1F, 0x1F, 0x0E }; +byte grado[] = { 0x0C, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00 }; +byte luz[] = { 0x04, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x04, 0x00 }; +byte vent[] = { 0x08, 0x13, 0x1A, 0x04, 0x0B, 0x19, 0x02, 0x00 }; +byte luma[] = { 0x06, 0x0C, 0x18, 0x18, 0x18, 0x1C, 0x0E, 0x07 }; +byte modo, intSens; +byte estado; +byte corrMins, corrSegs; + +// millis() +unsigned long intervalo_loop=1000; +unsigned long intervalo_boton=300; +unsigned long intervalo_sensado=5000; +unsigned long previoMillisLoop=0; +unsigned long previoMillisBoton=0; +unsigned long previoMillisSens=0; +unsigned long actualMillis;