Buenas tardes amigos:
Me veo obligado a acudir al foro ya que tengo un problema que me trae de cabeza ya que el RTC me está haciendo cosas raras. En principio cuando hago un set de la hora si pongo por ejemplo hora 22 y minutos 30. cargo el código de set para modo 24H e inicio un monitor serie y lo que me devuelve son las 17:30.
Ahora vuelvo a cargar el codigo con una hora por ejemplo las 13:30 y correcto la pone bien y dejo pasar el tiempo, llegan las 18:30 y me vuelve a marcar otra hora distinta atrasada.
He de decir que este problema me ha venido al actualizar la hora para el horario de invierno y el código me funcionaba perfectamente antes.
He probado con otro RTC nuevo y nada lo mismo. Con este código controlo el encendido y apagado de luces de mi acuario y el aire oxigenador de agua.
CóDIGO DE SET Y LECTURA
CóDIGO DE SET Y LECTURA
#include <time.h>
#include <DS3231.h>
#include <Wire.h>
DS3231 Clock;
byte year, month, date, DoW, hour, minute, second;
//VARIABLES
void setup() {
// Se inicial la interfaz I2c
Wire.begin();
// Se inicia la Comunicación Serial
Serial.begin(9600);
/* //Se establece el modo horario en 12 horas (false = 24h)
Clock.setClockMode(false);
//Se establece el año
Clock.setYear((byte)(17));
//Mes
Clock.setMonth((byte)4);
//Dia de la semana (no lo estoy considerando)
//Clock.setDoW((byte)dia);
//Día
Clock.setDate((byte)19);
//Hora
Clock.setHour((byte)0);
//Minutos
Clock.setMinute((byte)35);
//Segundos
Clock.setSecond((byte)0);
*/
}
void loop() {
delay(1000);
//Se rescata la información
Clock.getTime(year, month, date, DoW, hour, minute, second);
//Se imprime
Serial.print("\n");
Serial.print(date, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" ");
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.println(second, DEC);
// Mostrar la temperatura exterior
Serial.print("\nT exterior=");
Serial.print(Clock.getTemperature(), 2);
}
CÓDIGO COMPLETO
#include <time.h>
#include <DS3231.h>
#include <Wire.h>
//CONSTANTES
#define Blanco 2
#define Luna 3
#define UV 4
#define Aire 5
DS3231 Clock;
byte year, month, date, DoW, hour, minute, second;
//VARIABLES
void setup() {
/*
// Se inicial la interfaz I2c
Wire.begin();
// Se inicia la Comunicación Serial
Serial.begin(9600);
//Se establece el modo horario en 12 horas (false = 24h)
Clock.setClockMode(false);
//Se establece el año
Clock.setYear((byte)(17));
//Mes
Clock.setMonth((byte)4);
//Dia de la semana (no lo estoy considerando)
//Clock.setDoW((byte)dia);
//Día
Clock.setDate((byte)18);
//Hora
Clock.setHour((byte)12);
//Minutos
Clock.setMinute((byte)25);
//Segundos
Clock.setSecond((byte)00);
*/
pinMode(Blanco, OUTPUT);
pinMode(Aire, OUTPUT);
pinMode(Luna, OUTPUT);
pinMode(UV, OUTPUT);
pinMode(6, INPUT);
// Se inicial la interfaz I2c
Wire.begin();
// Se inicia la Comunicación Serial
Serial.begin(9600);
}
void loop() {
delay(1000);
//Se rescata la información
Clock.getTime(year, month, date, DoW, hour, minute, second);
//Se imprime
Serial.print("\n");
Serial.print(date, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" ");
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.println(second, DEC);
// Mostrar la temperatura exterior
Serial.print("\nT exterior=");
Serial.print(Clock.getTemperature(), 2);
//Mostrar la temperatura interior
//Control del luces mediante la hora
//FUNCION
/*if (6 == HIGH){
digitalWrite(Blanco, LOW);
digitalWrite(Luna, LOW);
digitalWrite(UV, LOW);
}
*/
// Apagar la luz Blanca a las 23:00 PM hasta las 9:00
if(( hour >= 0 && hour < 9 )||(hour >= 23 && minute < 59))
{
digitalWrite( Blanco, HIGH );
}
else
digitalWrite(Blanco, LOW);
// Apagar la luz luna a las 1:00 hasta las 8:00
if( hour >= 1 && hour < 8 )
{
digitalWrite( Luna, HIGH );
}
else
digitalWrite(Luna, LOW);
// Apagar la luz UV a las 22:00 hasta las 10:00
if(( hour >= 22)|| (hour >= 0 && hour < 10 ))
{
digitalWrite( UV, HIGH );
}
else
digitalWrite(UV, LOW);
// Apagar la Aire a las 21:00 hasta las 10:00
if((hour >= 21)||( hour >= 0 && hour < 8 ))
//if( hour >= 22 && hour < 8 )
{
digitalWrite( Aire, HIGH );
}
else
digitalWrite(Aire, LOW);
}