Modulo RTC
Per poter sincronizzarsi con un contatore più preciso ecco che viene in aiuto il modulo RTC.
Ma cosa vuol dire RTC?
Wikipedia da questa spiegazione che è sufficiente al nostro scopo:
Un real-time clock (RTC), orologio in tempo reale, è un dispositivo con funzione di orologio, solitamente costituito da un processore a circuito integrato specializzato per questa funzione, il quale conteggia il tempo reale (anno, mese, giorno, ore, minuti e secondi) anche quando l'utilizzatore viene spento.[1] Viene usato in molti tipi di computer ed è presente in tutti i moderni PC.
Quello che si può trovare in commercio si presenta nella seguente forma:
Girando nel web se ne possono vedere di vari tipi.
Lo schema di collegamento è il seguente:
Notiamo che comunica anche lui con il protocollo I2C come il sensore di pressione quindi non c'è cosa più semplice del suo collegamento tramite SCL e SDA nei rispettivi ingrassi analogici 5 e 4.
Ho usato questo sketch preso dagli esempi della libreria RTClib.h per imparare ad usarlo:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> RTC_DS1307 RTC;
void setup () { if (! RTC.isrunning()) {
void loop () { DateTime now = RTC.now(); |
Se vogliamo poi regolare solamente l'ora basterà caricare questo sketch e farlo girare una volta solamente per poi ricaricare un altro sketch:
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib |
Mi sono accorto però che anche questo non tiene un orario costante. Sbaglia di qualche secondo nel giro della giornata. Così allora ho cercato un modo per farlo sincronizzare in automatico con i server che stabiliscono l'ora RTC. Per fare questo è necessaria una Ethernet Shield.
Di server ce ne sono vari. Ne ho presi 4 tra quelli proposti dal web:
#include <Wire.h> byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x4D, 0xAF}; // Mac address shield Ethernet, si trova su di un adesivo sotto lo shield RTC_DS1307 RTC; // IMPOSTAZIONI PER LETTURA ORA DA NTP //IPAddress timeServer(132, 163, 4, 101); // time-a.timefreq.bldrdoc.gov NTP server //se il server non funziona momentaneamente è necessario cambiarlo
// A UDP instance to let us send and receive packets over UDP void setup () { |
E le funzioni richiamate sono:
unsigned long RegOra(){ //REGOLAZIONE AUTOMATICA ORA RTC unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); // print the hour, minute and second: Serial.println(epoch %60); // print the second |
void data(){ |
// send an NTP request to the time server at the given address unsigned long sendNTPpacket(IPAddress& address) { // all NTP fields have been given values, now |
La rete è stata di aiuto per fare questo anche se non è stato facile trovare le informazioni necessarie per implementare questo codice.