Sincronizzazione schede Arduino e ESP8266 senza real time clock

In molte applicazioni è necessario che i diversi dispositivi che compongono il sistema siano sincronizzati.  Il problema della sincronizzazione dei dispositivi deve essere affrontato anche nel caso sia presente un orologio RTC (Real Time Clock)  per correggere gli scostamenti dei diversi orologi rispetto a riferimento temporale della rete.

Le schede Arduino ed i moduli ESP8266 non dispongono di un RTC integrato, quindi la sincronizzazione rispetto al riferimento temporale della rete deve essere eseguita ad ogni avvio.

Il sistema GPS offre un servizio di riferimento temporale (GPS Timing Service) di elevatissima precisione che però ovviamente richiede un ricevitore GPS. Solitamente per contenere i costi si utilizza un solo ricevitore GPS connesso ad uno dei dispositivi che svolge il ruolo di server NTP locale  e poi sincronizzare tutti gli altri  dispositivi locali utilizzando dei client NTP. Eventuali altri gruppi di dispositivi fuori dalla portata delle rete WiFi possono essere sincronizzati utilizzando un secondo ricevitore GPS.

Client NTP ESP8266

https://github.com/emanbuc/ESP8266_NTPClient 

I moduli ESP8266 integrano la connettività WiFi e quindi possono connettersi facilmente al server NTP locale della rete. Il codice per l’invio della richiesta NTP e per la decodifica della risposta è disponibile negli esempi di Arduino e di ESP8266.

Il client NTP può essere utilizzato per sincronizzare il dispositivo con:

  • Server NTP remoto
  • Server NTP locale
  • Server NTP su smartphone sincronizzato con tempo GPS

Il progetto completo può essere scaricato dal mio repository ESP8266_NTPClient su GitHub ed è stato testato su ESP8266 con FW ArduinoCore. Dovrebbe funzionare senza problemi su tutte le schede Arduino.

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
 Serial.println("sending NTP packet...");
 // set all bytes in the buffer to 0
 memset(packetBuffer, 0, NTP_PACKET_SIZE);
 // Initialize values needed to form NTP request
 // (see URL above for details on the packets)
 packetBuffer[0] = 0b11100011; // LI, Version, Mode
 packetBuffer[1] = 0; // Stratum, or type of clock
 packetBuffer[2] = 6; // Polling Interval
 packetBuffer[3] = 0xEC; // Peer Clock Precision
 // 8 bytes of zero for Root Delay & Root Dispersion
 packetBuffer[12] = 49;
 packetBuffer[13] = 0x4E;
 packetBuffer[14] = 49;
 packetBuffer[15] = 52;

 // all NTP fields have been given values, now
 // you can send a packet requesting a timestamp:
 udp.beginPacket(address, NTP_REMOTE_PORT); //NTP requests are to port 123
 udp.write(packetBuffer, NTP_PACKET_SIZE);
 udp.endPacket();
 lastNtpRequestTimestamp = systemTick;
}
ESP8266_ntp_client_serial_log
ESP8266 NTP Client serial log

 

Annunci

One thought on “Sincronizzazione schede Arduino e ESP8266 senza real time clock

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...