stavo programmando una scheda Arduino UNO R3 come studio di un ipotetico termostato intelligente con controllo da remoto; usando un RTC DS1302 mi sono imbattuto in alcuni problemi tecnici non trascurabili per il mio uso:
questo chip non prevede il passaggio da ora solare a legale e viceversa; detta anche daylight saving time ( DST) per gli americani.
Ebbene da Noi ci sono delle regole ben precise che mi hanno portato a generare un piccolo Check per correggere l'ora in questi 2 giorni l’anno.
Conoscendo le precise regole di passaggio tutti possono realizzare e comprendere il codice scritto:
<< si fissò l'inizio dell'ora legale alle ore 2:00 del mattino dell'ultima domenica di marzo e il termine alle 3:00 del mattino dell'ultima domenica di ottobre >>
La mia è una Routine Void che si avvale della presenza delle librerie discusse su un altro Topic (http://forum.arduino.cc/index.php/topic,37936.0.html ) e che rimandano al pacchetto di gestione semplice per il DS1302 (Electronics - Henning Karlsen ) tutto testato e perfettamente funzionante.
Questo per farvi capire che alcuni richiami a funzioni o strutture è legato a queste librerie (ES. t.mon che restituisce il valore decimale relativo a mese); chiedo venia se qui io ora non faccio un trattato anche sulle librerie discusse sui link sopra menzionati.
Come dichiarazioni occorrono queste variabili
boolean attendiS31=false,attendiL31=false,attendiSdom=false,attendiLdom=false;
introdurre quindi all’interno del vostro firmware (io l’ho usato alla fine dei tutti i cicli nel Loop)
ckDSTtime();
quindi il seguente codice esternamente al programma.
void ckDSTtime()
{ if (t.mon==10) //confronta il mese in corso con Ottobre
{if (t.date==24) // confronta se siamo il 24 del mese
{if (t.dow==7) //se il giorno della settimana è domenica significa che esiste ancora una domenica, il 31.
{ //attendi data corretta il 31
attendiS31=true; //attiva il check relativo all’ora solare per il 31 del mese
//Serial.println(attendiS31); //per debug
}
else
{//attendi data corretta domenica prossima
attendiSdom=true; //attiva il check per tenere sotto controllo la domenica successiva
//Serial.println(attendiSdom); //per debug
}
}
}
if (attendiS31)
{
if (t.date==31) //se siamo arrivati al 31 del mese di ottobre è domenica…
{if (t.hour==3) //…alle 3 di notte si cambia ora
{ rtc.setTime(t.hour-1, t.min, t.sec); //scala di 1 ora sull’ RTC
//Serial.println("Passaggio all'ora solare: -1 ora"); //per debug
attendiS31=false; //disattiva check
}
}
}
if (attendiSdom)
{
if (t.dow==7) //verifica l’arrivo della domenica
{if (t.hour==3) //alle 3 di notte si cambia ora
{ rtc.setTime(t.hour-1, t.min, t.sec); //scala di 1 ora sull’ RTC
//Serial.println("Passaggio all'ora solare: -1 ora"); //per Debug
attendiSdom=false; //disattiva check
}
}
}
if (t.mon==3) //qui vediamo allo stesso modo se è invece Marzo
{if (t.date==24) //stessa regola del 24…
{if (t.dow==7) //se è domenica vuol dire che l’ultima è il 31 e lo attende
{ //attendi data corretta il 31
attendiL31=true;
//Serial.println(attendiL31);
}
else
{//attendi data corretta domenica prossima
attendiLdom=true;
//Serial.println(attendiLdom);
}
}
}
if (attendiL31)
{
if (t.date==31)
{if (t.hour==2) //qui bastano le 2 di notte per aggiungere 1 ora
{ rtc.setTime(t.hour+1, t.min, t.sec);
//Serial.println("Passaggio all'ora legale: +1 ora"); //per Debug
attendiL31=false; //disattiva il check
}
}
}
if (attendiLdom)
{
if (t.dow==7)
{if (t.hour==2)
{ rtc.setTime(t.hour+1, t.min, t.sec);
Serial.println("Passaggio all'ora legale: +1 ora");
attendiLdom=false;
}
}
}
}