Tutoriel ESP32 53/55 - Construisez une horloge Internet LCD | Kit d'apprentissage IoT ESP32 de SunFounder
Dans ce tutoriel, nous allons construire une horloge LCD connectée à Internet en utilisant le microcontrôleur ESP32 de SunFounder. Cette horloge se synchronisera automatiquement à l'heure actuelle via Internet, affichant l'heure au format 12 heures ou 24 heures, ainsi que le jour de la semaine, la date et le mois. L'utilisation du protocole de temps réseau (NTP) garantit que l'horloge reste précise sans ajustements manuels.
Ce projet utilise les capacités Wi-Fi intégrées de l'ESP32 pour récupérer l'heure actuelle d'un serveur NTP. Nous allons utiliser un écran à cristaux liquides (LCD) pour afficher l'heure, qui peut être formatée selon les préférences de l'utilisateur. Pour toute clarification sur les étapes, veuillez consulter la vidéo à (dans la vidéo à 00:30).
Matériel expliqué
Les composants principaux de ce projet incluent le microcontrôleur ESP32, un écran LCD 20x4 et une source d'alimentation. L'ESP32 est un microcontrôleur puissant avec Wi-Fi et Bluetooth intégrés, ce qui le rend adapté aux projets IoT. L'écran LCD est utilisé pour afficher l'heure et la date, et il peut être configuré pour différentes tailles d'affichage.
L'afficheur LCD fonctionne via le protocole I2C, ce qui permet la communication sur deux fils (SDA et SCL). Cela simplifie le câblage et réduit le nombre de broches nécessaires sur l'ESP32. La connexion au serveur NTP se fait en utilisant les capacités Wi-Fi de l'ESP32, permettant des mises à jour en temps réel.
- Assurez-vous que la tension d'alimentation est correcte (5 V).
- Utilisez des condensateurs de découplage près des broches d'alimentation pour la stabilité.
- Soyez prudent avec les connexions I2C pour éviter les conflits sur le bus.
- Vérifiez l'adresse I2C de l'écran LCD (0x27 ou 0x3F).
- Vérifiez les identifiants Wi-Fi pour une connexion précise.
- Gérez les ajustements de l'heure d'été dans votre code.
- Utilisez le bon serveur NTP pour votre emplacement géographique.
- Toujours effacer l'écran LCD avant de mettre à jour l'affichage.
Instructions de câblage

