Search Code

ESP32 Tutoriaal 53/55 - Bou 'n LCD-internetklok | SunFounder se ESP32 IoT-leerkit

ESP32 Tutoriaal 53/55 - Bou 'n LCD-internetklok | SunFounder se ESP32 IoT-leerkit

In hierdie tutoriaal gaan ons 'n internet-gekoppelde LCD-klok bou met behulp van die ESP32-mikrobeheerder van SunFounder. Hierdie klok sal outomaties met die huidige tyd via die internet sinchroniseer, en die tyd in óf 12-uur óf 24-uur-formaat vertoon, tesame met die dag van die week, datum en maand. Die gebruik van die Netwerktydprotokol (NTP) verseker dat die klok akkuraat bly sonder handmatige aanpassings.

esp32-53-internet-clock-main

Hierdie projek gebruik die ESP32 se ingeboude Wi-Fi-vermoëns om die huidige tyd van 'n NTP-bediener te haal. Ons gaan 'n Vloeibare Kristal-skerm (LCD) gebruik om die tyd te vertoon, wat volgens gebruikersvoorkeure geformateer kan word. Vir verdere verduideliking oor enige stappe, verwys asseblief na die video by (in video by 00:30).

Hardeware Verduidelik

Die primêre komponente vir hierdie projek sluit die ESP32-mikrobeheerder, 'n 20x4 LCD-skerm en 'n kragbron in. Die ESP32 is 'n kragtige mikrobeheerder met ingeboude Wi-Fi en Bluetooth, wat dit geskik maak vir IoT-projekte. Die LCD word gebruik om die tyd en datum te vertoon, en dit kan vir verskillende skermgroottes gekonfigureer word.

Die LCD werk via die I2C-protokol, wat kommunikasie oor twee drade (SDA en SCL) moontlik maak. Dit vereenvoudig bedrading en verminder die aantal penne wat op die ESP32 benodig word. Die verbinding met die NTP-bediener word gemaak met behulp van die ESP32 se Wi-Fi-vermoëns, wat intydse opdaterings moontlik maak.

 

  • Verseker korrekte kragtoevoerspanning (5 V).
  • Gebruik ontkoppelingskapasitors naby die kragpenne vir stabiliteit.
  • Wees versigtig met I2C-verbindings om buskonflikte te vermy.
  • Verifieer die I2C-adres van die LCD (0x27 of 0x3F).
  • Kontroleer Wi-Fi-geloofsbriewe vir akkurate verbinding.
  • Hanteer dagligbesparingstyd-aanpassings in jou kode.
  • Gebruik die korrekte NTP-bediener vir jou geografiese ligging.
  • Maak altyd die LCD skoon voordat jy die vertoning opdateer.

Bedradingsinstruksies

ESP32-11_LCD-wiring

Om die ESP32 met die LCD te bedraad, begin deur die kragpenne te verbind. Verbind die LCD se VCC aan die 5V-pen op die ESP32 en die GND-pen van die LCD aan die GND-pen op die ESP32. Vir die I2C-kommunikasie, verbind die SDA-pen van die LCD aan GPIO 21 op die ESP32 en die SCL-pen aan GPIO 22. Verseker dat die verbindings veilig is om enige kommunikasieprobleme te vermy.

Wanneer jy die bedrading opstel, gebruik manlike-na-vroulike springdrade vir maklike verbindings. As jou LCD 'n ander I2C-adres of penkonfigurasie het, pas die kode dienooreenkomstig aan. Verwys na die video by (in video by 05:30) vir alternatiewe bedradingsopsies indien nodig.

Kode Voorbeelde & Deurloop

Die kode initialiseer die LCD en stel die Wi-Fi-verbinding op om tyddata van die NTP-bediener te haal. Sleutelidentifiseerders soos ssid en password word gebruik om met die Wi-Fi-netwerk te verbind, terwyl ntpServer1 en ntpServer2 die NTP-bediener spesifiseer om te gebruik.

const char* ssid = "dars";
const char* password = "llllllllllllll";
const char* ntpServer1 = "pool.ntp.org";
const char* ntpServer2 = "time.nist.gov";

Hierdie uittreksel toon die netwerkgeloofsbriewe en bedieneradresse. Verseker dat jy jou Wi-Fi-SSID en wagwoord akkuraat invoer, aangesien enige fout sal verhoed dat die ESP32 met die internet verbind.

In die printLocalTime()-funksie word die huidige tyd vir vertoning geformateer. Die struktuur tm word gebruik om tydinligting te stoor, terwyl strftime help om die tyd in 'n leesbare string te formateer.

void printLocalTime() {
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)) {
    Serial.println("No time available (yet)");
    return;
  }
  char timeHour[5];
  strftime(timeHour, 5, "%H", &timeinfo);

Hierdie kode kontroleer of die plaaslike tyd beskikbaar is en haal die uur. Die geformateerde uur word dan gebruik om die huidige tyd op die LCD te vertoon. As tyd nog nie beskikbaar is nie, druk dit 'n boodskap na die Serial Monitor.

Laastens initialiseer die setup()-funksie die LCD en verbind met Wi-Fi. Dit konfigureer ook die NTP-bedienerinstellings en stel 'n terugroepfunksie vir tydsinchronisasie op.

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);

Hierdie uittreksel initialiseer die Serial Monitor vir ontfouting, stel die LCD op en probeer om met die gespesifiseerde Wi-Fi-netwerk te verbind. Die verbindingstatus sal na die Serial Monitor gedruk word, wat jou toelaat om die verbinding te verifieer.

Demonstrasie / Wat om te Verwag

Na suksesvolle opstelling sal die LCD die huidige tyd, dag van die week en die datum vertoon. Jy kan verwag dat die tyd elke 5 sekondes opdateer, danksy die loop()-funksie. As die verbinding met die NTP-bediener misluk, sal 'n boodskap op die Serial Monitor verskyn wat aandui dat die tyd nog nie beskikbaar is nie (in video by 12:00).

Algemene slaggate sluit verkeerde bedrading, verkeerde I2C-adresse en verkeerde Wi-Fi-geloofsbriewe in. Verseker dat alle verbindings veilig is en dat die NTP-bediener vanaf jou netwerk bereikbaar is.

Video Tydstempels

  • 00:00 Begin
  • 2:10 Inleiding
  • 5:15 Bedrading verduidelik
  • 7:32 Arduino-kode verduidelik
  • 18:43 Kies ESP32-bord en COM-poort in Arduino IDE
  • 20:27 Internetklok Demonstrasie

Beelde

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
Taal: 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 :)
}

Goedere wat jy dalk nodig het

Hulpbronne en verwysings

Lêers📁

Vereiste lêer (.h)