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 le microcontrôleur ESP8285 ou ESP32 (au choix) 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. Les microcontrôleurs Espressif permettent de définir les ports associés au bus matériel I2C.
Câblage pour l’ESP8285
Dans ce tutoriel nous choisissons les ports 4 et 5 pour l’ESP8285:
- la broche SDA de l’écran OLED est reliée à la sortie 4 (IO4) de l’ESP8285,
- la broche SCL est reliée à la sortie 5 (IO5) 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).
Câblage pour l’ESP32-DevKitC
Lorsque l’on utilise une (seule) plaque d’essai avec l’ESP32-DevKitC, seulement une rangée de broches est disponible. Par commodité, nous choisissons les ports 32 et 33 qui sont du même côté que le 5V sur cette carte:
- la broche SDA de l’écran OLED est reliée à la sortie 32 de l’ESP32-DevKitC,
- la broche SCL est reliée à la sortie 33 de l’ESP32-DevKitC.
Pour l’alimentation de l’écran vous reliez:
- la broche VCC de l’écran au 5V de l’ESP32-DevKitC,
- 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 ou ESP32 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 Wi-Fi des plateformes ESP8266 (ESP8285) et ESP32 n’ont pas le même nom même si elles ont très proches. Elles se nomment:
- “ESP8266WiFi” pour utiliser les fonctionnalités Wi-Fi du module ESP8285, plus d’informations sont disponibles à ce lien.
- “WiFi” pour celles de l’ESP32-DevKitC.
La directive de compilation “#if defined(plateforme)” permet de demander au compilateur de sélectionner la bibliothèque correspondant à la plateforme correspondante tout en gardant un code logiciel commun:
// Déclaration des librairies utilisées #if defined(ESP8266) #include <ESP8266WiFi.h> #elif defined(ESP32) #include <WiFi.h> #endif
La bibliothèque “LiquidCrystal_I2C” (que nous venons de modifier) pour piloter l’écran LCD 1602 par l’interface I2C se déclare comme suit:
#include <LiquidCrystal_I2C.h>
Cette librairie utilisant la programmation objet, nous déclarons un objet global 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 prend 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 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é. 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 (4 ou 32) et SCL (5 ou 33) utilisés pour ce projet, puis vous allumez le rétroéclairage à l’aide des instructions suivantes :
#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
Pendant que le programme reste dans la boucle d’attente de la tentative de connexion, vous allez afficher des points pour permettre de visualiser cette é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 #if defined(ESP8266) #include <ESP8266WiFi.h> #elif defined(ESP32) #include <WiFi.h> #endif #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 #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" } // 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() { }
Test de la connexion au point d’accès avec l’ESP8285
Afin de vérifier que vous arrivez bien à connecter votre module ESP8285 au point d’accès Wi-Fi, je vous invite à le compiler ce programme puis à le transférer dans l’ESP8285. Vous devez obtenir le résultat suivant:
Test de la connexion au point d’accès avec l’ESP32
Toutes les infos pour compiler un programme et le charger dans cette carte sont disponibles ici. En comparaison l’ESP32-DevKitC avec son antenne externe se connecte beaucoup plus rapidement:
Maintenant que vous savez connecter votre module à 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
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!
Merci Jacques,
pour ce retour.
Oui il reste des broches de disponibles sur la carte ESP8285.
Je compléterai la description du produit en y précisant l’affectation des broches (pinout) à mon retour de vacance dans 1 semaine afin de vous aider dans les développements.
Il est également à noter que les achats sur la boutique seront réouvert à ce moment.
J’espère que cela repond à votre question.
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.
Bonjour Jacques,
la fiche produit de l’ESP8285 a été complétée avec le brochage détaillé (Pinout).
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.
Bonjour Elchardus,
Oui le programme est facilement adaptable à l’ESP32.
Je vais mettre à jour ce tuto dans les prochains jours pour couvrir les microcontrôleurs EPS8285 et ESP32.
Super !
Merci beaucoup !
Le tutoriel d’horloge connectée a été mis à jour pour être utilisable sur plateforme ESP32.
Incroyable, je vous remercie !!