You are currently viewing Horloge connectée avec Arduino
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 besoin sont:

  • EasyNTPClientqui, comme son nom l’indique, gère de manière simple le protocol NTP.
  • WiFiUdpcar le protocol NTP repose sur le protocol UDP (User Datagram Protocol).

Je vous invite à installer la bibliothèque Arduino “EasyNTPClient”  by Harsha Alva. Pour plus d’informations sur la procédure d’installation d’une bibliothèque, 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ée 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
#if defined(ESP8266)
  #include <ESP8266WiFi.h>
#elif defined(ESP32)
  #include <WiFi.h>
#endif
#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
    
#if defined(ESP8266)
    Afficheur_G.init(4,5); // Initialisation de l'afficheur, SDA=4, SCL=5
#elif defined(ESP32)
    Afficheur_G.init(32,33); // Initialisation de l'afficheur, SDA=32, SCL=33    
#endif
    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, "    %lu 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);
}

Test de la récupération du temps Unix avec l’ESP8285

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

Affichage du temps Unix sur une carte de développement ESP8285

Test de la récupération du temps Unix avec l’ESP32

Affichage du temps Unix sur une carte de développement ESP32-DevKitC

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

S’abonner
Notification pour
guest
17 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
HOHM
3 années il y a

bonjour ,
à partir de ce programme il serais possible de mettre à jour une rtc du type DS3231 pour la remettre a l’heure .
d’avance merci .

Harlock73
Harlock73
2 années il y a

Bonjour est-ce compatible avec une carte ESP8266 ?
merci d’avance

Lalou hu096
Lalou hu096
2 années il y a

Bonjour et merci pour ce tuto. Peut on adapter ce projet avec un ESP32 à la place d’un ESP8285 SVP.
Par avance merci de votre réponse.
Lalouhu096.

Vincent
Vincent
2 années il y a

Bonjour et un grand merci pour ce tuto clair et précis, notamment sur la gestion du passage en heure été/hiver. Tout fonctionne correctement sur la carte ESP-01 qui contient une puce ESP8266. Bravo à vous, beau travail.

TUO HERVE
TUO HERVE
1 année il y a

merci bien pour ce tuto

Jacques
Jacques
8 mois il y a

Bonjour, je sais que ce tuto date de quelques années déjà. Je désire m’initier au monde Arduino et ce projet est justement ce qu’il me faut. D’abord très bien expliqué en partant de zéro, et en y allant pas à pas. En fait j’ai besoin d’une horloge qui ne dérive pas dans le temps (donc du type WiFi via NTP, ou DCF77), capable de générer une impulsion d’1 min à chaque heure pleine. Donc ma question est (avant de me lancer dans l’achat de tous les composants): est-il possible de sortir une commande du ESP8285 (il me semble qu’il y a des GPIO)? Par exemple lorsque la valeur “minute” = 00. Pour la modification du programme, je pense que je pourrai me débrouiller lorsque je serai un peu familiarisé. D’avance merci et encore bravo pour ce tuto!

Jacques
Jacques
Répondre à  Nikko
8 mois il y a

Bonjour Nikko, un tout grand merci pour avoir pris le temps de me répondre.
Oui je patiente jusqu’à la réouverture de la boutique. Et j’ai déjà réponse à ma question, mais j’en aurai surement d’autres d’ici là 😉 .
Bonne fin de vacances et encore merci.

Elchardus
Elchardus
4 mois il y a

Bonjour,
Je souhaite réaliser ce projet avec un autre module wifi : l’ESP-32. Cela est possible puisqu’il est aussi compatible avec le wifi.
Ma question serait de savoir si le programme final que vous avez fourni peut s’adapter à l’ESP-32 ? Et est-ce que vous avez fait un tuto pour ce module ?
Merci d’avance, je vous souhaite une agréable journée.
Cordialement,
L.E.

Elchardus
Elchardus
Répondre à  Nikko
4 mois il y a

Super !
Merci beaucoup !

Elchardus
Elchardus
Répondre à  Nikko
4 mois il y a

Incroyable, je vous remercie !!