Èkọ́ ESP32 53/55 - Kọ́ Aago Ayelujara LCD | Àkójọpọ̀ Ẹ̀kọ́ IoT ESP32 ti SunFounder
Nínú ẹ̀kọ́ yìí, a óò kọ́ aago LCD tí ó ní ìsopọ̀ pẹ̀lú Internet ní lílo microcontroller ESP32 láti ọ̀dọ̀ SunFounder. Aago yìí yóò máa ṣàtúnṣe ara rẹ̀ sí àkókò lọ́wọ́lọ́wọ́ nípasẹ̀ Internet, tí yóò máa fi àkókò hàn ní ọ̀nà wákàtí 12 tàbí 24, pẹ̀lú ọjọ́ ọ̀sẹ̀, ọjọ́, àti oṣù. Lílo Network Time Protocol (NTP) ṣe ìrànlọ́wọ́ kí aago náà lè wà pípé láìsí àtúnṣe ọwọ́.
Ìṣẹ̀mí yìí ń lo agbára Wi-Fi tí ó wà nínú ESP32 láti gba àkókò lọ́wọ́lọ́wọ́ láti ọ̀dọ̀ olùpèsè NTP. A óò lo Liquid Crystal Display (LCD) láti fi àkókò hàn, èyí tí a lè ṣètò ní ìbámu pẹ̀lú ìfẹ́ olùmúlò. Fún àlàyé síwájú síi lórí àwọn ìgbésẹ̀ kọ̀ọ̀kan, jọ̀wọ́ wo fídíò náà (nínú fídíò ní 00:30).
Ohun èlò tí a ṣàlàyé
Àwọn èròjà pàtàkì fún ìṣẹ̀mí yìí pẹ̀lú microcontroller ESP32, LCD 20x4, àti orísun agbára. ESP32 jẹ́ microcontroller alágbára pẹ̀lú Wi-Fi àti Bluetooth tí ó wà nínú rẹ̀, tí ó sì yẹ fún àwọn ìṣẹ̀mí IoT. A ń lo LCD láti fi àkókò àti ọjọ́ hàn, a sì lè ṣètò rẹ̀ fún àwọn ìwọ̀n ìfihàn tí ó yàtọ̀.
LCD ń ṣiṣẹ́ nípasẹ̀ ìlànà I2C, èyí tí ó gba ìbánisọ̀rọ̀ lórí wáyà méjì (SDA àti SCL). Èyí rọrùn ìsopọ̀ wáyà àti dín àwọn pin tí a nílò lórí ESP32 kù. Ìsopọ̀ sí olùpèsè NTP ni a ṣe ní lílo agbára Wi-Fi ti ESP32, tí ó ń mú kí àwọn ìmúdójúìwọ̀n wà ní àkókò gidi.
- Rí i dájú pé foltaje agbára tó tọ́ (5 V) wà.
- Lo àwọn capacitors ìyapa nítòsí àwọn pin agbára fún ìdúróṣinṣin.
- Ṣọ́ra pẹ̀lú àwọn ìsopọ̀ I2C láti yẹra fún àwọn ìforígbárí lórí bọsì.
- Ṣààyẹ̀wò àdírẹ́sì I2C ti LCD (0x27 tàbí 0x3F).
- Ṣàyẹ̀wò àwọn ìsọfúnni Wi-Fi fún ìsopọ̀ pípé.
- Ṣàkóso àwọn àtúnṣe àkókò oòrùn ní inú kóòdù rẹ.
- Lo olùpèsè NTP tí ó tọ́ fún ẹkùn ilẹ̀ rẹ.
- Máa sọ LCD di mímọ́ kí o tó ṣe ìmúdójúìwọ̀n ìfihàn.
Àwọn ìtọ́nisọ́nà ìsopọ̀ wáyà

