ESP32 Оқулық 53/55 - LCD Интернет сағатын жасаңыз | SunFounder ESP32 IoT оқу жиынтығы
Бұл оқулықта біз SunFounder компаниясының ESP32 микроконтроллерін пайдаланып, Интернетке қосылған LCD сағатын жасаймыз. Бұл сағат Интернет арқылы ағымдағы уақытқа автоматты түрде синхрондалады, уақытты 12 сағаттық немесе 24 сағаттық форматта, апта күнімен, күнімен және айымен бірге көрсетеді. Желілік уақыт протоколын (NTP) қолдану сағаттың қолмен реттеусіз дәл болуын қамтамасыз етеді.
Бұл жоба ESP32 кіріктірілген Wi-Fi мүмкіндіктерін NTP серверінен ағымдағы уақытты алу үшін пайдаланады. Біз уақытты көрсету үшін Сұйық кристалды дисплейді (LCD) қолданамыз, оны пайдаланушы қалауына қарай пішімдеуге болады. Кез келген қадамдарды түсіндіру үшін бейнені қараңыз (бейнеде 00:30).
Аппараттық құрал түсіндірмесі
Бұл жобаның негізгі компоненттеріне ESP32 микроконтроллері, 20x4 LCD дисплей және қуат көзі кіреді. ESP32 - кіріктірілген Wi-Fi және Bluetooth бар қуатты микроконтроллер, бұл оны IoT жобаларына қолайлы етеді. LCD уақыт пен күнді көрсету үшін қолданылады және әртүрлі дисплей өлшемдеріне конфигурациялануы мүмкін.
LCD I2C протоколы арқылы жұмыс істейді, бұл екі сым арқылы (SDA және SCL) байланысқа мүмкіндік береді. Бұл сымдарды қосуды жеңілдетеді және ESP32-де қажетті түйреуіштер санын азайтады. NTP серверіне қосылу ESP32 Wi-Fi мүмкіндіктерін пайдаланып жасалады, бұл нақты уақыттағы жаңартуларды қамтамасыз етеді.
- Қуат көзінің дұрыс кернеуін қамтамасыз етіңіз (5 В).
- Тұрақтылық үшін қуат түйреуіштерінің жанында разрядтаушы конденсаторларды қолданыңыз.
- Шина қақтығыстарын болдырмау үшін I2C қосылымдарына абай болыңыз.
- LCD I2C мекенжайын тексеріңіз (0x27 немесе 0x3F).
- Дәл қосылу үшін Wi-Fi тіркелгі деректерін тексеріңіз.
- Кодыңызда жазғы уақытқа ауысу реттеулерін ескеріңіз.
- Географиялық орналасуыңызға сәйкес дұрыс NTP серверін пайдаланыңыз.
- Дисплейді жаңартпас бұрын әрқашан LCD тазалаңыз.
Сымдарды қосу нұсқаулары

ESP32-ді LCD-мен қосу үшін қуат түйреуіштерін қосудан бастаңыз. LCD VCC-ді ESP32-дегі 5V түйреуішіне және LCD GND түйреуішін ESP32-дегі GND түйреуішіне қосыңыз. I2C байланысы үшін LCD SDA түйреуішін ESP32-дегі GPIO 21-ге және SCL түйреуішін GPIO 22-ге қосыңыз. Байланыс ақауларын болдырмау үшін қосылымдардың сенімді екеніне көз жеткізіңіз.
Сымдарды орнату кезінде оңай қосылу үшін аталық-аналық секіргіш сымдарды пайдаланыңыз. Егер LCD-де басқа I2C мекенжайы немесе түйреуіш конфигурациясы болса, кодты сәйкесінше реттеңіз. Қажет болса, балама сымдарды қосу нұсқалары үшін бейнені қараңыз (бейнеде 05:30).
Код мысалдары және түсіндірме
Код LCD инициализациялайды және 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);
Бұл код жергілікті уақыттың қолжетімділігін тексереді және сағатты алады. Пішімделген сағат содан кейін LCD-де ағымдағы уақытты көрсету үшін қолданылады. Егер уақыт әлі қолжетімді болмаса, Serial Monitor-ге хабарлама басып шығарылады.
Соңында, setup() функциясы LCD инициализациялайды және Wi-Fi-ға қосылады. Ол сондай-ақ NTP сервер параметрлерін конфигурациялайды және уақыт синхронизациясы үшін кері шақыруды орнатады.
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);
Бұл үзінді жөндеу үшін Serial Monitor инициализациялайды, LCD орнатады және көрсетілген Wi-Fi желісіне қосылуға тырысады. Қосылу күйі Serial Monitor-ге басып шығарылады, бұл қосылымды тексеруге мүмкіндік береді.
Демонстрация / Не күтуге болады
Сәтті орнатудан кейін LCD ағымдағы уақытты, апта күнін және күнді көрсетеді. loop() функциясының арқасында уақыт әр 5 секунд сайын жаңартылып тұрады деп күтуге болады. Егер NTP серверіне қосылу сәтсіз болса, Serial Monitor-де уақыттың әлі қолжетімді еместігін көрсететін хабарлама пайда болады (бейнеде 12:00).
Жиі кездесетін қателіктерге дұрыс емес сымдарды қосу, қате I2C мекенжайлары және қате Wi-Fi тіркелгі деректері жатады. Барлық қосылымдардың сенімді екеніне және NTP серверіне желіңізден қол жеткізуге болатынына көз жеткізіңіз.
Бейне уақыт белгілері
- 00:00 Бастау
- 2:10 Кіріспе
- 5:15 Сымдарды қосу түсіндірмесі
- 7:32 Arduino коды түсіндірмесі
- 18:43 Arduino 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
Сізге қажет болуы мүмкін нәрселер
-
АмазонкаPurchase LCD1602-I2C from Amazonamzn.to
-
eBayPurchase LCD1602-I2C from eBayebay.us
-
BanggoodPurchase LCD1602 display from Banggoodbanggood.com
Ресурстар мен сілтемелер
-
СыртқыPurchase LCD1602 display from Banggoodbanggood.com
Файлдар📁
Талап етілетін файл (.h)
-
TZ.h
TZ.h0.02 MB