ESP32 ቱቶሪያል 53/55 - የLCD ኢንተርኔት ሰዓት ይገንቡ | የSunFounder ESP32 IoT መማሪያ ኪት
በዚህ ትምህርት ውስጥ፣ ከSunFounder የተገኘውን ESP32 ማይክሮኮንትሮለር በመጠቀም ከበይነመረብ ጋር የተገናኘ ኤልሲዲ ሰዓት እንገነባለን። ይህ ሰዓት በራስ-ሰር ከበይነመረብ ጋር በመመሳሰል የአሁኑን ሰዓት ያሳያል፣ ሰዓቱን በ12-ሰዓት ወይም በ24-ሰዓት ቅርጸት፣ ከሳምንቱ ቀን፣ ቀን እና ወር ጋር በማሳየት ነው። የአውታረ መረብ ጊዜ ፕሮቶኮል (NTP) መጠቀም ሰዓቱ ያለ በእጅ ማስተካከያ ትክክለኛ ሆኖ እንዲቆይ ያደርጋል።
ይህ ፕሮጀክት የESP32ን አብሮ የተሰራ የWi-Fi አቅም በመጠቀም የአሁኑን ሰዓት ከNTP አገልጋይ ያመጣል። ሰዓቱን ለማሳየት ፈሳሽ ክሪስታል ማሳያ (LCD) እንጠቀማለን፣ ይህም እንደ ተጠቃሚው ምርጫ ቅርጸት ሊዘጋጅ ይችላል። ለተጨማሪ ማብራሪያ በማንኛውም ደረጃ ላይ፣ እባክዎ ቪዲዮውን ይመልከቱ (በቪዲዮው በ00:30)።
ሃርድዌር ተብራርቷል
ለዚህ ፕሮጀክት ዋና ዋና ክፍሎች የESP32 ማይክሮኮንትሮለር፣ የ20x4 ኤልሲዲ ማሳያ እና የኃይል ምንጭ ያካትታሉ። ESP32 አብሮ የተሰራ Wi-Fi እና ብሉቱዝ ያለው ኃይለኛ ማይክሮኮንትሮለር ነው፣ ለIoT ፕሮጀክቶች ተስማሚ ያደርገዋል። ኤልሲዲው ሰዓትን እና ቀንን ለማሳየት ይጠቅማል፣ እና ለተለያዩ የማሳያ መጠኖች ሊዋቀር ይችላል።
ኤልሲዲው የሚሰራው በI2C ፕሮቶኮል ነው፣ ይህም በሁለት ሽቦዎች (SDA እና SCL) ላይ ግንኙነት እንዲኖር ያስችላል። ይህ ሽቦን ያቃልላል እና በESP32 ላይ የሚያስፈልጉትን ፒኖች ቁጥር ይቀንሳል። ከNTP አገልጋይ ጋር ያለው ግንኙነት የESP32ን የWi-Fi አቅም በመጠቀም ነው፣ ይህም በእውነተኛ ጊዜ ዝማኔዎችን ያስችላል።
- ትክክለኛውን የኃይል አቅርቦት ቮልቴጅ (5 ቪ) ያረጋግጡ።
- ለመረጋጋት በኃይል ፒኖች አጠገብ የመበታተን መያዣዎችን (decoupling capacitors) ይጠቀሙ።
- የአውቶቡስ ግጭቶችን ለማስቀረት በI2C ግንኙነቶች ላይ ጠንቃቃ ይሁኑ።
- የኤልሲዲውን I2C አድራሻ (0x27 ወይም 0x3F) ያረጋግጡ።
- ለትክክለኛ ግንኙነት የWi-Fi ምስክርነቶችን ያረጋግጡ።
- በኮድዎ ውስጥ የቀን ብርሃን ቆጣቢ ጊዜ ማስተካከያዎችን ያስተናግዱ።
- ለጂኦግራፊያዊ አካባቢዎ ትክክለኛውን NTP አገልጋይ ይጠቀሙ።
- ማሳያውን ከማዘመንዎ በፊት ሁልጊዜ ኤልሲዲውን ያጽዱ።
የሽቦ መጫኛ መመሪያዎች

