Tutorial ESP32 53/55 - Construiește un ceas LCD cu internet | Kitul de învățare IoT ESP32 de la SunFounder
În acest tutorial, vom construi un ceas LCD conectat la internet folosind microcontrolerul ESP32 de la SunFounder. Acest ceas se va sincroniza automat cu ora curentă prin internet, afișând ora în format de 12 ore sau 24 de ore, împreună cu ziua săptămânii, data și luna. Utilizarea Protocolului de Timp în Rețea (NTP) asigură că ceasul rămâne precis fără ajustări manuale.
Acest proiect valorifică capacitățile Wi-Fi integrate ale ESP32 pentru a prelua ora curentă de la un server NTP. Vom utiliza un Afișaj cu Cristale Lichide (LCD) pentru a prezenta ora, care poate fi formatat conform preferințelor utilizatorului. Pentru clarificări suplimentare privind orice pas, vă rugăm să consultați videoclipul (în videoclip la 00:30).
Hardware Explicat
Componentele principale pentru acest proiect includ microcontrolerul ESP32, un afișaj LCD 20x4 și o sursă de alimentare. ESP32 este un microcontroler puternic cu Wi-Fi și Bluetooth integrate, fiind potrivit pentru proiecte IoT. LCD-ul este utilizat pentru a afișa ora și data și poate fi configurat pentru diferite dimensiuni de afișare.
LCD-ul funcționează prin protocolul I2C, care permite comunicarea pe două fire (SDA și SCL). Acest lucru simplifică cablarea și reduce numărul de pini necesari pe ESP32. Conexiunea la serverul NTP se realizează folosind capacitățile Wi-Fi ale ESP32, permițând actualizări în timp real.
- Asigurați o tensiune corectă de alimentare (5 V).
- Utilizați condensatoare de decuplare lângă pinii de alimentare pentru stabilitate.
- Fiți atenți la conexiunile I2C pentru a evita conflictele de magistrală.
- Verificați adresa I2C a LCD-ului (0x27 sau 0x3F).
- Verificați datele de autentificare Wi-Fi pentru o conexiune corectă.
- Gestionați ajustările pentru ora de vară în codul dumneavoastră.
- Utilizați serverul NTP corect pentru locația dumneavoastră geografică.
- Ștergeți întotdeauna LCD-ul înainte de a actualiza afișajul.
Instrucțiuni de Cablare

Pentru a cabla ESP32 cu LCD-ul, începeți prin conectarea pinilor de alimentare. Conectați VCC-ul LCD-ului la pinul de 5V de pe ESP32 și pinul GND al LCD-ului la pinul GND de pe ESP32. Pentru comunicarea I2C, conectați pinul SDA al LCD-ului la GPIO 21 de pe ESP32 și pinul SCL la GPIO 22. Asigurați-vă că conexiunile sunt sigure pentru a evita problemele de comunicare.
Când configurați cablarea, utilizați fire de legătură male-to-female pentru conexiuni ușoare. Dacă LCD-ul dumneavoastră are o adresă I2C sau o configurație de pini diferită, ajustați codul în consecință. Consultați videoclipul (în videoclip la 05:30) pentru opțiuni alternative de cablare dacă este necesar.
Exemple de Cod și Explicații
Codul inițializează LCD-ul și configurează conexiunea Wi-Fi pentru a prelua datele de timp de la serverul NTP. Identificatori cheie precum ssid și password sunt utilizați pentru a se conecta la rețeaua Wi-Fi, în timp ce ntpServer1 și ntpServer2 specifică serverele NTP de utilizat.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Acest fragment arată datele de autentificare ale rețelei și adresele serverelor. Asigurați-vă că introduceți corect SSID-ul și parola Wi-Fi, deoarece orice greșeală va împiedica ESP32 să se conecteze la internet.
În funcția printLocalTime(), ora curentă este formatată pentru afișare. Structura tm este utilizată pentru a stoca informațiile despre timp, în timp ce strftime ajută la formatarea orei într-un șir lizibil.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Acest cod verifică dacă ora locală este disponibilă și preia ora. Ora formatată este apoi utilizată pentru a afișa ora curentă pe LCD. Dacă ora nu este încă disponibilă, afișează un mesaj în Monitorul Serial.
În final, funcția setup() inițializează LCD-ul și se conectează la Wi-Fi. De asemenea, configurează setările serverului NTP și setează un callback pentru sincronizarea timpului.
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);
Acest extras inițializează Monitorul Serial pentru depanare, configurează LCD-ul și încearcă să se conecteze la rețeaua Wi-Fi specificată. Starea conexiunii va fi afișată în Monitorul Serial, permițându-vă să verificați conexiunea.
Demonstrație / Ce să Vă Așteptați
După configurarea cu succes, LCD-ul va afișa ora curentă, ziua săptămânii și data. Vă puteți aștepta ca ora să se actualizeze la fiecare 5 secunde, datorită funcției loop(). Dacă conexiunea la serverul NTP eșuează, un mesaj va apărea în Monitorul Serial indicând că ora nu este încă disponibilă (în videoclip la 12:00).
Capcanele comune includ cablarea incorectă, adrese I2C greșite și date de autentificare Wi-Fi incorecte. Asigurați-vă că toate conexiunile sunt sigure și că serverul NTP este accesibil din rețeaua dumneavoastră.
Marcaje Temporale din Videoclip
- 00:00 Început
- 2:10 Introducere
- 5:15 Cablare explicată
- 7:32 Cod Arduino explicat
- 18:43 Selectarea plăcii ESP32 și a portului COM în Arduino IDE
- 20:27 Demonstrația Ceasului de 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
Lucruri de care ai putea avea nevoie
-
AmazonBuy LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Resurse și referințe
-
ExternPurchase LCD1602 display from Banggoodbanggood.com
Fișiere📁
Fișier necesar (.h)
-
TZ.h
TZ.h0.02 MB