Horloge connectée avec Arduino

Ajout de code logiciel pour récupérer l’heure de référence

Récupérer l'heure d'un serveur NTP avec un ESP8285

Je vous propose d’utiliser le protocole NTP (Network Time Protocol) pour récupérer l’heure de références universelle en synchronisant votre ESP8285 à un serveur de temps disponible sur internet.

Bibliothèques nécessaires

Les nouvelles bibliothèques dont nous avons besoins sont:

  • « EasyNTPClient » qui, comme sont nom l’indique, gère de manière simple le protocol NTP.
  • « WiFiUdp » car le protocol NTP repose sur le protocol UDP (User Datagram Protocol).

Je vous invite à installer la bibliothèques Arduino « EasyNTPClient »  by Harsha Alva. Pour plus d’information sur la procédure d’installation d’une bibliothèquee, reportez-vous à l’article « Température et humidité avec Arduino« .

Une fois cette installation réalisée, complétez le programme précédent en ajoutant la déclaration des 2 bibliothèques :

#include <EasyNTPClient.h>
#include <WiFiUdp.h>

Dans les déclarations globales au croquis, déclarez l’objet  « Udp_G » pour piloter les trames Wi-Fi émises et reçues au format UDP:

WiFiUDP Udp_G; // Objet UDP permettant d'envoyer et recevoir des trames Wi-Fi selon le protocole UDP

Le projet NTP Pool liste un  très grand nombre de serveurs de temps pour la communauté qu’il rend disponible via l’adresse « pool.ntp.org ».

Pour créer un client NTP « ClientNtp_G » et lui demander de se synchroniser à cette communauté NTP Pool, saisissez l’instruction suivante:

EasyNTPClient ClientNtp_G(Udp_G, "pool.ntp.org"); // Objet NTP synchronisé avec "pool.ntp.org"

La réception du temps Unix et son affichage

Afin de pouvoir continuer à surveiller l’état de la connexion après le démarrage, nous allons commencer par déplacer l’affichage des erreurs de connexion depuis la fonction « setup » vers la fonction « loop » .

Après avoir supprimé les lignes inutiles de la fonction « setup » , voici les premières lignes de la fonction  « loop« :

void loop()
{
    if(WiFi.status()==WL_CONNECTED)
    {  
        // Internet est disponible

    }
    else
    {
        // Pas de connexion internet
        Afficheur_G.setCursor(0,0);
        Afficheur_G.print("Erreur de       ");
        Afficheur_G.setCursor(0,1);
        Afficheur_G.print("       Connexion");
    }
}

La méthode « getUnixTime » de l’objet « ClientNtp_G » permet de récupérer le temps de référence sur internet au format « Unix Time »:

        TempsUnix_L = ClientNtp_G.getUnixTime();

« Unix Time » est un système de représentation de la date et l’heure basé sur le décompte des secondes qui se sont écoulées depuis le 1er janvier 1970. Cette valeur est stockée dans un entier non signé de 32 bits:

    unsigned long TempsUnix_L;

Maintenant que vous avez récupéré cet « Unix Time », je vous invite à l’afficher sur l’écran LCD, avec par exemple le titre en première ligne et la valeur en seconde ligne.

Suite à ces différentes évolutions, vous devez obtenir un code logiciel assez proche de celui-ci:

// Déclaration des librairies utilisées
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <EasyNTPClient.h>
#include <WiFiUdp.h>
 
// Déclaration globales
LiquidCrystal_I2C Afficheur_G(0x27, 16, 2); // Afficheur LCD1206 d'addresse 0x27 avec écran de 2 lignes de 16 caractères
WiFiUDP Udp_G; // Objet UDP permettant d'envoyer et recevoir des trames Wi-Fi selon le protocole UDP
EasyNTPClient ClientNtp_G(Udp_G, "pool.ntp.org"); // Objet NTP synchronisé avec "pool.ntp.org"

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
    // Constantes de la fonction
    const char* SSID_L = "LiveBox_1324"; // Nom du réseau Wi-Fi
    const char* MOT_DE_PASSE_L = "12345?ABCDE"; // Mot De Passe du réseau 

    // Variables de la fonction
    wl_status_t StatutConnexion_L; // Pour mémoriser l'état de la connexion
    
    Afficheur_G.init(5,4); // Initialisation de l'afficheur, SDA=5, SCL=4
    Afficheur_G.backlight(); // Allumage du rétroéclairage
 
    WiFi.begin(SSID_L, MOT_DE_PASSE_L); // Tentative de connexion au point d'accès Wi-Fi
    StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L"
    while ((StatutConnexion_L != WL_NO_SSID_AVAIL)&&(StatutConnexion_L != WL_CONNECTED)&&(StatutConnexion_L != WL_CONNECT_FAILED))
    {
        delay(500);
        Afficheur_G.print("."); // Pour visualiser la tentative de connexion et faire patienter
        StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L"
    }
    
    Afficheur_G.clear(); // On efface l'écran avant l'affichage de l'heure
}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    // Variables de la fonction
    unsigned long TempsUnix_L;
    char Buffer_L[50];   

    if(WiFi.status()==WL_CONNECTED)
    {  
        // Internet est disponible
        Afficheur_G.setCursor(0,0);
        Afficheur_G.print("Temps Unix:     ");
        TempsUnix_L = ClientNtp_G.getUnixTime();
        sprintf(Buffer_L, "    %d s", TempsUnix_L);
        Afficheur_G.setCursor(0,1);
        Afficheur_G.print(Buffer_L);
    }
    else
    {
        // Pas de connexion internet
        Afficheur_G.setCursor(0,0);
        Afficheur_G.print("Erreur de       ");
        Afficheur_G.setCursor(0,1);
        Afficheur_G.print("       Connexion");
    }
    delay(300);
}

Si vous compilez ce programme puis le transférez dans l’ESP8285, voici ce que vous obtenez:

Maintenant, il ne nous reste plus qu’à convertir cet « Unix Time » en une date et une heure compréhensibles par nous, pauvre humains. Pour cela, rendez-vous page 3.

Ce contenu a été publié dans Arduino, ESP8285. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *