કોડ શોધો

ESP32 ટ્યુટોરિયલ 53/55 - LCD ઇન્ટરનેટ ઘડિયાળ બનાવો | SunFounder ની ESP32 IoT લર્નિંગ કિટ

ESP32 ટ્યુટોરિયલ 53/55 - LCD ઇન્ટરનેટ ઘડિયાળ બનાવો | SunFounder ની ESP32 IoT લર્નિંગ કિટ

આ ટ્યુટોરિયલમાં, આપણે SunFounder ના ESP32 માઇક્રોકંટ્રોલરનો ઉપયોગ કરીને ઇન્ટરનેટ-કનેક્ટેડ LCD ઘડિયાળ બનાવીશું. આ ઘડિયાળ ઇન્ટરનેટ દ્વારા આપમેળે વર્તમાન સમય સાથે સિંક થશે, જે સમયને 12-કલાક અથવા 24-કલાકના ફોર્મેટમાં, સાથે અઠવાડિયાનો દિવસ, તારીખ અને મહિનો દર્શાવશે. નેટવર્ક ટાઇમ પ્રોટોકોલ (NTP) નો ઉપયોગ ખાતરી કરે છે કે ઘડિયાળ મેન્યુઅલ એડજસ્ટમેન્ટ વિના સચોટ રહે.

esp32-53-internet-clock-main

આ પ્રોજેક્ટ ESP32 ની બિલ્ટ-ઇન Wi-Fi ક્ષમતાઓનો ઉપયોગ કરીને NTP સર્વરથી વર્તમાન સમય મેળવે છે. આપણે સમય દર્શાવવા માટે લિક્વિડ ક્રિસ્ટલ ડિસ્પ્લે (LCD) નો ઉપયોગ કરીશું, જે વપરાશકર્તાની પસંદગી અનુસાર ફોર્મેટ કરી શકાય છે. કોઈપણ પગલાં વિશે વધુ સ્પષ્ટતા માટે, કૃપા કરીને વિડિયોનો સંદર્ભ લો (વિડિયોમાં 00:30 પર).

હાર્ડવેર સમજાવ્યું

આ પ્રોજેક્ટ માટેના મુખ્ય ઘટકોમાં ESP32 માઇક્રોકંટ્રોલર, 20x4 LCD ડિસ્પ્લે અને પાવર સ્ત્રોત શામેલ છે. ESP32 એ બિલ્ટ-ઇન Wi-Fi અને બ્લૂટૂથ સાથેનો શક્તિશાળી માઇક્રોકંટ્રોલર છે, જે તેને IoT પ્રોજેક્ટ્સ માટે યોગ્ય બનાવે છે. LCD નો ઉપયોગ સમય અને તારીખ દર્શાવવા માટે થાય છે, અને તેને વિવિધ ડિસ્પ્લે કદ માટે ગોઠવી શકાય છે.

LCD I2C પ્રોટોકોલ દ્વારા કાર્ય કરે છે, જે બે વાયર (SDA અને SCL) પર સંચાર કરવાની મંજૂરી આપે છે. આ વાયરિંગને સરળ બનાવે છે અને ESP32 પર જરૂરી પિનની સંખ્યા ઘટાડે છે. NTP સર્વર સાથેનું જોડાણ ESP32 ની Wi-Fi ક્ષમતાઓનો ઉપયોગ કરીને કરવામાં આવે છે, જે રીઅલ-ટાઇમ અપડેટ્સ સક્ષમ કરે છે.

 

  • યોગ્ય પાવર સપ્લાય વોલ્ટેજ (5 V) ની ખાતરી કરો.
  • સ્થિરતા માટે પાવર પિન નજીક ડિકપ્લિંગ કેપેસિટરનો ઉપયોગ કરો.
  • બસ સંઘર્ષ ટાળવા માટે I2C કનેક્શન્સ સાથે સાવચેત રહો.
  • LCD નું I2C સરનામું ચકાસો (0x27 અથવા 0x3F).
  • સચોટ કનેક્શન માટે Wi-Fi ઓળખપત્રો ચકાસો.
  • તમારા કોડમાં ડેલાઇટ સેવિંગ ટાઇમ એડજસ્ટમેન્ટ્સનું સંચાલન કરો.
  • તમારા ભૌગોલિક સ્થાન માટે યોગ્ય NTP સર્વરનો ઉપયોગ કરો.
  • ડિસ્પ્લે અપડેટ કરતા પહેલા હંમેશા LCD સાફ કરો.

વાયરિંગ સૂચનાઓ

ESP32-11_LCD-wiring

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 કનેક્શન સેટ કરે છે. Wi-Fi નેટવર્ક સાથે જોડાવા માટે 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";

આ સ્નિપેટ નેટવર્ક ઓળખપત્રો અને સર્વર સરનામાંઓ દર્શાવે છે. ખાતરી કરો કે તમે તમારું 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 પર વર્તમાન સમય દર્શાવવા માટે વપરાય છે. જો સમય હજી ઉપલબ્ધ ન હોય, તો તે સીરિયલ મોનિટર પર સંદેશ છાપે છે.

છેલ્લે, 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);

આ અંશ ડિબગિંગ માટે સીરિયલ મોનિટરને પ્રારંભ કરે છે, LCD સેટ કરે છે, અને સ્પષ્ટ કરેલ Wi-Fi નેટવર્ક સાથે જોડાવાનો પ્રયાસ કરે છે. કનેક્શન સ્થિતિ સીરિયલ મોનિટર પર છાપવામાં આવશે, જે તમને કનેક્શન ચકાસવાની મંજૂરી આપે છે.

પ્રદર્શન / શું અપેક્ષા રાખવી

સફળ સેટઅપ પર, LCD વર્તમાન સમય, અઠવાડિયાનો દિવસ અને તારીખ દર્શાવશે. તમે અપેક્ષા રાખી શકો છો કે સમય દર 5 સેકન્ડે અપડેટ થાય, loop() ફંક્શનને આભારી. જો NTP સર્વર સાથેનું કનેક્શન નિષ્ફળ જાય, તો સીરિયલ મોનિટર પર એક સંદેશ દેખાશે જે દર્શાવે છે કે સમય હજી ઉપલબ્ધ નથી (વિડિયોમાં 12:00 પર).

સામાન્ય મુશ્કેલીઓમાં ખોટું વાયરિંગ, ખોટા I2C સરનામાંઓ અને ખોટા Wi-Fi ઓળખપત્રો શામેલ છે. ખાતરી કરો કે બધા કનેક્શન સુરક્ષિત છે અને NTP સર્વર તમારા નેટવર્કથી પહોંચી શકાય તેવું છે.

વિડિયો ટાઇમસ્ટેમ્પ્સ

  • 00:00 શરૂઆત
  • 2:10 પરિચય
  • 5:15 વાયરિંગ સમજાવ્યું
  • 7:32 Arduino કોડ સમજાવ્યો
  • 18:43 Arduino IDE માં ESP32 બોર્ડ અને COM પોર્ટ પસંદ કરવું
  • 20:27 ઇન્ટરનેટ ઘડિયાળ પ્રદર્શન

છબીઓ

ESP32-11_LCD-wiring
ESP32-11_LCD-wiring
ESP32-11_LCD-wiring-schematic
ESP32-11_LCD-wiring-schematic
esp32-53-internet-clock-main
esp32-53-internet-clock-main
854-ESP32 Tutorial 53/55- Internet Clock
ભાષા: C++

/*
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 :)
}

તમને જોઈતી વસ્તુઓ

સંસાધનો અને સંદર્ભો

ફાઇલો📁

જરૂરી ફાઇલ (.h)