ESP32 ٹیوٹوریل 53/55 - ایک LCD انٹرنیٹ گھڑی بنائیں | سن فاؤنڈر کا ESP32 IoT لرننگ کٹ
اس ٹیوٹوریل میں، ہم SunFounder کے ESP32 مائیکروکنٹرولر کا استعمال کرتے ہوئے ایک انٹرنیٹ سے منسلک LCD گھڑی بنائیں گے۔ یہ گھڑی خود بخود انٹرنیٹ کے ذریعے موجودہ وقت کے ساتھ ہم آہنگ ہو جائے گی، وقت کو 12 گھنٹے یا 24 گھنٹے کی شکل میں ظاہر کرے گی، ساتھ ہی ہفتے کا دن، تاریخ اور مہینہ بھی دکھائے گی۔ نیٹ ورک ٹائم پروٹوکول (NTP) کا استعمال اس بات کو یقینی بناتا ہے کہ گھڑی دستی ایڈجسٹمنٹ کے بغیر درست رہے۔
یہ پروجیکٹ ESP32 کی بلٹ ان وائی فائی صلاحیتوں کو استعمال کرتا ہے تاکہ NTP سرور سے موجودہ وقت حاصل کیا جا سکے۔ ہم وقت دکھانے کے لیے ایک لیکوئڈ کرسٹل ڈسپلے (LCD) استعمال کریں گے، جسے صارف کی ترجیحات کے مطابق فارمیٹ کیا جا سکتا ہے۔ کسی بھی مرحلے میں مزید وضاحت کے لیے، براہ کرم ویڈیو دیکھیں (ویڈیو میں 00:30 پر)۔
ہارڈویئر کی وضاحت
اس پروجیکٹ کے بنیادی اجزاء میں ESP32 مائیکروکنٹرولر، ایک 20x4 LCD ڈسپلے، اور ایک پاور سورس شامل ہیں۔ ESP32 ایک طاقتور مائیکروکنٹرولر ہے جس میں بلٹ ان وائی فائی اور بلوٹوتھ ہے، جو اسے IoT پروجیکٹس کے لیے موزوں بناتا ہے۔ LCD وقت اور تاریخ دکھانے کے لیے استعمال ہوتا ہے، اور اسے مختلف ڈسپلے سائز کے لیے ترتیب دیا جا سکتا ہے۔
LCD I2C پروٹوکول کے ذریعے کام کرتا ہے، جو دو تاروں (SDA اور SCL) پر مواصلات کی اجازت دیتا ہے۔ یہ وائرنگ کو آسان بناتا ہے اور ESP32 پر درکار پنوں کی تعداد کو کم کرتا ہے۔ NTP سرور سے کنکشن ESP32 کی وائی فائی صلاحیتوں کا استعمال کرتے ہوئے بنایا جاتا ہے، جس سے ریئل ٹائم اپڈیٹس ممکن ہوتی ہیں۔
- پاور سپلائی وولٹیج (5 V) درست یقینی بنائیں۔
- استحکام کے لیے پاور پنوں کے قریب ڈیکپلنگ کیپسیٹرز استعمال کریں۔
- بس تنازعات سے بچنے کے لیے I2C کنکشنز سے محتاط رہیں۔
- LCD کا I2C ایڈریس تصدیق کریں (0x27 یا 0x3F)۔
- درست کنکشن کے لیے وائی فائی اسناد چیک کریں۔
- اپنے کوڈ میں ڈے لائٹ سیونگ ٹائم ایڈجسٹمنٹ کو ہینڈل کریں۔
- اپنے جغرافیائی محل وقوع کے لیے درست 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 سرور سے وقت کا ڈیٹا حاصل کرنے کے لیے وائی فائی کنکشن سیٹ اپ کرتا ہے۔ اہم شناخت کنندگان جیسے ssid اور password وائی فائی نیٹ ورک سے منسلک ہونے کے لیے استعمال ہوتے ہیں، جبکہ ntpServer1 اور ntpServer2 استعمال کرنے کے لیے NTP سرورز کی وضاحت کرتے ہیں۔
const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";
یہ ٹکڑا نیٹ ورک اسناد اور سرور ایڈریس دکھاتا ہے۔ یقینی بنائیں کہ آپ اپنا وائی فائی 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 پر موجودہ وقت دکھانے کے لیے استعمال ہوتا ہے۔ اگر وقت ابھی دستیاب نہیں ہے، تو یہ سیریل مانیٹر پر ایک پیغام پرنٹ کرتا ہے۔
آخر میں، setup() فنکشن LCD کو انیشیالائز کرتا ہے اور وائی فائی سے منسلک ہوتا ہے۔ یہ 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);
یہ اقتباس ڈیبگنگ کے لیے سیریل مانیٹر کو انیشیالائز کرتا ہے، LCD سیٹ اپ کرتا ہے، اور مخصوص وائی فائی نیٹ ورک سے منسلک ہونے کی کوشش کرتا ہے۔ کنکشن کی حیثیت سیریل مانیٹر پر پرنٹ کی جائے گی، جس سے آپ کنکشن کی تصدیق کر سکیں گے۔
ڈیمونسٹریشن / کیا توقع کریں
کامیاب سیٹ اپ کے بعد، LCD موجودہ وقت، ہفتے کا دن، اور تاریخ دکھائے گا۔ آپ توقع کر سکتے ہیں کہ وقت ہر 5 سیکنڈ میں اپڈیٹ ہو گا، loop() فنکشن کی بدولت۔ اگر NTP سرور سے کنکشن ناکام ہو جاتا ہے، تو سیریل مانیٹر پر ایک پیغام ظاہر ہو گا جو بتائے گا کہ وقت ابھی دستیاب نہیں ہے (ویڈیو میں 12:00 پر)۔
عام مسائل میں غلط وائرنگ، غلط I2C ایڈریس، اور غلط وائی فائی اسناد شامل ہیں۔ یقینی بنائیں کہ تمام کنکشنز محفوظ ہیں اور 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
آپ کو جن چیزوں کی ضرورت ہو سکتی ہے
-
ایمیزونPurchase 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