FireBeetle ESP32 NTP client apre la strada ad una serie di progetti in cui hai la necessità di conoscere l’ora aggiornata.
Come sai la ESP32, sia in versione standalone sia in versione firebeetle non è dotata di un RTC, come arduino, ossia di un circuito che tenga sotto controllo il trascorrere del tempo.
In molti progetti con Arduino, che hai letto su questo blog:
- RTC Arduino: usa arduino come orologio
- RTC rainbow ring v3
- RTC DS3231 sketch test
- Neopixel watch RTC
solo a titolo di esempio, ho utilizzato un RTC shield o il DS1307 o il DS3231 per mantenere la sincronia dell’ora che hai inserito in fase di programmazione.
In mancanza di alimentazione del progetto, questi circuiti, hanno il vantaggio di continuare a tener traccia del tempo che passa grazie ad una batteria tampone.
L’argomento di oggi è simile nell’aspetto elementare del problema: mantenere un’orario sincronizzato, ma lo affronterai con un occhio meno elettronico e più informatico: userai un NTP server e l’ESP32 come NTP client.
NTP ( Network Time Protocol )
Non ho pretesa di raccontarti cosa sia il Network Time Protocol nel dettaglio, ne come funzioni, per questo compito ci sono fonti più autorevoli come Wikipedia a cui ti suggerisco di riferirti.
Per il progetto è importante sapere che esistono dei server a cui è possibile fare richiesta dell’ora corrente, in funzione dei fuso orari di riferimento, inviando dei pacchetti Udp di richiesta e attendendo da questi server una risposta.
Tra loro questi server sono sincronizzati per restituire sempre l’ora corretta in tutto il mondo.
Una regola importante è la frequenza con cui puoi richiedere l’ora che cambia da server a server e che può essere causa di rifiuo da parte del server dell’informazione con annesso inserimento del tuo Ip nella lista di quelli bannati, ossia considerati non affidabili o malevoli dedicati ad attacchi di tipo denial-of-service ( in gergo DoS ).
Per evitare questo tipo di inconveniente è bene rispettare le regole pubblicate da chi offre il servizio.
NTP Library per Arduino e ESP32
L’amico Luca Dentella ( lucadentella.it ) ha dedicato numerosi articoli all’ESP32 ed un articolo specifico sull’utilizzo di un protocollo chiamato SNTP ( Simple Network Time Protocol ).
Nel suo articolo, Luca, usa l’editor nativo ESP32 come sempre fa nei suoi ottimi e dettagliati articoli.
Io ho deciso di provare la strada dell’IDE arduino, anche come alternativa, offrendoti la possibilità di decidere quale strada seguire.
Per mia fortuna esiste un’ottima libreria dedicata proprio all’NTP ed ESP32 che puoi scaricare da gitHub scritta da autorevoli programmatori.
Il progetto firebeetle ESP32 ntp client può quindi diventare facilmente realtà.
Lo sketch FireBeetle ESP32 NTP client
per realizzare lo sketch firebeetle ESP32 ntp client puoi partire da uno degli esempi della libreria o copiare il codice seguente:
#include <NTPClient.h> #include <WiFi.h> #include <WiFiUdp.h> // WiFi network name and password: const char * ssid = "mySSID"; const char * pwd = "myWiFiPassword"; //The udp library class WiFiUDP udp; // By default 'time.nist.gov' is used with 60 seconds update interval and // no offset NTPClient timeClient(udp,7200); void setup(){ Serial.begin(115200); WiFi.begin(ssid, pwd); while ( WiFi.status() != WL_CONNECTED ) { delay ( 500 ); Serial.print ( "." ); } timeClient.begin(); Serial.println( "Connection Succeeded !!!" ); } void loop(){ timeClient.update(); Serial.println(timeClient.getFormattedTime()); delay(1000); }
Descrizione dello sketch
Le prime linee, come spesso accade, servono ad includere le librerie necessarie al funzionamento dello sketch; per cui le linee 01-03 includono la libreria NTPClinet, la WiFi e WiFiUdp;
avrai notato che usiamo la libreria WiFi.h che è solitamente usata per le schede WiFi shield arduino, ma ne esiste una versione per ESP32 caricata già nell’IDE come descritto in questo articolo dedicato al WiFi ESP32.
Linee 06-07: inserisci l’SSID del tuo WiFi e la relativa password;
linea 10: definisci una istanza della libreria WiFiUdp denominata udp;
linea 14: definisci una istanza della libreria NTPClient denominata timeClient e passandole come primo parametro l’istanza di connessione udp e come secondo parametro il valore in millisecondi relativo al fuso orario partendo dalla notazione UT1 servito dal server “time.nist.gov” di default nella libreria, nel caso dell’Italia sono 2 ore di differenza.
Notice
Approfondimento: sul sito del nist trovi sia la lista dei server sia le regole da seguire per le richieste, tra cui:
All users should ensure that their software NEVER queries a server more frequently than once every 4 seconds. Systems that exceed this rate will be refused service. In extreme cases, systems that exceed this limit may be considered as attempting a denial-of-service attack.
che la libreria NTPClient rispetta di default.
Ci sono altri modi per inizializzare la libreria NTPClient passandole sia il server a cui vuoi riferirti sia il time-to-update, ossia l’intervallo di richiesta al server ntp.
Documentazione libreria NTP Client
Trovi tutte queste informazioni nella documentazione della libreria o leggendo direttamente il file NTPClient.cpp:
in cui sono definiti tutti i costruttori della libreria e le modalità di inizializzazione.
linea 17: imposta la comunicazione seriale a 115200 baud;
linea 18: esegui la connessione alla rete WiFi;
linee 20-23: attendi fino a quanto la connessione non sarà attiva e funzionante, nell’attesa scrivi sul monitor seriale un “.” ogni 500 millisecondi di attesa;
linea 25: richiama il metodo begin() della NTPClient per inizializzarla ed iniziare ad utilizzarla;
linea 26: scrivi sul monitor seriale il testo “Connection Succeeded !!!” e vai a capo;
La funzione loop() della firebeetle ESP32 NTP client è abbastanza semplice, come prima linea, la 30, richiama il metodo update() della libreria NTPClient per richiedere un aggiornamento dei valori orari se rispetta il time-to-update impostato. A gestire questa sequenza ci pensa la libreria;
linea 32: scrivi sul monitor seriale il valore del restituito dal metodo: getFormattedTime() presente nella libreria ntp client;
linea 33: attendi un secondo tra un ciclo di loop ed il successivo.
Carica lo sketch sulla ESP32
La FireBeetle ESP32 NTP client una volta caricato sulla ESP32 produce una serie di messaggi sul monitor seriale come i seguenti:
In cui ciascuna linea è un aggiornamento dell’ora eseguito ogni secondo ma richiesto al server NTP come conferma ogni 60000 millisecondi, ossia 60 secondi ( un minuto ) che è una frequenza più che accettabile se consideri il tipo di progetto che stai realizzando.