Tutoriel ESP32 53/55 - Construire une horloge Internet LCD | Kit d'apprentissage IoT ESP32 de SunFounder
Na boyekoli oyo, tokosala mongongo ya ntango oyo esangani na Internet na nzela ya ESP32 microcontroller oyo ewuti na SunFounder. Mongongo oyo ekosala synchronisation automatique na ntango ya sika na nzela ya Internet, elakisi ntango na format ya 12 heures to 24 heures, elongo na mokolo ya mpɔngi, mokolo, na sanza. Kosalela Network Time Protocol (NTP) esungaka ete mongongo etikala semba na ntango nyonso, ezanga kozala na mabɔkɔ ya kobongisa.
Projet oyo esalelaka makoki ya Wi-Fi oyo ezali na kati ya ESP32 mpo na kozwa ntango ya sika na serveur NTP. Tokosalelaka Liquid Crystal Display (LCD) mpo na kolakisa ntango, oyo ekoki kobongisama kolanda mposa ya mosaleli. Soki ozali na mituna na ntina ya etape mosusu, tala video na (na video na 00:30).
Matɛriɛl oyo esengeli
Biloko ya liboso mpo na projet oyo ezali ESP32 microcontroller, LCD ya 20x4, na source ya puissance. ESP32 ezali microcontroller ya makasi oyo ezali na Wi-Fi na Bluetooth na kati, oyo esalaka ete ekoka mpo na ba projets ya IoT. LCD esalelamaka mpo na kolakisa ntango na mokolo, mpe ekoki kobongisama mpo na ba dimensions ya elakiseli ndenge na ndenge.
LCD esalaka na nzela ya protocole I2C, oyo epesaka nzela ya kosolola na nzela ya ba fils mibale (SDA na SCL). Oyo esilisaka kosala ba connexions mpamba mpe kokitisa motango ya ba pins oyo esengeli na ESP32. Connexion na serveur NTP esalemaka na nzela ya makoki ya Wi-Fi ya ESP32, oyo epesaka nzela ya kobongisa na ntango ya sika.
- Kokamba ete tension ya puissance ezala semba (5 V).
- Salela ba condensateurs ya découplage pembeni ya ba pins ya puissance mpo na stabilité.
- Keba na ba connexions I2C mpo na kokima ba conflits ya bus.
- Vérifier adresse I2C ya LCD (0x27 to 0x3F).
- Vérifier ba informations ya Wi-Fi mpo na connexion semba.
- Kamba ba ajustements ya ntango ya mokolo na mokolo (daylight saving) na kati ya code na yo.
- Salela serveur NTP oyo esengeli mpo na esika na yo ya géographique.
- Kosalela LCD na ntango nyonso liboso ya kobongisa elakiseli.
Ba Instructions ya Câblage

