BabylonGardener/BabylonGardener-RELEASE-1.0.0.ino

1115 lines
29 KiB
C++

//MANEJAR EXCEPCIONES de sensado.
#include <EEPROM.h>
#include <DHT.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>
#include "globales.h"
//#include <SoftwareSerial.h>
//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<humSupMAX)) || ((humInf>=humInfMIN) && (humInf<humInfMAX)) || (humSup<=humSupMIN || humInf<=humInfMIN) ) {
digitalWrite(relVentIn, 1);
lcd.setCursor(14, 2);
lcd.print(' ');
}
}
//Control EXTRACTOR & VENTILADOR INTERNO Segun temperatura.
void releVentEx() {
if( (tempSup>=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()<minutosRiego || (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;
}
}