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

S’abonner
Notification pour
guest
12 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
1 année 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
10 mois il y a

merci bien pour ce tuto

Jacques
Jacques
3 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
3 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.