Mpo na kokangisa ESP32 na LCD, banda na kokangisa ba pins ya puissance. Kokangisa VCC ya LCD na pin ya 5V na ESP32 mpe pin ya GND ya LCD na pin ya GND na ESP32. Mpo na communication I2C, kokangisa pin ya SDA ya LCD na GPIO 21 na ESP32 mpe pin ya SCL na GPIO 22. Keba ete ba connexions ezala ya makasi mpo na kokima ba problèmes ya communication.
Ntango ozali kosala câblage, salela ba fils ya jumper ya mobali na mwasi mpo na connexions mpasi te. Soki LCD na yo ezali na adresse I2C to configuration ya pins oyo ekeseni, bongisa code kolanda yango. Tala video na (na video na 05:30) mpo na ba options mosusu ya câblage soki esengeli.
Ba Exemples ya Code & Explication
Code ebandisaka LCD mpe esalelaka connexion ya Wi-Fi mpo na kozwa ba données ya ntango na serveur NTP. Ba identifiants ya liboso lokola ssid na password esalelamaka mpo na kokangisa na réseau Wi-Fi, ntango ntpServer1 na ntpServer2 elakisi ba serveurs NTP oyo esengeli kosalela.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Extrait oyo elakisi ba informations ya réseau na ba adresses ya ba serveurs. Keba ete okoma SSID na mot de passe na yo ya Wi-Fi na ndenge ya semba, pamba te libunga nyonso ekopekisa ESP32 kokangisa na Internet.
Na fonction printLocalTime(), ntango ya sika ebongisamaka mpo na elakiseli. Structure tm esalelamaka mpo na kobomba ba informations ya ntango, ntango strftime esungaka mpo na kobongisa ntango na mongongo ya kotanga.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Code oyo etyelaka ete ntango ya local ezali mpe ezwa heure. Heure oyo ebongisami esalelamaka mpo na kolakisa ntango ya sika na LCD. Soki ntango ezali nanu te, ekomaka message na Serial Monitor.
Na suka, fonction setup() ebandisaka LCD mpe ekokangisaka na Wi-Fi. Ebongisaka mpe ba paramètres ya serveur NTP mpe etyaka callback mpo na synchronisation ya ntango.
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);
Extrait oyo ebandisaka Serial Monitor mpo na débogage, esalelaka LCD, mpe emekaka kokangisa na réseau Wi-Fi oyo elakisi. État ya connexion ekomama na Serial Monitor, oyo epesaka nzela ya kotyela ete connexion esalami.
Démonstration / Nini Okoki Kozela
Soki configuration esalami na ndenge ya semba, LCD ekolakisa ntango ya sika, mokolo ya mpɔngi, na mokolo. Okoki kozela ete ntango ebongisama na ntango nyonso ya 5 secondes, na nzela ya fonction loop(). Soki connexion na serveur NTP efeli, message ekobima na Serial Monitor oyo elakisi ete ntango ezali nanu te (na video na 12:00).
Ba problèmes ya mbala mingi ezali câblage ya mabe, ba adresses I2C ya mabe, na ba informations ya Wi-Fi ya mabe. Keba ete ba connexions nyonso ezala ya makasi mpe ete serveur NTP ekoka kozwa na réseau na yo.
Ba Timestamps ya Video
- 00:00 Ebandeli
- 2:10 Introduction
- 5:15 Câblage elobami
- 7:32 Code ya Arduino elobami
- 18:43 Kopona carte ESP32 na port COM na Arduino IDE
- 20:27 Démonstration ya Mongongo ya Internet
/*
Internet Clock using SunFounder's IoT ESP32 Learning kit
Full video instruction https://youtu.be/0KnuNqfiVug
📚⬇️ Download and resource page https://robojax.com/RJT686
Internet Clock for ESP32
Written by Ahamd Shasmhiri on Dec 31, 2023 at 19:29
www.Robojax.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
const bool showSeconds = true;//set to "true" to show seconds and "false" to hide
const bool showShortMonth = false;//December = false, Dec=true
const bool show24Hours = true;//true to have 18:30 or false to have 6:30
#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
//TZ.h is taken from 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 12Hours: %I:%M:%S");
// get time format HH:MM
char timeHour[5];
strftime(timeHour,5, "%H", &timeinfo);
String hourString = String(timeHour);//convert timeHour to string
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);//add seconds if 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);
}
// Callback function (get's called when time adjusts via NTP)
void timeavailable(struct timeval *t)
{
Serial.println("Got time adjustment from NTP!");
printLocalTime();
}
void setup()
{
Serial.begin(115200);
lcd.init();// initialize the lcd
lcd.backlight(); // Turns on the LCD backlight.
lcd.print("Internet Clock");
delay(3000);//waif 3 seconds
// set notification call-back function
sntp_set_time_sync_notification_cb( timeavailable );
/**
* NTP server address could be aquired via DHCP,
*
* NOTE: This call should be made BEFORE esp32 aquires IP address via DHCP,
* otherwise SNTP option 42 would be rejected by default.
* NOTE: configTime() function call if made AFTER DHCP-client run
* will OVERRIDE aquired NTP server address
*/
sntp_servermode_dhcp(1); // (optional)
/**
* This will set configured ntp servers and constant TimeZone/daylightOffset
* should be OK if your time zone does not need to adjust daylightOffset twice a year,
* in such a case time adjustment won't be handled automagicaly.
*/
// configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);
/**
* A more convenient approach to handle TimeZones with daylightOffset
* would be to specify a environmnet variable with TimeZone definition including daylight adjustmnet rules.
* A list of rules for your zone could be obtained from https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h
*/
//configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);
//connect to 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(); // it will take some time to sync time :)
}
Common Course Links
Common Course Files
Nko o na nki.
-
AmazonPurchase LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Mokili na bisika
-
L'extérieurPurchase LCD1602 display from Banggoodbanggood.com
Fichiers📁
Fichye ki nesesè (.h)
-
TZ.h
TZ.h0.02 MB