Tutorial ESP32 53/55 - Dhis saacad Internet ah oo LCD ah | Qalabka Barashada ESP32 IoT ee SunFounder
Cashigarkani, waxaan ku dhisi doonnaa saacad LCD oo ku xidhan internetka iyadoo la adeegsanayo kontoroolaha ESP32 ee SunFounder. Saacaddan waxay si otomaatig ah ula socon doontaa waqtiga hadda jira iyada oo loo marayo internetka, waxayna soo bandhigi doontaa waqtiga qaab 12-saacadood ama 24-saacadood, iyadoo ay weheliso maalinta toddobaadka, taariikhda, iyo bisha. Adeegsiga Borotokoolka Waqtiga Shabakadda (NTP) wuxuu hubinayaa in saacaddu ay si sax ah u tahay iyada oo aan loo baahnayn hagaajin gacmeed.
Mashruucani wuxuu ka faa'iideysanayaa awoodaha Wi-Fi ee ku dhisan ESP32 si uu waqtiga hadda jira uga soo qaado server-ka NTP. Waxaanu adeegsan doonnaa Muujinaha Qarqoodhka (LCD) si aanu u soo bandhigno waqtiga, kaas oo loo qaabayn karo si waafaqsan dookha isticmaalaha. Haddii aad u baahan tahay caddayn dheeri ah oo ku saabsan tillaabooyinka, fadlan fiiri fiidiyowga (fiidiyowga 00:30).
Qalabka La Sharxay
Qaybaha aasaasiga ah ee mashruucan waxaa ka mid ah kontoroolaha ESP32, muujin LCD 20x4 ah, iyo ilo koronto. ESP32 waa kontorool awood badan oo leh Wi-Fi iyo Bluetooth ku dhisan, taasoo ka dhigaysa mid ku habboon mashruucyada IoT. LCD-ga waxaa loo isticmaalaa in lagu muujiyo waqtiga iyo taariikhda, waxaana loo qaabayn karaa cabbirro muujin oo kala duwan.
LCD-ga wuxuu u shaqeeyaa iyada oo loo marayo borotokoolka I2C, kaas oo u oggolaanaya isgaarsiin laba silig (SDA iyo SCL). Tani waxay fududaynaysaa fiilooyinka waxayna yaraynaysaa tirada biinanka loo baahan yahay ee ESP32. Ku xidhka server-ka NTP waxaa lagu sameeyaa iyada oo la adeegsanayo awoodaha Wi-Fi ee ESP32, taasoo u oggolaanaysa cusboonaysiin waqti-dhab ah.
- Hubi in korontada ay tahay mid sax ah (5 V).
- Isticmaal capacitors-ka kala-goynta meelaha u dhow biinanka korontada si loo helo xasillooni.
- Ka digtoonow ku xidhka I2C si looga fogaado isku dhacyada baska.
- Xaqiiji cinwaanka I2C ee LCD-ga (0x27 ama 0x3F).
- Hubi aqoonsiga Wi-Fi si aad ugu xidhid si sax ah.
- Maaree hagaajinta waqtiga cadceeda (daylight saving) ee koodhkaaga.
- Isticmaal server-ka NTP ee saxda ah ee goobtaada juqraafiyeed.
- Had iyo jeer nadiifi LCD-ga ka hor intaadan cusboonaysiin muujinta.
Tilmaamaha Fiilooyinka

