Diseño Controlador Acuario

va esto como te dice Daniel

if (Co2Var.Status == 0)

o va solo esto

if (!Co2Var.Status)

si se me escapó disculpas

ok , hago el cambio y pruebo todo

Aunque @Daniel_Arg lo dejó muy claro siempre hay alguien que no sabe seguir los pasos.
Acá esta RTC_lib con la funcion get_temperature() incorporada.

Ya pude compilar todo el código sin errores.
Ahora veré de impliementarlo para poder seguir mas que nada las opciones de LCD.
Y luego ir colaborando.

RTClib.zip (17.8 KB)

Ya que estamos mostrado este era mi acuario de agua dulce de 170 cm de largo luego cambie al actual marino

Actual en proceso

sigo probando solo un relajo

CADUSA2 en prueba
Se limpia la eeprom se carga CADUSA2
pantalla inicio OK
pantalla información hora. fecha,temperaturas OK
menús:
Reloj y fecha OK
calefactor valores por defecto aparecen, rele se activa depues de 1 minutos OK
control CO2 entrega información en pantalla de valores por defecto, al seleccionar ON activa rele despues de 1 minuto.
se mantiene la configuracion puesta por usuario al resetear y desconectar energia
Prueva de sobre calentamiento a 72° mensaje Alta temperatura en pantalla y se reestablece bajo los 50°
en cada prueba se limpio eeprom

Lo otro hay posibilidad de agregar este control de temperatura en la parte del void overheating(), que se accione con el termómetro del rtc como una acción antes que la temperatura llegue al sobre calentamiento y mantener una temperatura y si falla pasaría al modo sobre calentamiento.
la idea la saque de aca

el codigo a modificar para usar el sensor de temperatura del rtc

#include <Wire.h> 
#include <OneWire.h>                     //libreria temperatura
#include <DallasTemperature.h> 
OneWire ourWire(12);           //  Se establece el pin D12  como bus OneWire
DallasTemperature sensors(&ourWire);  //Se declara una variable u objeto para nuestro sensor
int PinVent = 5;                         //puerto digital D11 dodne conectar el ventildor
int Temperatura;                     //variable calculo temperatura
int Restriccion_de_Temp;             //Variable para mapear la temperatura
int pwm;                              //Variable para generar pwm

void setup() {
sensors.begin(); 
pinMode(5,OUTPUT);
// Serial.begin(9600); 
}

void loop() {
  
/////// Regulador Veloc Ventilador  ////////////
 sensors.requestTemperatures(); 
Temperatura = (sensors.getTempCByIndex(0));
     Restriccion_de_Temp = constrain(Temperatura, 35, 45);
  pwm = map(Restriccion_de_Temp, 35, 45, 0, 255);
  analogWrite(PinVent,pwm);
//  Serial.println(sensors.getTempCByIndex(0)); 
//  Serial.println (pwm);
 delay(1000);  
}

se adjunta archivo CADUSA2

una idea para la iluminación del display has probado con una resistencia de 10K donde esta el jumper del lcd atenúa arto y es visible la información y no es molesto a la vista y solo ver que se apague la pantalla cuando termine el periodo de luz y se encienda cuando comience el periodo.

se ve mejor en vivo que en la foto

Bueno, debido a diferencias con Daniel_Arg que me exige resolver cosas... simplemente paso de colaborar. No trabajo de ese modo con nadie.

Intenté de buena voluntad colaborar y lo hice con EEPROM.put y get.

Suficiente.

Suerte a ambos.

Prueba de ventilador activándose a los 50° y desactivando a los 45 ...........OK
prueba de atenuación iluminación y activación iluminación LCD .................OK
en lo personal use resistencia de 10k

10k ilumina justo para que se vea y como dices a gusto del lector y se probo con un valor bajo y uno alto de resistencia.
Se ve muy genial, esa era la idea, al mover el encoder recobra la iluminación genial.

Lo único diferente indicador de dirección de menú ( > ) al cargar por primera vez, reiniciar o apagar y prender no aparece asta mover el encoder en la dirección de la flecha.
Lo demás OK

Adjunto sketch

OK , el cambio ( > ) funciona al cargar, reset y apagado y encendido

la (>) parte al cargar y al entrar a un menú y salir este no vuelve automaticamente
linea 1182 se borra 35; se deja rtc.getTemperatura
Prueba iluminación
se pone horario modo sol finalizando 19:23 se apaga iluminacion y modo luna enciende a las 19:25 segun relog
RTC, demora de 1:59 seg según cronometro en encender, no es inmediato el paso a luna
en modo mantenimiento se encienden solo luz azul y rojas solamente o las blancas igual, solo se me encienden las azul y rojas

