Koyarwar ESP32 53/55 - Gina Agogon Intanet na LCD | Kayan Koyon ESP32 IoT na SunFounder
A cikin wannan koyaswar, za mu gina agogon LCD mai haɗin Intanet ta amfani da microcontroller na ESP32 daga SunFounder. Wannan agogon zai daidaita kansa zuwa lokacin yanzu ta hanyar Intanet, yana nuna lokaci a tsarin sa'o'i 12 ko 24, tare da ranar mako, kwanan wata, da wata. Amfani da Network Time Protocol (NTP) yana tabbatar da cewa agogon ya kasance daidai ba tare da gyara da hannu ba.
Wannan aikin yana amfani da damar Wi-Fi da ke cikin ESP32 don ɗauko lokacin yanzu daga uwar garken NTP. Za mu yi amfani da Liquid Crystal Display (LCD) don nuna lokacin, wanda za a iya tsara shi bisa ga zaɓin mai amfani. Don ƙarin bayani kan kowane mataki, da fatan za a koma ga bidiyon (a bidiyon a 00:30).
Bayanin Kayan Aiki
Abubuwan farko na wannan aikin sun haɗa da microcontroller na ESP32, nunin LCD 20x4, da tushen wutar lantarki. ESP32 microcontroller ne mai ƙarfi tare da Wi-Fi da Bluetooth da ke ciki, wanda ya dace da ayyukan IoT. Ana amfani da LCD don nuna lokaci da kwanan wata, kuma ana iya saita shi don girman nuni daban-daban.
LCD yana aiki ta hanyar ka'idar I2C, wanda ke ba da damar sadarwa ta wayoyi biyu (SDA da SCL). Wannan yana sauƙaƙa haɗin wayoyi kuma yana rage adadin fil ɗin da ake buƙata akan ESP32. Haɗin zuwa uwar garken NTP ana yin shi ta amfani da damar Wi-Fi na ESP32, wanda ke ba da damar sabuntawa a lokaci guda.
- Tabbatar da daidaitaccen ƙarfin wutar lantarki (5 V).
- Yi amfani da capacitors na decoupling kusa da fil ɗin wutar don kwanciyar hankali.
- Yi hankali da haɗin I2C don guje wa rikice-rikice na bas.
- Tabbatar da adireshin I2C na LCD (0x27 ko 0x3F).
- Duba bayanan shiga Wi-Fi don ingantaccen haɗi.
- Sarrafa gyare-gyaren lokacin rana a cikin lambar ku.
- Yi amfani da daidaitaccen uwar garken NTP don wurin da kuke.
- Koyaushe share LCD kafin sabunta nuni.
Umarnin Haɗin Wayoyi

Don haɗa ESP32 da LCD, fara da haɗa fil ɗin wutar lantarki. Haɗa VCC na LCD zuwa fil ɗin 5V akan ESP32 da fil ɗin GND na LCD zuwa fil ɗin GND akan ESP32. Don sadarwar I2C, haɗa fil ɗin SDA na LCD zuwa GPIO 21 akan ESP32 da fil ɗin SCL zuwa GPIO 22. Tabbatar cewa haɗin suna da ƙarfi don guje wa matsalolin sadarwa.
Lokacin saita haɗin wayoyi, yi amfani da wayoyin jumper na maza-zuwa-mata don sauƙin haɗi. Idan LCD ɗinku yana da adireshin I2C daban ko tsarin fil daban, daidaita lambar yadda ya kamata. Koma ga bidiyon (a bidiyon a 05:30) don zaɓuɓɓukan haɗin wayoyi daban idan ya cancanta.
Misalan Lamba & Bayani
Lambar tana fara LCD kuma tana saita haɗin Wi-Fi don ɗauko bayanan lokaci daga uwar garken NTP. Ana amfani da masu gano maɓalli kamar ssid da password don haɗawa da hanyar sadarwar Wi-Fi, yayin da ntpServer1 da ntpServer2 ke ƙayyade uwar garken NTP da za a yi amfani da su.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Wannan ɓangaren yana nuna bayanan shiga hanyar sadarwa da adiresoshin uwar garken. Tabbatar kun shigar da SSID da kalmar sirri na Wi-Fi ɗinku daidai, domin duk wani kuskure zai hana ESP32 haɗawa da Intanet.
A cikin aikin printLocalTime(), ana tsara lokacin yanzu don nuni. Ana amfani da tsarin tm don adana bayanan lokaci, yayin da strftime ke taimakawa tsara lokaci zuwa kirtani mai karantawa.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Wannan lambar tana duba ko lokacin gida yana samuwa kuma tana ɗauko sa'a. Ana amfani da sa'ar da aka tsara don nuna lokacin yanzu akan LCD. Idan lokaci bai samu ba tukuna, yana buga saƙo zuwa Serial Monitor.
A ƙarshe, aikin setup() yana fara LCD kuma yana haɗawa da Wi-Fi. Hakanan yana saita saitunan uwar garken NTP kuma yana saita kiran baya don daidaita lokaci.
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);
Wannan ɓangaren yana fara Serial Monitor don gyara kurakurai, yana saita LCD, kuma yana ƙoƙarin haɗawa da hanyar sadarwar Wi-Fi da aka ƙayyade. Za a buga matsayin haɗin zuwa Serial Monitor, wanda zai ba ku damar tabbatar da haɗin.
Nuni / Abin da Za Ku Yi Tsammani
Bayan nasarar saiti, LCD zai nuna lokacin yanzu, ranar mako, da kwanan wata. Kuna iya tsammanin lokacin zai sabunta kowane daƙiƙa 5, godiya ga aikin loop(). Idan haɗin zuwa uwar garken NTP ya gaza, saƙo zai bayyana akan Serial Monitor yana nuna cewa lokacin bai samu ba tukuna (a bidiyon a 12:00).
Matsalolin gama gari sun haɗa da haɗin wayoyi mara daidai, adiresoshin I2C mara daidai, da bayanan shiga Wi-Fi mara daidai. Tabbatar cewa duk haɗin suna da ƙarfi kuma uwar garken NTP yana iya isa daga hanyar sadarwar ku.
Lokutan Bidiyo
- 00:00 Farko
- 2:10 Gabatarwa
- 5:15 Bayanin haɗin wayoyi
- 7:32 Bayanin lambar Arduino
- 18:43 Zaɓin board ɗin ESP32 da tashar COM a cikin Arduino IDE
- 20:27 Nuni na Agogon Intanet
/*
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
Abin da zaka iya bukata
-
AmazonBuy LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Albarkatun da kuma shafukan da za a duba
-
WajePurchase LCD1602 display from Banggoodbanggood.com
Fayiloli📁
Fayil da ake buƙata (.h)
-
TZ.h
TZ.h0.02 MB