Láti so ESP32 pọ̀ mọ́ LCD, bẹ̀rẹ̀ nípa sísopọ̀ àwọn pin agbára. So VCC ti LCD pọ̀ mọ́ pin 5V lórí ESP32 àti pin GND ti LCD pọ̀ mọ́ pin GND lórí ESP32. Fún ìbánisọ̀rọ̀ I2C, so pin SDA ti LCD pọ̀ mọ́ GPIO 21 lórí ESP32 àti pin SCL pọ̀ mọ́ GPIO 22. Rí i dájú pé àwọn ìsopọ̀ náà ṣinṣin láti yẹra fún àwọn ìṣòro ìbánisọ̀rọ̀.
Nígbà tí o ń ṣètò ìsopọ̀ wáyà, lo àwọn wáyà jumper akọ-abo fún ìsopọ̀ rọrùn. Bí LCD rẹ bá ní àdírẹ́sì I2C tàbí ìtòlẹ́sẹẹsẹ pin tí ó yàtọ̀, ṣàtúnṣe kóòdù náà ní ìbámu. Wo fídíò náà (nínú fídíò ní 05:30) fún àwọn àṣàyàn ìsopọ̀ wáyà mìíràn bí ó bá pọn dandan.
Àwọn àpẹẹrẹ kóòdù & Ìṣàlàyé
Kóòdù náà ń bẹ̀rẹ̀ LCD àti ṣètò ìsopọ̀ Wi-Fi láti gba àkókò láti ọ̀dọ̀ olùpèsè NTP. Àwọn ìdámọ̀ pàtàkì bíi ssid àti password ni a ń lò láti sopọ̀ sí nẹ́tíwọọkì Wi-Fi, nígbà tí ntpServer1 àti ntpServer2 ń tọ́ka sí àwọn olùpèsè NTP tí a óò lò.
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
Ìsokọ́ra yìí fi àwọn ìsọfúnni nẹ́tíwọọkì àti àwọn àdírẹ́sì olùpèsè hàn. Rí i dájú pé o tẹ SSID àti ọ̀rọ̀ìbaniìrẹ̀pẹ̀ Wi-Fi rẹ sílẹ̀ pípé, nítorí àṣìṣe èyíkéyìí yóò ṣèdíwọ́ fún ESP32 láti sopọ̀ sí Internet.
Nínú ìṣẹ́ printLocalTime(), a ṣe àkókò lọ́wọ́lọ́wọ́ ní ọ̀nà tí a óò fi hàn. A ń lo ìgbékalẹ̀ tm láti fi àkókò pamọ́, nígbà tí strftime ń ràn wá lọ́wọ́ láti ṣe àkókò náà ní ọ̀nà tí a lè kà.
void printLocalTime() {
struct tm timeinfo;
if(!getLocalTime(&timeinfo)) {
Serial.println("No time available (yet)");
return;
}
char timeHour[5];
strftime(timeHour, 5, "%H", &timeinfo);
Kóòdù yìí ṣàyẹ̀wò bí àkókò àdúgbò bá wà tàbí kò sí, ó sì gba wákàtí náà. Wákàtí tí a ṣe ní ọ̀nà tí a lè kà ni a óò lò láti fi àkókò lọ́wọ́lọ́wọ́ hàn lórí LCD. Bí àkókò kò bá tíì wà, ó máa tẹ ìwé sí Serial Monitor.
Níkẹyìn, ìṣẹ́ setup() ń bẹ̀rẹ̀ LCD àti sopọ̀ sí Wi-Fi. Ó tún ń ṣètò àwọn ètò olùpèsè NTP àti ṣètò ìpè padà fún ìmúṣọ̀kan àkókò.
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);
Ìsokọ́ra yìí ń bẹ̀rẹ̀ Serial Monitor fún ìwádìí àṣìṣe, ṣètò LCD, àti gbìyànjú láti sopọ̀ sí nẹ́tíwọọkì Wi-Fi tí a tọ́ka sí. A óò tẹ ipò ìsopọ̀ náà sí Serial Monitor, tí yóò jẹ́ kí o lè rí i dájú pé ìsopọ̀ náà ṣiṣẹ́.
Ìfihàn / Ohun tí o lè retí
Lẹ́yìn ìṣètò àṣeyọrí, LCD yóò fi àkókò lọ́wọ́lọ́wọ́, ọjọ́ ọ̀sẹ̀, àti ọjọ́ hàn. O lè retí pé àkókò yóò máa ṣe ìmúdójúìwọ̀n gbogbo ìṣẹ́jú àáyá 5, ọpẹ́ sí ìṣẹ́ loop(). Bí ìsopọ̀ sí olùpèsè NTP bá kùnà, ìwé yóò farahàn lórí Serial Monitor tí yóò fi hàn pé àkókò kò tíì wà (nínú fídíò ní 12:00).
Àwọn àṣìṣe tí ó wọ́pọ̀ pẹ̀lú ìsopọ̀ wáyà tí kò tọ́, àwọn àdírẹ́sì I2C tí kò tọ́, àti àwọn ìsọfúnni Wi-Fi tí kò tọ́. Rí i dájú pé gbogbo àwọn ìsopọ̀ ṣinṣin àti pé olùpèsè NTP wà ní ààyè láti nẹ́tíwọọkì rẹ.
Àwọn àkókò fídíò
- 00:00 Ìbẹ̀rẹ̀
- 2:10 Ìfihàn
- 5:15 Ìsopọ̀ wáyà ṣàlàyé
- 7:32 Kóòdù Arduino ṣàlàyé
- 18:43 Yíyàn bọ́ọ̀dù ESP32 àti ibùdó COM ní Arduino IDE
- 20:27 Ìfihàn Aago 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
Ohun ti o le nilo
-
AmazonBuy LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Orisun & itọkasi
-
Ita gbangbaPurchase LCD1602 display from Banggoodbanggood.com
Fáìlìs📁
Faili ti a beere (.h)
-
TZ.h
TZ.h0.02 MB