ESP32 Tutorijal 53/55 - Napravi LCD internet sat | SunFounder-ov ESP32 IoT komplet za učenje
U ovom tutorijalu ćemo napraviti internet povezani LCD sat koristeći ESP32 mikrokontroler od kompanije SunFounder. Ovaj sat će se automatski sinhronizovati sa trenutnim vremenom putem interneta, prikazujući vrijeme u 12-satnom ili 24-satnom formatu, zajedno sa danom u sedmici, datumom i mjesecom. Korištenje Mrežnog vremenskog protokola (NTP) osigurava da sat ostane tačan bez ručnih podešavanja.
Ovaj projekat koristi ugrađene Wi-Fi mogućnosti ESP32 mikrokontrolera za preuzimanje trenutnog vremena sa NTP servera. Koristit ćemo LCD ekran sa tekućim kristalima (Liquid Crystal Display - LCD) za prikaz vremena, koje se može formatirati prema korisničkim preferencijama. Za dodatna pojašnjenja bilo kojeg koraka, molimo pogledajte video (na videu u 00:30).
Objašnjenje hardvera
Glavne komponente za ovaj projekat uključuju ESP32 mikrokontroler, 20x4 LCD ekran i izvor napajanja. ESP32 je moćan mikrokontroler sa ugrađenim Wi-Fi i Bluetooth mogućnostima, što ga čini pogodnim za IoT projekte. LCD se koristi za prikaz vremena i datuma, i može se konfigurisati za različite veličine ekrana.
LCD radi putem I2C protokola, koji omogućava komunikaciju preko dvije žice (SDA i SCL). Ovo pojednostavljuje ožičenje i smanjuje broj pinova potrebnih na ESP32. Povezivanje sa NTP serverom se vrši koristeći Wi-Fi mogućnosti ESP32, omogućavajući ažuriranja u realnom vremenu.
- Osigurajte ispravan napon napajanja (5 V).
- Koristite kondenzatore za razdvajanje blizu pinova napajanja radi stabilnosti.
- Budite oprezni sa I2C vezama kako biste izbjegli konflikte na magistrali.
- Provjerite I2C adresu LCD-a (0x27 ili 0x3F).
- Provjerite Wi-Fi akreditive za tačno povezivanje.
- Upravljajte podešavanjima ljetnog računanja vremena u svom kodu.
- Koristite ispravan NTP server za vašu geografsku lokaciju.
- Uvijek očistite LCD prije ažuriranja prikaza.
Upute za ožičenje

Za povezivanje ESP32 sa LCD-om, počnite spajanjem pinova napajanja. Povežite VCC pin LCD-a na 5V pin na ESP32 i GND pin LCD-a na GND pin na ESP32. Za I2C komunikaciju, povežite SDA pin LCD-a na GPIO 21 na ESP32 i SCL pin na GPIO 22. Osigurajte da su veze sigurne kako biste izbjegli bilo kakve komunikacijske probleme.
Prilikom postavljanja ožičenja, koristite muško-ženske premosne žice za jednostavno povezivanje. Ako vaš LCD ima drugačiju I2C adresu ili konfiguraciju pinova, prilagodite kod u skladu s tim. Pogledajte video (na videu u 05:30) za alternativne opcije ožičenja ako je potrebno.
Primjeri koda i objašnjenje
Kod inicijalizira LCD i postavlja Wi-Fi vezu za preuzimanje podataka o vremenu sa NTP servera. Ključni identifikatori kao što su ssid i password koriste se za povezivanje na Wi-Fi mrežu, dok ntpServer1 i ntpServer2 specificiraju NTP servere koje treba koristiti.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Ovaj isječak prikazuje mrežne akreditive i adrese servera. Osigurajte da tačno unesete svoj Wi-Fi SSID i lozinku, jer bilo koja greška će spriječiti ESP32 da se poveže na internet.
U funkciji printLocalTime(), trenutno vrijeme se formatira za prikaz. Struktura tm se koristi za pohranjivanje informacija o vremenu, dok strftime pomaže u formatiranju vremena u čitljiv niz.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Ovaj kod provjerava da li je lokalno vrijeme dostupno i preuzima sat. Formatirani sat se zatim koristi za prikaz trenutnog vremena na LCD-u. Ako vrijeme još nije dostupno, ispisuje poruku na Serial Monitor.
Konačno, funkcija setup() inicijalizira LCD i povezuje se na Wi-Fi. Također konfiguriše postavke NTP servera i postavlja povratni poziv za sinhronizaciju vremena.
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);
Ovaj izvod inicijalizira Serial Monitor za otklanjanje grešaka, postavlja LCD i pokušava se povezati na specificiranu Wi-Fi mrežu. Status veze će biti ispisan na Serial Monitor, omogućavajući vam da provjerite vezu.
Demonstracija / Šta očekivati
Nakon uspješnog postavljanja, LCD će prikazati trenutno vrijeme, dan u sedmici i datum. Možete očekivati da se vrijeme ažurira svakih 5 sekundi, zahvaljujući funkciji loop(). Ako veza sa NTP serverom ne uspije, poruka će se pojaviti na Serial Monitoru koja ukazuje da vrijeme još nije dostupno (na videu u 12:00).
Uobičajene zamke uključuju pogrešno ožičenje, pogrešne I2C adrese i pogrešne Wi-Fi akreditive. Osigurajte da su sve veze sigurne i da je NTP server dostupan sa vaše mreže.
Vremenske oznake videa
- 00:00 Početak
- 2:10 Uvod
- 5:15 Objašnjeno ožičenje
- 7:32 Objašnjen Arduino kod
- 18:43 Odabir ESP32 ploče i COM porta u Arduino IDE
- 20:27 Demonstracija internet sata
/*
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
Things you might need
-
AmazonPurchase LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Resources & references
-
ExternalPurchase LCD1602 display from Banggoodbanggood.com
Files📁
Required File (.h)
-
TZ.h
TZ.h0.02 MB