Consulta habría forma de poner en el LCD información del estado en que se está como:
Amanecer, Sol, Atardecer, Noche
Según horario programado

Los 35 son un detalle pero que me preocupe por el rtc luego lo descubrí jajaa
algo que note es cuando parte el periodo parten encendido los tres led no en un orden como azul luego rojo y blanco, tu idea es como esta del video es muy buena

que periodo seria este "Orto"? dejemos los conocidos este suena feo jejejejee

Bien aclarado el termino ok, pero de igual manera use Alba, puesto que en España, Argentina y creo que en Venezuela o Colombia el significado es una grosería

  • La (>) parte al cargar el programa pero al entrar a un menú y salir esta (>) no vuelve automáticamente

  • Transición a modo Luna
    Si el horario sol finaliza a las 17:00 y luego dentro a menu luna y pongo que inicie a las 17:00 y finalice 18:00 salgo e ingreso nuevamente este cambia iniciando a las 17:01 provocando un lapso de casi 2 minutos con las luces apagadas y luego enciende luz azul, la transición debiese ser continua sin espacio apagado
    -----Creo que entendí el espacio sin luz es una transición a la salida de la luna

El termino lo tome de la misma pagina " En el lenguaje común, al orto se le denomina amanecer, alba o aurora. En ocasiones se diferencia la aurora, que sería el primer resplandor del cielo, del amanecer, que correspondería a la salida del sol"
mañana veré bien lo de las fases del día justo es este Alba, Luna y Ocaso me estan dando problemas sino dejare los basicos Noche, Amanecer, Sol, Atardecer y Luna que son los mas significativos

Sigue igual, para que vuelva el signo se tiene que mover (girar) el encoder avanzar y luego retroceder y aparece

Como tu has dicho no es poca cosa, es mucho lo que se a logrado y de una manera sencilla ""entre comillas para que la mayoría pueda entenderlo y realizarlo y por ultimo tener una base de donde partir y molestar menos en el foro como me paso ami barias veces no debo negar que recibí ayuda si, pero varias me mandaron a estudiar cosas que para mi eran chino.
Conforme, muy conforme con tu paciencia y con lo que se ha realizado

Test faces del día
Noche OK
Amanecer OK
Sol OK
Atardecer OK,
se apagan las luces espera 2min y pasa a Sale luna
Ocaso No aparece
Sale luna OK
Luna OK

Adjunto archivo

aqui un video donde se ve la acción > este es entrando al menú con las luces encendidas

otro donde se entra al mismo menú pero con las luces apagadas y ocurre la desaparición >

tomados con la modificación echa

si es que modifique mi anterior circuito los 10v eran porque las fuentes MEANWELL necesitan un voltaje de referencia y las recomendaban, no los uso se quedo hay .
los 8v alimento arduino.
los relés que tengo son de 5v hay los uso.
son Tip141 los tengo en uso en mi pantalla actual y son baratos en comparación al fet, cuando vi precios no se en estos momentos.
voy a usar tu recomendación del transistor para el ventilador.

la fuente uso 5 de estas soportan hasta 18 led de 3w en serie, claro que estuve revisando y parece que la descontinuaron.

Esta conversación sobre led es algo para largo algunos ven los watt otros los lumens otros el par led y nunca están de acuerdo yo opte luego de leer mucho por watt y lumens donde uso led con temp de color
blanco calido 6000-6500k
blanco frio 10000-15000k
azul 460-470nm
royal blue 445nm
uv 420-425nm
para un marino
esta es mi pantalla cuando la estaba armando hace un año placa de aluminio 5mm de espesor algo gruesa y lentes de 90°

Dudas:

1- linea 235
es el tiempo de amanecer a sol, es de 30min la duracion definido en (+30)
2- en la linea 238
0,30,0,255 quiere decir que va a subir de 0min a 30min y la luz (pmw) iría aumentando de 0 a 255 según lo programado claro

 if (MinActual < (ModoSol.HoraInicio + 30)) {  // Periodo Amanecer
        lcd.setCursor(0,1); lcd.print("          ");
          lcd.setCursor(0,1); lcd.print(Periodo_name[1]);
        brillo = map((MinActual - ModoSol.HoraInicio),0,30,0,255);