ESP32ን ከኤልሲዲ ጋር ለማገናኘት፣ በመጀመሪያ የኃይል ፒኖችን በማገናኘት ይጀምሩ። የኤልሲዲውን VCC በESP32 ላይ ካለው 5V ፒን ጋር እና የኤልሲዲውን GND ፒን በESP32 ላይ ካለው GND ፒን ጋር ያገናኙ። ለI2C ግንኙነት፣ የኤልሲዲውን SDA ፒን በESP32 ላይ ካለው GPIO 21 ጋር እና የSCL ፒንን ከGPIO 22 ጋር ያገናኙ። የግንኙነት ችግሮችን ለማስቀረት ግንኙነቶቹ ደህንነታቸው የተጠበቀ መሆናቸውን ያረጋግጡ።
ሽቦውን ሲያዘጋጁ፣ ለቀላል ግንኙነቶች ወንድ-ወደ-ሴት ዝላይ ሽቦዎችን ይጠቀሙ። የእርስዎ ኤልሲዲ የተለየ I2C አድራሻ ወይም የፒን ውቅር ካለው፣ ኮዱን በዚሁ መሰረት ያስተካክሉ። አስፈላጊ ከሆነ ለአማራጭ የሽቦ አማራጮች ቪዲዮውን ይመልከቱ (በቪዲዮው በ05:30)።
የኮድ ምሳሌዎች እና ጉዞ
ኮዱ ኤልሲዲውን ያስጀምራል እና ከNTP አገልጋይ የጊዜ ውሂብ ለማግኘት የWi-Fi ግንኙነትን ያዘጋጃል። እንደ ssid እና password ያሉ ቁልፍ መለያዎች ወደ Wi-Fi አውታረ መረብ ለመገናኘት ያገለግላሉ፣ ntpServer1 እና ntpServer2 ደግሞ የሚጠቀሙባቸውን NTP አገልጋዮች ይገልጻሉ።
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
ይህ ቁራጭ የአውታረ መረብ ምስክርነቶችን እና የአገልጋይ አድራሻዎችን ያሳያል። የWi-Fi SSID እና የይለፍ ቃልዎን በትክክል ማስገባትዎን ያረጋግጡ፣ ምክንያቱም ማንኛውም ስህተት ESP32 ከበይነመረብ ጋር እንዳይገናኝ ይከላከላል።
በprintLocalTime() ተግባር ውስጥ፣ የአሁኑ ሰዓት ለማሳየት ቅርጸት ተዘጋጅቷል። የtm መዋቅር የጊዜ መረጃን ለማከማቸት ያገለግላል፣ strftime ደግሞ ጊዜውን ወደ ሚነበብ ሕብረቁምፊ ለመቅረጽ ይረዳል።
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
ይህ ኮድ የአካባቢ ሰዓት መገኘቱን ያረጋግጣል እና ሰዓቱን ያመጣል። የተቀረጸው ሰዓት በኤልሲዲ ላይ የአሁኑን ሰዓት ለማሳየት ያገለግላል። ጊዜው ገና ካልተገኘ፣ በተከታታይ መቆጣጠሪያ (Serial Monitor) ላይ መልእክት ያትማል።
በመጨረሻም፣ የsetup() ተግባር ኤልሲዲውን ያስጀምራል እና ከWi-Fi ጋር ይገናኛል። እንዲሁም የNTP አገልጋይ ቅንብሮችን ያዋቅራል እና ለጊዜ ማመሳሰል ጥሪ ተግባር (callback) ያዘጋጃል።
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);
ይህ ቁራጭ ለማረም የተከታታይ መቆጣጠሪያውን ያስጀምራል፣ ኤልሲዲውን ያዘጋጃል እና ከተገለጸው Wi-Fi አውታረ መረብ ጋር ለመገናኘት ይሞክራል። የግንኙነት ሁኔታው በተከታታይ መቆጣጠሪያው ላይ ይታተማል፣ ይህም ግንኙነቱን እንዲያረጋግጡ ያስችልዎታል።
ማሳያ / ምን እንደሚጠበቅ
በተሳካ ሁኔታ ከተዘጋጀ በኋላ፣ ኤልሲዲው የአሁኑን ሰዓት፣ የሳምንቱን ቀን እና ቀኑን ያሳያል። ሰዓቱ በየ5 ሰከንድ እንደሚዘመን መጠበቅ ይችላሉ፣ ለloop() ተግባር ምስጋና ይግባው። ከNTP አገልጋይ ጋር ያለው ግንኙነት ካልተሳካ፣ ጊዜው ገና እንደማይገኝ የሚያሳይ መልእክት በተከታታይ መቆጣጠሪያው ላይ ይታያል (በቪዲዮው በ12:00)።
የተለመዱ ችግሮች የተሳሳተ ሽቦ፣ የተሳሳቱ I2C አድራሻዎች እና የተሳሳቱ የWi-Fi ምስክርነቶች ያካትታሉ። ሁሉም ግንኙነቶች ደህንነታቸው የተጠበቀ እና NTP አገልጋዩ ከአውታረ መረብዎ መድረስ የሚችል መሆኑን ያረጋግጡ።
የቪዲዮ ጊዜ ምልክቶች
- 00:00 መጀመሪያ
- 2:10 መግቢያ
- 5:15 ሽቦ ተብራርቷል
- 7:32 የአርዱኢኖ ኮድ ተብራርቷል
- 18:43 በአርዱኢኖ IDE ውስጥ የESP32 ቦርድ እና COM ወደብ መምረጥ
- 20:27 የበይነመረብ ሰዓት ማሳያ
/*
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
እንደሚያስፈልግዎት ይችላል
-
አማዞንBuy LCD1602-I2C from Amazonamzn.to
-
ኢቤይPurchase LCD1602-I2C from eBayebay.us
-
ባንጉድPurchase LCD1602 display from Banggoodbanggood.com
ምንጮች እና ምንጮች
-
ውስጥPurchase LCD1602 display from Banggoodbanggood.com
ፋይሎች📁
የተያዘ ፋይል (.h)
-
TZ.h
TZ.h0.02 MB