jajajaj como me alegra ver que te diviertes y te desesperas..... es lo bonito del arduino que a veces crees que eres Bill Gates y a los 5 segundos piensas que eres un crio de 4 años, eso es normal.
Vamos por partes
EL DHT22: En el Datasheet del cacharro pone que los rangos de humedad son de 0.1 % asi que algo anda mal por ahi a ver si te lo encuentro que yo nunca use ese modulo
ME FALTAN PINES: Esto es tambien normal jajaja y mas en uno o mega que tienen menos que el esp32, pero tienen algo de solucion. Veo en elsketch que cada vez que el Clima va a Frio o calor se enciende un led para indicarlo... yo lo haria de una de estas dos maneras.... conectando el led al mismo pin que el rele asi cuando deje pasar corriente a uno tambien al led y se enciende o apaga, otra opcion seria conectar un led RGB para que cambie de color dependiendo de lo que tengas enchufado, asi ahorras 5 pines
SETUP: No entiendo muy bien pq haces el digitalwrite aqui, en principio , el rele estara en estado LOW nada mas arrancar ( cuidado hay pines que arrancan en HIGH), lo de los reles chinos tiene su tema... yo cogi un traductor con la camara del movil para ver el estado Normalmente Abierto o Cerrado
LOOP: Aqui veo el mayor problema y comun en muchos casos. Intentas meter toda la logica en el loop y eso lo que hace es relentizar el sistema. Tendrias que meter cada "apartado" en un void e invocarlo desde el loop asi podrias usar los millis. te dejo un ejemplo a ver si se entiende.
///.................................................. VARIABLES DESPUES DE LOS INCLUDES..........................................................
#define SENSORES 300000 // 5 Minutes
uint64_t tiempodelectura = 0;
int TempNID = 22; /// Temperatura que querremos en el Nido
int TempINV = 23; /// Temperatura que querremos en el Invernadero
///.................................................. ANTES QUE EL SETUP...........................................................
void LEER_SENSORES{
//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
////////////////// ESCRIBIMOS EN EL SERIAL //////////////////////////
//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 y ¿(ln)fin línea?
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 y ¿(ln)fin línea?
}
void CREPUSCULO{
//INTERRUPTOR CREPUSCULAR
if(analogRead(SENSORLDR) < 200){ //si... lectura sensor LDR inferior a...
digitalWrite(LEDLDR, HIGH); //...entonces LED LDR señal alta
digitalWrite(RELELDR, LOW); //...entonces relé LDR Ilum.Gral. señal baja
Serial.println("LUZ:On");
}else{ //sino...
digitalWrite(LEDLDR, LOW); //...LED LDR señal baja
digitalWrite(RELELDR, HIGH); //relé LDR Ilum.Gral. señal alta
Serial.println("LUZ:Off");
}
}
void TEMPERATURA{
//MÓDULO TERMOSTATO CLIMA GRAL. INVERNADERO
if(TEMPERATURAC < TempINV){
digitalWrite(LEDCC, HIGH);
digitalWrite(RELECC, LOW);
}else{
digitalWrite(LEDCC, LOW);
digitalWrite(RELECC, HIGH);
}
if(TEMPERATURAC > TempINV){
digitalWrite(LEDFC, HIGH);
digitalWrite(RELEFC, LOW);
}else{
digitalWrite(LEDFC, LOW);
digitalWrite(RELEFC, HIGH);
}
//MÓDULO TERMOSTATO CLIMA NIDO HIBERNÁCULO
if(TEMPERATURAN < TempNID){
digitalWrite(LEDCN, HIGH);
digitalWrite(RELECN, LOW);
}else{
digitalWrite(LEDCN, LOW);
digitalWrite(RELECN, HIGH);
}
if(TEMPERATURAN > TempNID){
digitalWrite(LEDFN, HIGH);
digitalWrite(RELEFN, LOW);
}else{
digitalWrite(LEDFN, LOW);
digitalWrite(RELEFN, HIGH);
}
}
///.................................................. DESPUES DEL SETUP...........................................................
void loop(){
uint64_t now = millis(); /// declaramos la variable now con los millis actuales
if((now - tiempodelectura) > SENSORES) { /// si now menos la variable tiempo de lectura es mayor que los millis que le hemos declarado en sensores
tiempodelectura = now; /// cambiamos la variable tiempo de lectura por now que son los millis actuales
LEER_SENSORES(); /// ejecutamos la lectura de sensores
}
CREPUSCULO();
TEMPERATURA();
}
FOCO: Bueno en el loop ya tienes un ejemplo del uso de millis simplemente duplicarlo y ponerle 30 minutos en vez de 5 a la variable
ACTUADOR LINEAL: Basicamente es un motor paso a paso, aunque yo lo que haria es cambiar la parte de temperatura que te puse arriba y decirle que lea el termometro y si , por ejemplo, si es menor de 24 grados encienda la calefaccion y si es mayor de 25 abra la tapa, le puedes poner un TIP120 y enchufarlo a una salida PWM para que abra mas o menos en funcion de la temperatura.
FOR: No entiendo muy bien esta parte la verdad, la funcion for es, por asi decirlo, un loop. se suele usar para contar variables o sustituir rutinas repetitivas como asignacion de pines, pero lo que entiendo es que tienes problema es algo comun, es cuestion de los rangos que ponemos a las temperaturas, es decir tu le estas indicando que cuando la temperatura sea mayor a 25 se encienda el rele y cuando sea menor a 25 se apague, pues bien, ese es el error, cuando la sonda tenga 25.01 se activara y cuando tenga 25 se apagara, una diferencia tan sumamente minima como 0.01 grados es acercar la mano al cristal, por ejemplo, yo pondra una desviacion logica de, por ejemplo, 1 grado o medio grado lo cual le permite no volverse loco al rele. seria algo asi como if( Temp < 25 && Temp> 26)
Si no es esto que te comento dimelo y buscamos solucion