Buenos días Korneto! Disculpa el retraso.
Antes de nada, agradecer de nuevo tu ayuda una vez más y ya van unas cuantas. No te espantes por todo este ladrillo pero es que el asunto tiene su miga...
Estuve un buen rato repasando las modificaciones que habías hecho por aquello de entenderlo incluso antes de probarlo. Entre otras cosas pude ver la pifia que había hecho con los millis en el voidCREPUSCULO, je...
Me he descojonado con lo de los lcdprint bailando samba en el loop! Pues menos mal que los has insertado tú en el voidSENSORES porque lo has hecho mediante un IF (Yo no lo hubiera pillado ni de lejos)
Entiendo que has creado la variable TEMPNOW=TEMPERATURAC para poder negarla mediante el IF. De ese modo el programa se ve obligado a revisar la temp. Y tan solo cuando es false, reescribir en display. Uf! Muy ingenioso. Intenté algo parecido que vi en un tuto que usaba “ESTADO” y luego lo “ponía en duda” en base a true-false.
No sé que copia del sketch te puse en el post anterior, pero en el que tenía trabajando en casa tenía la llamada en voidloop a APERTURA en último lugar, sospecho que al hacer copia faltó esto y el corchete, dos últimas líneas... ni idea.
Después compilé ya el nuevo programa y perfecto. Tan solo un problema de compilación al faltar unos paréntesis en la función suma-resta de los termostatos. Al ser el único error, reconocerlo fue inmediato.
-Termostatos CLIMA y NIDO: OK
-CREPUSCULO: OK
-APERTURA: No funciona de hecho, es un caos. Los relés no actúan (Ninguno de los dos) y los led hacen lo que les parece. Tal y como me pasaba hace dos días, el led de puerta abierta se enciende tan solo a medias: Problema de hardware?
Observa esta foto: He cargado el sketch antiguo en el que de forma desordenada (Sin hacer los void separadamente para llamarlos en el loop) ya andaba la cosa aunque mal pues encendían los dos led de APERTURA a la vez pero los relés actuaban:
Este era el dichoso sketch que ya viste y después corregiste, bueno reconstruiste sin la parte de APERTURA pues no la conocías. Lo vuelvo a poner aquí porque esto ya se complica :
/////////////////////////////////////////////////////////////////////
// //
// CONTROLADOR BIZONAL INVERNADERO PARA REPTILES V.1 //
// //
// -Control clima general:Termostato 2 relé (alta/baja) //
// -Control hibernáculo(nido):Termostato 2 relé ( " ) //
// -Medición humedad relativa (HR) invernadero y nido //
// -Interruptor crepuscular alumbrado general (diurno) //
// -Control continuo rendimiento lámpara/tubo UVa/UVb //
// -Control horario/estacional de parámetros (Temps./luz) //
// -Apertura/cierre progresivo techo invernadero //
// -Sensor lluvia cierre total techo invernadero //
// -Sensor presencia en hibernáculo (eficiencia energética) //
// //
// RCG Zootecnia Doméstica 04/05/2020 V.1 //
// //
/////////////////////////////////////////////////////////////////////
//Glosario, terminaciones en:
// ...C: Relativas a Clima invernadero (general)
// ...N: " a clima Nido (hibernáculo)
// ..FC: " a Frío Clima general
// ..FN: " a Frío Nido
// ..CC: " a Calor Clima
// ..CN: " a Calor Nido
#include <DHT.h> //librería DHT
#include <DHT_U.h> //librería DHT unificada
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);
int SENSORC = 2; //sensor DHT22 CLIMA
int SENSORN = 9; //sensor DHT22 NIDO
int SENSORLDR = 0; //sensor LDR
int HUMEDADC; //variable humedad CLIMA
int HUMEDADN; //variable humedad NIDO
int LEDFC = 4; //LED indicador frío CLIMA
int LEDCC = 3; //LED indicador calor CLIMA
int LEDFN = 11; //LED indicador frío NIDO
int LEDCN = 10; //LED indicador calor NIDO
int LEDLDR = 7; //LED indicador LDR iluminación Gral.
int LEDABIER = 5;
int LEDCERRA = 6;
int RELECC = 22; //Relé alta calor CLIMA
int RELEFC = 24; //Relé baja frío CLIMA
int RELELDR = 26; //Relé LDR iluminación Gral.
int RELECN = 28; //Relé alta calor NIDO
int RELEFN = 30; //Relé baja frío NIDO
int RELEABRIR = 34; //Relé abrir puerta(PENDIENTE)
int RELECERRAR = 36; //Relé cerrar puerta(PENDIENTE)
//RELÉ LIBRE: Relé en PIN 32
int ABRIR;
int CERRAR;
float TEMPERATURAC; //lectura temperatura CLIMA
float TEMPERATURAN; //lectura temperatura NIDO
/////////////////////////
float SETMINC = 20.0; // //SET: ajuste temp mínima clima
float SETMAXC = 20.0; // //SET: ajuste temp máxima clima
float SETMINN = 24.0; // //SET: ajuste temp mínima nido
float SETMAXN = 30.0; // //SET: ajuste temp máxima nido
/////////////////////////
DHT dht1(SENSORC, DHT22); //Asignación sensor CLIMA
DHT dht2(SENSORN, DHT22); //Asignación sensor NIDO
void setup(){
lcd.setBacklightPin(3,POSITIVE); //
lcd.setBacklight(HIGH);
lcd.begin(20, 4);
lcd.clear();
Serial.begin(9600); //inicializando monitor serie
dht1.begin(); //inicializando sonda DHT1(CLIMA)
dht2.begin(); //inicializando sonda DHT2(NIDO)
digitalWrite(LEDCC, LOW); //LED calor CLIMA señal baja
digitalWrite(LEDFC, LOW); //LED frío CLIMA señal baja
digitalWrite(LEDLDR, LOW); //LED LDR (luz) señal baja
digitalWrite(RELECC, HIGH); //relé calor CLIMA señal alta(Log,Inv)
digitalWrite(RELEFC, HIGH); //relé frío CLIMA señal alta(Log,Inv)
digitalWrite(RELELDR, HIGH); //relé LDR iluminación Gral.señal alta(")
digitalWrite(LEDCN, LOW); //LED calor NIDO señal baja
digitalWrite(LEDFN, LOW); //LED frío NIDO señal baja
digitalWrite(RELECN, HIGH); //relé calor NIDO señal alta(Log,Inv)
digitalWrite(RELEFN, HIGH); //relé frío NIDO señal alta(Log,Inv)
digitalWrite(LEDABIER, LOW); //LED puerta ABIERTA señal baja
digitalWrite(LEDCERRA, LOW); //LED puerta CERRADA señal baja
digitalWrite(RELEABRIR, HIGH); //relé ABRIR puerta señal alta(Log,Inv)
digitalWrite(RELECERRAR, HIGH); //relé CERRAR puerta señal alta(Log,Inv)
pinMode(LEDCC, OUTPUT); //pin LED calor CLIMA es una salida
pinMode(LEDFC, OUTPUT); //pin LED frío CLIMA es una salida
pinMode(LEDLDR, OUTPUT); //pin LED LDR Ilumin. Gral. es una salida
pinMode(RELECC, OUTPUT); //pin relé calor CLIMA es una salida
pinMode(RELEFC, OUTPUT); //pin relé frío CLIMA es una salida
pinMode(RELELDR, OUTPUT); //pin relé LDR Ilumin. Gral. es una salida
pinMode(LEDCN, OUTPUT); //pin LED calor NIDO es una salida
pinMode(LEDFN, OUTPUT); //pin LED frío NIDO es una salida
pinMode(LEDABIER, OUTPUT); //pin LED puerta ABIERTA es una salida
pinMode(LEDCERRA, OUTPUT); //pin LED puerta CERRADA es una salida
pinMode(RELEABRIR, OUTPUT); //pin relé en fase ABRIR es una salida
pinMode(RELECERRAR, OUTPUT); //pin relé en fase CERRAR es una salida
pinMode(RELECN, OUTPUT); //pin relé calor NIDO es una salida
pinMode(RELEFN, OUTPUT); //pin relé frío NIDO es una salida
} //NOTA: Entradas analógicas asignan por defecto
void loop(){
lcd.setCursor(0, 0); //Posicionando cursor 1ª línea
lcd.print("CLIMA "); //Imprimir CLIMA
lcd.print("T:"); //Imprimir T:
lcd.print(TEMPERATURAC, 1); //asignar a impresión variable TªCLIMA
lcd.print(" HR:"); //imprimir HR:
lcd.print(HUMEDADC); //asignar a impresión variable Hum.CLIMA
lcd.setCursor(0, 1); //Posicionando cursor 2ª línea
lcd.print("NIDO "); //imprimir NIDO
lcd.print("T:"); //imprimir T:
lcd.print(TEMPERATURAN, 1); //asignar a impresión variable TªNIDO
lcd.print(" HR:"); //imprimir HR:
lcd.print(HUMEDADN); //asignar a impresión variable Hum.NIDO
//VARIABLES
TEMPERATURAC = dht1.readTemperature(); //asignación variable lectura Temp. DHTCLIMA
HUMEDADC = dht1.readHumidity(); //asignación variable lectura Humed. DHTCLIMA
TEMPERATURAN = dht2.readTemperature(); //asignación variable lectura Temp. DHTNIDO
HUMEDADN = dht2.readHumidity(); //asignación variable lectura Humed. DHTNIDO
//////////////////////////////////////////////////
ABRIR = dht1.readTemperature() + 2 > SETMAXC; //
CERRAR = dht1.readTemperature() - 2 < SETMINC; //
//////////////////////////////////////////////////
//MONITOR SERIE
Serial.print("CLIMA "); //imprimir Monitor serie. Sin valor
Serial.print("Tª:"); //imprimir Monitor serie. Con valor TªCLIMA
Serial.print(TEMPERATURAC, 1); //asignar a impresión variable TªCLIMA
Serial.print(" HR:"); //imprimir Monitor serie. Con valor Hum.CLIMA
Serial.println(HUMEDADC); //asignar a impresión variable Hum.CLIMA
Serial.print("NIDO "); //imprimir Monitor serie. Sin valor
Serial.print("Tª:"); //imprimir Monitor serie. Con valor TªCLIMA
Serial.print(TEMPERATURAN, 1); //asignar a impresión variable TªCLIMA
Serial.print(" HR:"); //imprimir Monitor serie. Con valor Hum.CLIMA
Serial.println(HUMEDADN); //asignar a impresión variable Hum.CLIMA
delay(500); //lapso demora 500 miliseg.(1/2 segundo)
//INTERRUPTOR CREPUSCULAR
if(analogRead(SENSORLDR) < 200){ //si... lectura sensor LDR inferior a...
digitalWrite(LEDLDR, HIGH); //...entonces LED LDR señal alta
}else{ //sino...
digitalWrite(LEDLDR, LOW); //...LED LDR señal baja
}
if(analogRead(SENSORLDR) < 200){ //si... lectura sensor LDR inferior a...
digitalWrite(RELELDR, LOW); //...entonces relé LDR Ilum.Gral. señal baja
Serial.print("LUZ:On");
Serial.print(" UVa:__");
Serial.println(" UVb:__");
lcd.setCursor(0, 2);
lcd.print("LUZ:On");
lcd.print(" UVa:__");
lcd.print(" UVb:__");
}else{ //sino...
digitalWrite(RELELDR, HIGH); //relé LDR Ilum.Gral. señal alta
Serial.print("LUZ:Off");
Serial.print(" UVa:__");
Serial.println(" UVb:__");
lcd.setCursor(0, 2);
lcd.print("LUZ:Of");
lcd.print(" UVa:__");
lcd.print(" UVb:__");
} //ATENCIÓN: Relés chinos: lógica inversa!
delay(500); //lapso demora 500 miliseg.(1/2 segundo)
//MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
if(TEMPERATURAC < SETMINC){ //Activa calefa clima
digitalWrite(LEDCC, HIGH);
digitalWrite(RELECC, LOW);
}else{
digitalWrite(LEDCC, LOW);
digitalWrite(RELECC, HIGH);
}
if(TEMPERATURAC > SETMAXC){ //Activa ventilación clima
digitalWrite(LEDFC, HIGH);
digitalWrite(RELEFC, LOW);
}else{
digitalWrite(LEDFC, LOW);
digitalWrite(RELEFC, HIGH);
}
delay(500);
//MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
if(TEMPERATURAN < SETMINN){ //Activa calefa nido
digitalWrite(LEDCN, HIGH);
digitalWrite(RELECN, LOW);
}else{
digitalWrite(LEDCN, LOW);
digitalWrite(RELECN, HIGH);
}
if(TEMPERATURAN > SETMAXN){ //Activa ventilación nido
digitalWrite(LEDFN, HIGH);
digitalWrite(RELEFN, LOW);
}else{
digitalWrite(LEDFN, LOW);
digitalWrite(RELEFN, HIGH);
}
delay(500);
//MÓDULO APERTURA/CIERRE PUERTAS
//PELIGRO!!!Configurar retardo seguridad relés!!!
if(CERRAR){ //
digitalWrite(LEDCERRA, HIGH);
digitalWrite(RELECERRAR, LOW);
Serial.println("PUERTA CERRADA");
lcd.setCursor(0, 3);
lcd.print("PUERTA CERRADA");
}else{
digitalWrite(LEDCERRA, LOW);
digitalWrite(RELECERRAR, HIGH);
}
if(ABRIR){ //
digitalWrite(LEDABIER, HIGH);
digitalWrite(RELEABRIR, LOW);
Serial.println("PUERTA ABIERTA");
lcd.setCursor(0, 3);
lcd.print("PUERTA ABIERTA");
}else{
digitalWrite(LEDABIER, LOW);
digitalWrite(RELEABRIR, HIGH);
}
delay(500);
}
Y esta foto es con el último sketch mejorado por ti (Versión actual). Voids declarados previamente y llamados desde el loop. Ya contiene el void APERTURA y su retardo por millis. Ambas fotos hechas esta mañana para intentar descartar un problema de hardware:
Donde: 1> Observa que ninguno de los dos relés de APERTURA trabajan.
2> El led rojo no debería encenderse y lo hace pero a medias: Corrientes parásitas???
Si no encuentras nada raro en esta última versión del programa no me quedará otra que:
-Sustituir alimentación USB por fuente externa de 1A mín. (Tengo una ATX de 20A nueva y aburrida. La burra grande, ande o no ande...)
-Descartar haberme cargado el Arduino MEGA rehaciendo todo el hard. (Raro sería, el viejo sketch anda con los mismos pines)
-Ya he descartado un fallo de protoboard pero igualmente la cambiaré (Tengo dos más) y si hace falta iré soldando los componentes porque esto de los cables Dupont es un inconmensurable truño.
Estoy casi casi seguro de que el sketch funciona bien (Va como un tiro) aunque tal vez no se haya probado en condiciones (Hard). De hecho, APERTURA viene a ser lo mismo que los otros dos termostatos eso si, con un retardo en millis. Descuida que no nos quedaremos sin saber qué pasa con la cacharrería, me llevo algo mejor con el hardware que con el software
Si puedes por favor, te agradecería que con toda la calma del mundo revises esta última versión. NO TENGO NINGUNA PRISA (Hasta que llegue el invierno y tampoco, ya tengo un controlador analógico por estrenar) de hecho, si quieres que nos tomemos unas vacaciones pues cojonudo.
Un saludo crack y gracias por todas las molestias!