Esp8266 ntp client

De The Linux Craftsman
Aller à : navigation, rechercher

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.
Arduino ntp libraries.png

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