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.

Horloge connectée à l'aide d'un ESP8285 et d'Arduino

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:

Carte de développement ESP8285 NodeMCU-M Cordon USB de type Micro-B (Micro USB) Platine d'essai 400 points
Carte ESP8285 Câble USB Micro-B Plaque d’essai
Ecran LCD1602 avec module I2C 10 câbles individuels de connexion mâle/femelle type Dupont - Vue de face  
Ecran I2C LCD 1602 Connecteur mâle/femelle  

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).
Branchement d'un écran LCD1602 sur une carte de développement ESP8285

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

Cet article a 7 commentaires

  1. HOHM

    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 .

    1. Nico

      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.

  2. Harlock73

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

    1. Nico

      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 😉

  3. Lalou hu096

    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.

    1. Nico

      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.

  4. Vincent

    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.

Laisser un commentaire