Tras concluir el diseño del control de temperatura de mis acuarios, quiero seguir ampliando funciones.
Ahora quiero controlar el encendido y apagado de las luces, manteniendo de una forma aproximada, (no es necesario una exactitud extrema), el ciclo solar.
La idea es que las luces enciendan y apaguen de forma dimerizada en base a la hora del día que sea.
Tengo que controlar 3 canales PWM, uno para leds blancos, otro para leds azul y otro para leds rojos.
Al amanecer prevalecerá la luz roja y se irá mezclando la luz blanca conforme avance el dia, hasta el maximo valor que será el cenit del sol a la hora de medio dia.
Al atardecer vovlerá a mezclar la luz roja y al anochecer, la luz azul durante toda la noche para simular la luz de la luna, y volverá a comenzar el ciclo.
Os explico esto porque me gustaria que me aconsejarais, teniendo en cuenta que mi nivel en programación es amateur.
He encontrado proyectos similares por la red, pero son muy complicados y no entiendo el código.
En primer lugar quería saber como puedo sumar valores horarios.
Tengo que hacer cálculos para que desde el equinocio de verano el día 21 de junio, hasta el equinocio de invierno el día 21 de diciembre, vaya adelantando la hora del amanecer aproximadamente 1 minuto al día, y al contrario desde el equinocio de invierno, hasta el de verano.
Además tengo que variar la luminosidad de los tres canales PWM conforme avance el día.
De momento he estado haciendo pruebas y aprendiendo a usar el modulo RTC para poder controlar el tiempo con un DS3231, pero no se como plantear el calculo de esas variaciones.
Os dejo el código que quería usar como base.
Agradecería vuestros consejos y/o ejemplos.
//Reloj con RTC DS3231 y display I2C
#include <Wire.h>
#include "DS3231.h"
RTClib RTC;
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
//#define I2C_ADDR 0x27
LiquidCrystal_I2C lcd( 0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE ); //0x27 direccion I2C display, resto pines de funcinamiento del display(no variarlo) no tiene que ver con arduino, POSITIVE back light
const int out_blanco=3; //Nombra out_blanco para pin 3
int ciclo=0;
int h_on; //Hora de alarma
int m_on; // Minuto de alarma
int s_on; //Segundos de alarma
int flag_alarma; // Bandera alarma activada/desativada. 0=desactivada. 1=activada
void setup()
{
flag_alarma=0;
analogWrite(out_blanco,LOW);
pinMode (out_blanco, OUTPUT); // configura out_blanco "pin3" como salida
Serial.begin(9600);
Wire.begin();
lcd.begin (16,2); // Inicializar el display con 16 caraceres 2 lineas
}
void loop()
{
lcd.clear();
lcd.home ();
DateTime now = RTC.now();
lcd.print(now.year(), DEC);
lcd.print('/');
if (now.month()<=9) lcd.print('0'); // Si es valor < a 9 pongo un cero para que los caracteres sean siemopre de dos digitos 00:00:00
lcd.print(now.month(), DEC);
lcd.print('/');
if (now.day()<=9) lcd.print('0');
lcd.print(now.day(), DEC);
lcd.setCursor ( 0, 1 );
if (now.hour()<=9) lcd.print('0');
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute()<=9) lcd.print('0');
lcd.print(now.minute(), DEC);
lcd.print(':');
if (now.second()<=9) lcd.print('0');
lcd.print(now.second(), DEC);
h_on=21; //---
m_on=0; // |--Tiempo de alarma de encendido.
s_on=0; //---
if((now.hour()==h_on)&&(now.minute()==m_on)&&(now.second()==s_on)) //Si el tiempo coincide con la hora fijada salta alarma
{
ciclo=75;
analogWrite (out_blanco,ciclo);
flag_alarma=1;
}
if((now.hour()==h_on)&&(now.minute()==m_on)&&(now.second()==s_on+10))
{
ciclo=ciclo+75;
analogWrite (out_blanco,ciclo);
}
if((now.hour()==h_on)&&(now.minute()==m_on)&&(now.second()==s_on+20))
{
ciclo=255;
analogWrite (out_blanco,ciclo);
}
delay(1000);
}