Horloge connectée avec Arduino
Toujours à l’heure ! Cet article vous permet de réaliser à l’aide d’Arduino une horloge connectée à votre réseau Wi-Fi pour afficher l’heure et la date à la seconde près.

Ce tutoriel repose sur microcontrôleur ESP8285 pour la partie matérielle et l’environnement de développement Arduino pour la partie logicielle.
Le matériel nécessaire
Voici les éléments requis pour la réalisation de cette horloge connectée avec Arduino:
Câblage
L’écran LCD 1602 choisi pour ce projet d’horloge connectée offre une interface I2C, ce qui simplifie son branchement puisque seulement 2 fils sont nécessaires pour la transmission des données à afficher. L’ESP8285 n’a pas de port dédié à l’interface I2C. Dans ce tutoriel nous choisissons les ports 4 et 5 :
- la broche SDA de l’écran OLED est reliée à la sortie 5 (IO5) de l’ESP8285,
- la broche SCL est reliée à la sortie 4 (IO4) de l’ESP8285.
Pour l’alimentation de l’écran vous reliez:
- la broche VCC de l’écran au 5V de l’ESP8285,
- les deux masses ensemble (GND).
Bibliothèque de gestion de l’écran LCD
La gestion de l’écran LCD 1602 par l’interface I2C nécessite l’installation puis la modification de la bibliothèque standard Arduino “LiquidCrystal_I2C”.
La procédure complète est décrite dans l’article “Ecran LCD avec l’ESP8285 sous Arduino“.
Code logiciel pour la connexion au point d’accès Wi-Fi
Afin de faciliter sa compréhension, nous découpons le programme d'”Horloge connectée avec Arduino” en plusieurs étapes.
Dans la première étape décrite dans ce paragraphe, nous nous concentrons sur la connexion de notre module ESP8285 au point d’accès Wi-Fi. L’écran LCD permet d’afficher la progression de la tentative de connexion.
Comme d’habitude, nous démarrons l’écriture du logiciel par l’ossature de code Arduino suivante:
// Fonction de démarrage, s'exécute une seule fois: void setup() { } // Fonction principale du programme, s'exécute en boucle: void loop() { }
Bibliothèques nécessaires
Les bibliothèques que nous utiliserons dans ce programme d’horloge connectée avec Arduino sont:
- “ESP8266WiFi” pour utiliser les fonctionnalités Wi-Fi du module ESP8285,
- “LiquidCrystal_I2C” pour piloter l’écran ESP8285 (que nous venons de modifier).
Vos premières lignes de code sont pour ajouter la déclaration de ces 2 bibliothèques:
// Déclaration des librairies utilisées #include <ESP8266WiFi.h> #include <LiquidCrystal_I2C.h>
Les informations d’utilisation de la librairie ESP8266WiFi sont disponibles à ce lien.
Cette librairie utilisant la programmation objet, nous déclarons un objet globale de type “LiquidCrystal_I2C” qui sera utilisé par la suite pour contrôler l’afficheur en utilisant le protocole I2C.
Le constructeur de cette classe prends 3 paramètres:
- l’adresse I2C de l’écran (0x27 pour le LCD1602),
- le nombre de caractères par ligne (16)
- et enfin le nombre de lignes (2).
Vous allez déclarer l’objet “Afficheur_G” pour le pilotage de l’écran LCD 1602 à l’aide des instructions suivantes:
// Déclaration globales LiquidCrystal_I2C Afficheur_G(0x27, 16, 2); // Afficheur LCD1206 d'addresse 0x27 avec écran de 2 lignes de 16 caractères
Fonction Arduino utilisée pour la connexion W-Fi
Vos identifiants de connexion Wi-Fi sont à définir dans la fonction “setup“. Pour cet article, je prends l’exemple de “LiveBox_1324” comme nom de réseau Wi-Fi (SSID) et “12345?ABCDE” comme mot de passe.
C’est à vous de modifier ces 2 lignes de code pour y insérer vos identifiants Wi-Fi :
// 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
La fonction Arduino permettant permettant d’initialiser le module Wi-Fi puis de lancer la connexion au point d’accès est la méthode “begin” de l’objet “WiFi“:
WiFi.begin(SSID_L, MOT_DE_PASSE_L);
Pour vérifier l’état de la connexion nous utilisons la méthode “status” de l’objet “WiFi” et stockons l’état de connexion lu dans la variable “StatutConnexion_L” :
StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et stockage dans la variable "StatutConnexion_L"
La variable “StatutConnexion_L” de type “wl_status_t” est à déclarer préalablement comme suit:
// Variables de la fonction wl_status_t StatutConnexion_L;
Trois valeurs de retour nous intéressent particulièrement, les codes de retour:
- “WL_NO_SSID_AVAIL” lorsque le SSID est introuvable,
- “WL_CONNECT_FAILED” qui signale un mauvais mot de passe renseigné,
- “WL_CONNECTED” une fois la connexion Wi-Fi est établie avec succès.
Nous voulons que le programme reste dans une boucle d’attente tant que l’état de la connexion lu sera différent de l’une de ces 3 valeurs de code retour listée. Vous utilisez pour cela l’instruction de boucle “while” ainsi que l’instruction “delay” pour l’attente d’une demi-seconde entre 2 vérifications de l’état de la connexion:
while ((StatutConnexion_L != WL_NO_SSID_AVAIL)&&(StatutConnexion_L != WL_CONNECTED)&&(StatutConnexion_L != WL_CONNECT_FAILED)) { delay(500); StatutConnexion_L = WiFi.status(); }
Affichage d’informations sur l’état de la connexion Wi-Fi
Le code logiciel permettant la connexion Wi-Fi est écrit. Maintenant, passons à la gestion de l’écran LCD pour afficher les informations sur l’état de la connexion.
Si ce n’est déjà fait, je vous invite à lire préalablement l’article sur la gestion d’un écran LCD avec l’ESP8285.
Vous initialisez l’écran en lui précisant en paramètre les ports SDA (5) et SCL (4) utilisés pour ce projet, puis vous allumez le rétroéclairage à l’aide des instructions suivantes :
Afficheur_G.init(5,4); // Initialisation de l'afficheur, SDA=5, SCL=4 Afficheur_G.backlight(); // Allumage du rétroéclairage
Pendant que le programme reste dans la boucle d’attente de la tentative de connexion, vous allez afficher des points pour permettre de visualiser cet étape:
Afficheur_G.print(".");
Une fois la connexion réussie ou en erreur, vous effacer l’écran et affichez le résultat en testant la variable “StatutConnexion_L”:
if (StatutConnexion_L == WL_NO_SSID_AVAIL) { Afficheur_G.print("SSID introuvable"); } else if (StatutConnexion_L == WL_CONNECT_FAILED) { Afficheur_G.print("Mot de passe KO"); } else if (StatutConnexion_L == WL_CONNECTED) { Afficheur_G.print("Connection OK"); } else { Afficheur_G.print("Autre erreur"); }
A l’exception des identifiants Wi-Fi qui vous sont propres, voici à quoi ressemble votre programme maintenant:
// Déclaration des librairies utilisées #include <ESP8266WiFi.h> #include <LiquidCrystal_I2C.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 // 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" } // Affichage du résultat de la tentative de connexion Afficheur_G.clear(); if (StatutConnexion_L == WL_NO_SSID_AVAIL) { Afficheur_G.print("SSID introuvable"); } else if (StatutConnexion_L == WL_CONNECT_FAILED) { Afficheur_G.print("Mot de passe KO"); } else if (StatutConnexion_L == WL_CONNECTED) { Afficheur_G.print("Connection OK"); } else { Afficheur_G.print("Autre erreur"); } } // Fonction principale du programme, s'exécute en boucle: void loop() { }
Afin de vérifier que vous arrivez bien à connecter votre module ESP8285 au point d’accès Wi-Fi, je vous invite à vous compilez ce programme puis à le transférez dans l’ESP8285, vous devez obtenir le résultat suivant:
Maintenant que vous savez connecter votre ESP8285 à un point d’accès Wi-Fi, nous allons passer à la récupération de l’heure de référence par internet et à son affichage (rendez-vous page 2).
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 .
Bonjour Hohm,
Oui tout à fait. Il est possible d’utiliser ce programme pour mettre à jour l’heure d’un RTC (DS3231, DS1307 ou autre). Cela a un intérêt pour un projet nécessitant une horloge précise avec une couverture Wi-Fi intermittente.
Bonjour est-ce compatible avec une carte ESP8266 ?
merci d’avance
Bonjour Harlock73,
Oui ce programme est compatible avec une carte ESP8266. La différence entre les deux cartes est la mémoire de stockage qui est plus faible sur l’ESP8266. Je n’ai pas de carte sous la main pour tester mais il devrait y avoir assez de place dans l’ESP8266.
Je vous laisse me confirmer 😉
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.
Bonjour Lalou,
l’ESP32 étant également équipé d’une interface Wi-Fi, ce projet ESP8285 peut facilement être adapté à cet autre microcontrôleur du même fabricant.
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.
merci bien pour ce tuto