You are currently viewing Horloge connectée avec Arduino
Horloge connectée avec Arduino

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:

Carte de développement ESP8285 NodeMCU-M Ou Carte de développement ESP32-DevKitC-32U avec antenne
Carte ESP8285   Carte ESP32-DevKitC
Câbles Dupont Mâle / Femelle Cordon USB de type Micro-B (Micro USB) Platine d'essai 400 points
Connecteur mâle/femelle Câble USB Type Micro-B Plaque d’essai
Ecran LCD1602 avec module I2C    
Ecran I2C LCD 1602    

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 de l'écran LCD1602 sur une carte de développement ESP8285
Câblage de l’écran I2C LCD1602 avec une carte de développement ESP8285

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).

 

Câblage de l'écran I2C LCD1602 avec une carte de développement ESP32-DevKitC
Câblage de l’écran I2C LCD1602 avec une carte de développement ESP32-DevKitC

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:

Connexion au point d’accès d’une carte de développement ESP8285

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:

Connexion au point d’accès d’une carte de développement ESP32-DevKitC

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).

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
3 années il y a

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

Lalou hu096
Lalou hu096
3 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
1 année 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
1 année 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
11 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
11 mois il y a

Super !
Merci beaucoup !

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

Incroyable, je vous remercie !!