Esp8266 ntp client
Introduction
Dans cet exemple nous allons utiliser le protocole NTP, qui va nous permettre de récupérer l'heure pour effectuer des opérations qui nécessitent une certaine précision.
Installation des librairies
Avant d'aller plus loin, l'exemple suivant nécessite l'installation de deux librairies :
- NtpClientLib;
- Time.
N'hésitez pas à aller directement sur la page Github de la librairie pour avoir la liste des fonctions.
Connexion au réseau
Commençons par nous connecter à un réseau en utilisant le DHCP :
#include <ESP8266WiFi.h>
const char ssid[] = "cfcasa";
const char password[] = "********";
void setup() {
// on démarre le port série
Serial.begin(115200);
// On attend "un peu" que le buffer soit prêt
delay(10);
// On efface la configuration précédente
WiFi.disconnect(true);
// Initialisation de la connection
WiFi.begin(ssid, password);
// Test pour déterminer quand la connection est prete
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
// Affichage des informations
Serial.print("\nConnecte a ");
Serial.print(ssid);
Serial.print(" avec l'ip ");
Serial.println(WiFi.localIP());
}
void loop() {
}
Le code précédent vous donne le résultat suivant sur le port série :
Connecte a cfcasa avec l'ip 192.168.1.9
Client NTP
Nous allons maintenant ajouter la partie client NTP.
Dans la partie des imports ajoutez la ligne suivante :
#include <TimeLib.h>
#include <NtpClientLib.h>
Dans la partie des variables statiques ajoutez les lignes suivantes :
// Serveur NTP
const char ntpServer[] = "pool.ntp.org";
// Offset depuis UTC
int8_t timeZoneOffset = 0;
// Le fuseau utilise les horaires été / hiver
bool dayligthSaving = true;
// Minutes d'offset à ajouter
int8_t minutesOffset = 0;
A la fin de la fonction setup() nous allons ajouter les lignes suivantes :
// Démarrage du processus NTP
NTP.begin (ntpServer, timeZoneOffset, dayligthSaving, minutesOffset);
// Interval de synchronisation en seconde (30 min.)
NTP.setInterval (1800);
Nous allons créer la fonction printTime:
void printTime(){
static uint16_t i = 0;
Serial.printf ("%d %s ", i, NTP.getTimeDateString ().c_str());
Serial.print (NTP.isSummerTime () ? "Heure d'été. " : "Heure d'hiver. ");
Serial.printf ("Démarrage le: %s allumé depuis %s\n", NTP.getTimeDateString(NTP.getFirstSync()).c_str(), NTP.getUptimeString().c_str());
i++;
delay(5000);
}
Que nous allons appeler dans la fonction loop :
void loop () {
printTime();
}
Le code précédent vous donne le résultat suivant sur le port série :
0 00:00:01 01/01/1970 Heure d'hiver. Démarrage le: 00:00:00 01/01/1970 allumé depuis 0 days 00:00:09 1 00:00:06 01/01/1970 Heure d'hiver. Démarrage le: 00:00:00 01/01/1970 allumé depuis 0 days 00:00:14 2 00:00:11 01/01/1970 Heure d'hiver. Démarrage le: 00:00:00 01/01/1970 allumé depuis 0 days 00:00:19
Récupérer les événements
Il est possible de récupérer les événements NTP grâce à la fonction onNTPSyncEvent. Pour cela nous allons créer la fonction processNtpEvent :
void processNtpEvent (NTPSyncEvent_t ntpEvent) {
if (ntpEvent) {
Serial.print ("Erreur de synchronisation: ");
if (ntpEvent == noResponse)
Serial.println ("Serveur NTP injoignable");
else if (ntpEvent == invalidAddress)
Serial.println ("Adresse du serveur NTP invalide");
} else {
Serial.print ("Récupération du temps NTP: ");
Serial.println (NTP.getTimeDateString (NTP.getLastNTPSync ()));
}
}
Nous allons ensuite l'appeler dans la fonction loop:
NTP.onNTPSyncEvent ([](NTPSyncEvent_t event) {
processNtpEvent(event);
});
Le code précédent vous donne le résultat suivant sur le port série :
Récupération du temps NTP: 22:38:21 18/02/2018 0 22:38:21 18/02/2018 Heure d'hiver. Démarrage le: 22:38:21 18/02/2018 allumé depuis 0 days 00:00:12