Si aad ugu xidhid ESP32-ga LCD-ga, waxaad ku bilaabi doontaa ku xidhka biinanka korontada. Ku xidh VCC-ga LCD-ga biinka 5V ee ESP32-ga iyo biinka GND ee LCD-ga biinka GND ee ESP32-ga. Isgaarsiinta I2C, ku xidh biinka SDA ee LCD-ga GPIO 21 ee ESP32-ga iyo biinka SCL GPIO 22. Hubi in ku xidhku yahay mid adag si looga fogaado dhibaatooyinka isgaarsiinta.
Markaad dejineyso fiilooyinka, isticmaal fiilooyinka jumper-ka lab ila dheddig si aad ugu xidhid si fudud. Haddii LCD-gaagu leeyahay cinwaan I2C ama qaab biin oo kala duwan, hagaaji koodhka si waafaqsan. Fiiri fiidiyowga (fiidiyowga 05:30) si aad u hesho ikhtiyaarrada fiilooyinka kale haddii loo baahdo.
Tusaalooyinka Koodhka & Sharaxaad
Koodhku wuxuu bilaabaa LCD-ga wuxuuna dejineyaa ku xidhka Wi-Fi si uu waqtiga uga soo qaado server-ka NTP. Aqoonsiyada muhiimka ah sida ssid iyo password waxaa loo isticmaalaa in lagu xidho shabakadda Wi-Fi, halka ntpServer1 iyo ntpServer2 ay qeexayaan server-yada NTP ee la isticmaalayo.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Qaybtani waxay muujinaysaa aqoonsiga shabakadda iyo cinwaannada server-ka. Hubi inaad si sax ah u geliso SSID-ga Wi-Fi-gaaga iyo erayga sirta ah, sababtoo ah qalad kasta wuxuu ka hor istaagi doonaa ESP32-ga inuu ku xidhmo internetka.
Shayga printLocalTime(), waqtiga hadda jira waxaa loo qaabaynayaa si loo muujiyo. Qaab-dhismeedka tm waxaa loo isticmaalaa in lagu kaydiyo macluumaadka waqtiga, halka strftime ay ka caawiso qaabaynta waqtiga si loo helo xarfo la akhriyi karo.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Koodhkani wuxuu hubinayaa in waqtiga maxalliga ah uu jiro wuxuuna soo saarayaa saacadda. Saacadda la qaabeeyey ayaa markaa loo isticmaalaa in lagu muujiyo waqtiga hadda jira ee LCD-ga. Haddii waqtigu uusan weli jirin, waxay daabacdaa farriin ku taal Serial Monitor-ka.
Ugu dambeyntii, shayga setup() wuxuu bilaabaa LCD-ga wuxuuna ku xidhmaa Wi-Fi. Waxa kale oo uu qaabeeyaa dejinta server-ka NTP wuxuuna dejiyaa wicitaan-ku-soo-noqosho (callback) iskuxidhka waqtiga.
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);
Qaybtani waxay bilaabaysaa Serial Monitor-ka si loo ogaado khaladaadka, waxay dejineysaa LCD-ga, waxayna isku daydaa inay ku xidhdo shabakadda Wi-Fi ee la cayimay. Heerka ku xidhka waxaa lagu daabici doonaa Serial Monitor-ka, taasoo kuu oggolaanaysa inaad xaqiijiso ku xidhka.
Banaanbax / Waxa Lagu Filan Karaa
Marka dejintu guulaysato, LCD-ga wuxuu soo bandhigi doonaa waqtiga hadda jira, maalinta toddobaadka, iyo taariikhda. Waxaad filan kartaa in waqtigu uu cusboonaado 5 ilbiriqsi kasta, iyada oo loo mahadcelinayo shayga loop(). Haddii ku xidhka server-ka NTP uu guuldareysto, farriin ayaa ka soo bixi doonta Serial Monitor-ka oo muujinaysa in waqtigu uusan weli jirin (fiidiyowga 12:00).
Khaladaadka caadiga ah waxaa ka mid ah fiilooyinka qaldan, cinwaannada I2C ee khaldan, iyo aqoonsiga Wi-Fi ee khaldan. Hubi in dhammaan ku xidhka ay yihiin kuwo adag iyo in server-ka NTP uu ka heli karo shabakaddaada.
Waqtiyada Fiidiyowga
- 00:00 Bilow
- 2:10 Hordhac
- 5:15 Fiilooyinka la sharxay
- 7:32 Koodhka Arduino la sharxay
- 18:43 Doorashada guddiga ESP32 iyo dekedda COM ee Arduino IDE
- 20:27 Banaanbaxa Saacadda Internetka
/*
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
Waad u baahan tahay
-
AmaazonBuy LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Kheyraadka & Tixraacyada
-
DibeddaPurchase LCD1602 display from Banggoodbanggood.com
Faylasha📁
Faylka Loo Baahan Yahay (.h)
-
TZ.h
TZ.h0.02 MB