No tengo terminado mi código, pero te puedo orientar para que programes lo que necesites.
Tu reloj es un RTC para bus I2C. Ejecuta el programita de prueba siguiente:
Código:
#include <Wire.h> // Incluye la librería Wire
#include "RTClib.h" // Incluye la librería RTClib
RTC_DS1307 RTC; // Crea el objeto RTC
void setup () {
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin(); // Establece la velocidad de datos del RTC
}
void loop () {
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000); // La información se actualiza cada 1 seg.
}
Usa la librería Wire para la comunicación I2C que ya viene por defecto en el IDE pero si no lo has hecho ya tendrás que añadir la librería RTClib a la IDE de Arduino (el IDE trae una opción para añadir librerías que deberás ser descargadas previamente y situadas en el directorio donde tengas las restantes librerías.
Con el ejemplito ya sabes como obtener la fecha y hora separada en sus correspondientes campos.
Para manejar el dimeo necesitas un dato entero que represente el momento del día en que te encuentras en cada momento.
Podemos usar el segundo del día cuyo valor máximo sería=24*60*60=86400
No nos da con un valor in (máximo 32767) ni con unsigned int. Puedes usar un dato de tipo long cuyo valor máximo llega a 2147483647.
Para obtener el segundo del día basta hacer
Código:
long Seg DelDia;
SegDelDia= (long) now.second() + ( 60L * (long) now.minute()) + ( 60L*60L * (long) now.hour() );
Tener este dato en este formato te permitirá calcular el dimeo que corresponda a cada valor del dia definiendo valores de dimeo por tramos lineales entre diferentes momentos del día.
En tu caso tendrías que programar los siguientes tramos:
Tramo1 de las 00:00 a las 15:00
Tramo2 de las 15:00 a las 16:00
Tramo3 de las 16:00 a las 23:00
Tramo4 de las 23:00 a las 24:00
Vamos a ver como se programaría uno de los tramos:
Las 15:00 = 15*60*60. Sería el segundo 44000 del día y le correspondería un valor de dimeo igual a cero.
Las 16:00 = 16*60*60. sería el segundo 57600 del día y le correspondería el valor de dimeo igual a 255.
Queremos que dentro del tramo exista una correspondencia lineal de forma que por ejemplo en mitad del tramo a las 5:30 el dimeo valga la mitad de 255. Usaremos una funcion para eso que ya mostré antes.
Código:
// *******************************************************************************
// InterpolacionLineal del valor del dimeo pata un momento TimeX dentro de un periodo de
// tiempo Time0..TimeF, sabiendo que al comiezo del periodo el valor del dimeo valdrá
// Dim0 y al Final DimF
//
// Uso:
// DimX= InterpoLineal(Time0, TimeX, TimeF, Dim0, DimF)
// *******************************************************************************
int InterpoLineal(long Time0, long TimeX, long TimeF, long Dim0, long DimF){
return (int) ( ((TimeX-Time0)*(DimF-Dim0) / (TimeF-Time0)) + Dim0 );
}
Es decir:
1) Leemos la hora
2) Calculamos el segundo del día.
3) Verificamos a que tramo corresponde ese segundo del día.
4) Llamamos a la función de interpolación con los valores adecuados para calcular el valor del dimeo. Un ejemplo de código podría ser más o menos como sigue:
Código:
// (Codigo no probado)
// Funcion para calcular el dimeo (función abreviada)
int DimeoSegDelDia(long SegDelDia){
int DimeoActual;
switch (segDelDia){
case 44000:
Dimeo=0;
break;
case 57600:
Dimeo=255;
break;
// case ...otros valores exactos
}
if ( (SegDelDia>44000) && (SegDelDia<57600))
Dimeo= InterpoLineal(44000, TimeX, 57600, 0, 255);
// if ( ... otras zonas dentro de tramos
return Dimeo;
}
// En el bucle principal
void loop(){
long SegDelDia;
SegDelDia= (long) now.second() + ( 60L * (long) now.minute()) + ( 60L*60L * (long) now.hour() );
DimeoActual=DimeoSegDelDia(SegDelDia);
}
Trabaja sobre esto y me vas diciendo.