Pour câbler l'ESP32 avec l'écran LCD, commencez par connecter les broches d'alimentation. Connectez le VCC de l'écran LCD à la broche 5V de l'ESP32 et la broche GND de l'écran LCD à la broche GND de l'ESP32. Pour la communication I2C, connectez la broche SDA de l'écran LCD à la GPIO 21 de l'ESP32 et la broche SCL à la GPIO 22. Assurez-vous que les connexions sont sécurisées pour éviter tout problème de communication.
Lors de la configuration du câblage, utilisez des fils de pont male-femelle pour des connexions faciles. Si votre écran LCD a une adresse I2C ou une configuration de broches différente, ajustez le code en conséquence. Référez-vous à la vidéo (dans la vidéo à 05:30) pour des options de câblage alternatives si nécessaire.
Exemples de code et guide étape par étape
Le code initialise l'écran LCD et configure la connexion Wi-Fi pour récupérer les données temporelles du serveur NTP. Des identifiants clés tels quessidetpasswordsont utilisés pour se connecter au réseau Wi-Fi, tandis quentpServer1etntpServer2spécifiez les serveurs NTP à utiliser.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";Ce fragment montre les identifiants du réseau et les adresses du serveur. Assurez-vous d'entrer votre SSID Wi-Fi et votre mot de passe avec précision, car toute erreur empêchera l'ESP32 de se connecter à Internet.
Dans leprintLocalTime()fonction, l'heure actuelle est formatée pour affichage. La structuretmest utilisé pour stocker des informations temporelles, tandis questrftimeaide à formater le temps en une chaîne lisible.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);Ce code vérifie si l'heure locale est disponible et récupère l'heure. L'heure formatée est ensuite utilisée pour afficher l'heure actuelle sur l'écran LCD. Si l'heure n'est pas encore disponible, un message est imprimé sur le Moniteur Série.
Enfin, lesetup()La fonction initialise l'affichage LCD et se connecte au Wi-Fi. Elle configure également les paramètres du serveur NTP et définit un rappel pour la synchronisation temporelle.
void setup() {
Serial.begin(115200);
lcd.init(); // initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);Cet extrait initialise le moniteur série pour le débogage, configure l'écran LCD et tente de se connecter au réseau Wi-Fi spécifié. L'état de la connexion sera imprimé sur le moniteur série, vous permettant de vérifier la connexion.
Démonstration / À quoi s'attendre
Après une configuration réussie, l'écran LCD affichera l'heure actuelle, le jour de la semaine et la date. Vous pouvez vous attendre à ce que l'heure se mette à jour toutes les 5 secondes, grâce à laloop()fonction. Si la connexion au serveur NTP échoue, un message apparaîtra sur le Moniteur Série indiquant que l'heure n'est pas encore disponible (dans la vidéo à 12:00).
Les pièges courants incluent un câblage incorrect, de mauvaises adresses I2C et des identifiants Wi-Fi incorrects. Assurez-vous que toutes les connexions sont sécurisées et que le serveur NTP est accessible depuis votre réseau.
Horodatages vidéo
- 00:00 Début
- 2:10 Introduction
- 5:15 Explication du câblage
- 7:32 Explication du code Arduino
- 18:43 Sélection de la carte ESP32 et du port COM dans l'IDE Arduino
- 20:27 Démonstration de l'horloge Internet
/*
* Horloge Internet utilisant le kit d'apprentissage IoT ESP32 de SunFounder
* Instructions vidéo complètes https://youtu.be/0KnuNqfiVug
* 📚⬇️ Page de téléchargement et de ressources https://robojax.com/RJT686
* Horloge Internet pour ESP32
* Écrit par Ahamd Shasmhiri le 31 décembre 2023 à 19:29
* www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // définir l'adresse LCD sur 0x27 pour un affichage de 16 caractères et 2 lignes
const bool showSeconds = true; // définir sur "vrai" pour afficher les secondes et "faux" pour masquer
const bool showShortMonth = false; // Décembre = faux, déc=true
const bool show24Hours = true; // vrai pour avoir 18:30 ou faux pour avoir 6:30
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
// TZ.h est tiré de https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
const String months[][2] ={
"January","Jan",
"February","Feb",
"March","Mar",
"April","Apr",
"May","May",
"June","Jun",
"July","Jul",
"August","Aug",
"September","Sep",
"October","Oct",
"November","Nov",
"December","Dec"
};
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("No time available (yet)");
return;
}
// Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S 12Heures: %I:%M:%S");
// obtenir le format de temps HH:MM
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour); // convertir timeHour en chaîne
char timeMinute[3];
strftime(timeMinute,3, "%M", &timeinfo);
String minuteString = String(timeMinute);
// Serial.println(hourString);
if(!show24Hours)
{
if(hourString.toInt() >= 12)
{
minuteString = minuteString + "PM";
}else{
minuteString = minuteString + "AM";
}
}
char timeSeconds[3];
strftime(timeSeconds,3, "%S", &timeinfo);
char timeDayofWeek[10];
strftime(timeDayofWeek, 10 , "%A", &timeinfo);
char timeMonth[10];
strftime(timeMonth, 10 , "%B", &timeinfo);
String Month = String(timeMonth);
if(showShortMonth)
{
for(int m=0; m <12; m++)
{
if(Month == months[m][0] )
{
Month = months[m][1];
// Serial.println(months[m][1]);
}
}
}
char timeDayofMonth[3];
strftime(timeDayofMonth,3 , "%d", &timeinfo);
char timeYear[5];
strftime(timeYear, 5 , "%Y", &timeinfo);
String time = String(timeHour) + ":" + minuteString ;
if(showSeconds) time = time +":" + String(timeSeconds); // ajouter des secondes si showSeconds=true
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time);
lcd.print(" ");
lcd.print(String(timeDayofWeek));
lcd.setCursor(0, 1);
lcd.print(timeDayofMonth);
lcd.print(" ");
lcd.print(Month);
lcd.print(" ");
lcd.print(timeYear);
}
// Fonction de rappel (appelée lorsque le temps est ajusté via NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init(); // initialiser l'écran LCD
lcd.backlight(); // Allume le rétroéclairage LCD.
lcd.print("Internet Clock");
delay(3000); // waif 3 secondes
// définir la fonction de rappel de notification
sntp_set_time_sync_notification_cb( timeavailable );
/*
* L'adresse du serveur NTP peut être acquise via DHCP,
*
* REMARQUE : Cet appel doit être effectué AVANT que l'esp32 n'acquière l'adresse IP via DHCP, sinon l'option SNTP 42 sera rejetée par défaut. REMARQUE : L'appel de la fonction configTime() s'il est effectué APRÈS l'exécution du client DHCP écrasera l'adresse du serveur NTP acquise.
*/
sntp_servermode_dhcp(1); // (optional)
/*
* Cela configurera les serveurs NTP et le décalage horaire/heure d'été constant devrait être acceptable si votre fuseau horaire n'a pas besoin d'ajuster le décalage horaire deux fois par an. Dans ce cas, l'ajustement horaire ne sera pas géré automatiquement.
*/
// configTime(décalageGmt_sec, décalageJour_sec, serveurNtp1, serveurNtp2);
/*
* Une approche plus pratique pour gérer les fuseaux horaires avec un décalage de jour serait de spécifier une variable d'environnement avec la définition de fuseau horaire incluant les règles d'ajustement de jour. Une liste de règles pour votre zone pourrait être obtenue à partir de https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
// configTzTime(TZ_Amerique_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
// se connecter au WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");
}
void loop()
{
delay(5000);
printLocalTime(); // il faudra un certain temps pour synchroniser l'heure :)
}
Common Course Links
Common Course Files
Ce dont vous pourriez avoir besoin
-
Amazon
-
eBayAcheter un LCD1602-I2C sur eBayebay.us
-
BanggoodAchetez un écran LCD1602 sur Banggoodbanggood.com
Ressources et références
-
ExterneAchetez un écran LCD1602 sur Banggoodbanggood.com
Fichiers📁
Fichier requis (.h)
-
TZ.h
TZ.h0.02 MB