Search Code

ESP32 Tutorijal 53/55 - Napravi LCD internet sat | SunFounder-ov ESP32 IoT komplet za učenje

ESP32 Tutorijal 53/55 - Napravi LCD internet sat | SunFounder-ov ESP32 IoT komplet za učenje

U ovom tutorijalu ćemo napraviti internet povezani LCD sat koristeći ESP32 mikrokontroler od kompanije SunFounder. Ovaj sat će se automatski sinhronizovati sa trenutnim vremenom putem interneta, prikazujući vrijeme u 12-satnom ili 24-satnom formatu, zajedno sa danom u sedmici, datumom i mjesecom. Korištenje Mrežnog vremenskog protokola (NTP) osigurava da sat ostane tačan bez ručnih podešavanja.

esp32-53-internet-clock-main

Ovaj projekat koristi ugrađene Wi-Fi mogućnosti ESP32 mikrokontrolera za preuzimanje trenutnog vremena sa NTP servera. Koristit ćemo LCD ekran sa tekućim kristalima (Liquid Crystal Display - LCD) za prikaz vremena, koje se može formatirati prema korisničkim preferencijama. Za dodatna pojašnjenja bilo kojeg koraka, molimo pogledajte video (na videu u 00:30).

Objašnjenje hardvera

Glavne komponente za ovaj projekat uključuju ESP32 mikrokontroler, 20x4 LCD ekran i izvor napajanja. ESP32 je moćan mikrokontroler sa ugrađenim Wi-Fi i Bluetooth mogućnostima, što ga čini pogodnim za IoT projekte. LCD se koristi za prikaz vremena i datuma, i može se konfigurisati za različite veličine ekrana.

LCD radi putem I2C protokola, koji omogućava komunikaciju preko dvije žice (SDA i SCL). Ovo pojednostavljuje ožičenje i smanjuje broj pinova potrebnih na ESP32. Povezivanje sa NTP serverom se vrši koristeći Wi-Fi mogućnosti ESP32, omogućavajući ažuriranja u realnom vremenu.

 

  • Osigurajte ispravan napon napajanja (5 V).
  • Koristite kondenzatore za razdvajanje blizu pinova napajanja radi stabilnosti.
  • Budite oprezni sa I2C vezama kako biste izbjegli konflikte na magistrali.
  • Provjerite I2C adresu LCD-a (0x27 ili 0x3F).
  • Provjerite Wi-Fi akreditive za tačno povezivanje.
  • Upravljajte podešavanjima ljetnog računanja vremena u svom kodu.
  • Koristite ispravan NTP server za vašu geografsku lokaciju.
  • Uvijek očistite LCD prije ažuriranja prikaza.

Upute za ožičenje

ESP32-11_LCD-wiring

Za povezivanje ESP32 sa LCD-om, počnite spajanjem pinova napajanja. Povežite VCC pin LCD-a na 5V pin na ESP32 i GND pin LCD-a na GND pin na ESP32. Za I2C komunikaciju, povežite SDA pin LCD-a na GPIO 21 na ESP32 i SCL pin na GPIO 22. Osigurajte da su veze sigurne kako biste izbjegli bilo kakve komunikacijske probleme.

Prilikom postavljanja ožičenja, koristite muško-ženske premosne žice za jednostavno povezivanje. Ako vaš LCD ima drugačiju I2C adresu ili konfiguraciju pinova, prilagodite kod u skladu s tim. Pogledajte video (na videu u 05:30) za alternativne opcije ožičenja ako je potrebno.

Primjeri koda i objašnjenje

Kod inicijalizira LCD i postavlja Wi-Fi vezu za preuzimanje podataka o vremenu sa NTP servera. Ključni identifikatori kao što su ssid i password koriste se za povezivanje na Wi-Fi mrežu, dok ntpServer1 i ntpServer2 specificiraju NTP servere koje treba koristiti.

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

Ovaj isječak prikazuje mrežne akreditive i adrese servera. Osigurajte da tačno unesete svoj Wi-Fi SSID i lozinku, jer bilo koja greška će spriječiti ESP32 da se poveže na internet.

U funkciji printLocalTime(), trenutno vrijeme se formatira za prikaz. Struktura tm se koristi za pohranjivanje informacija o vremenu, dok strftime pomaže u formatiranju vremena u čitljiv niz.

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

Ovaj kod provjerava da li je lokalno vrijeme dostupno i preuzima sat. Formatirani sat se zatim koristi za prikaz trenutnog vremena na LCD-u. Ako vrijeme još nije dostupno, ispisuje poruku na Serial Monitor.

Konačno, funkcija setup() inicijalizira LCD i povezuje se na Wi-Fi. Također konfiguriše postavke NTP servera i postavlja povratni poziv za sinhronizaciju vremena.

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

Ovaj izvod inicijalizira Serial Monitor za otklanjanje grešaka, postavlja LCD i pokušava se povezati na specificiranu Wi-Fi mrežu. Status veze će biti ispisan na Serial Monitor, omogućavajući vam da provjerite vezu.

Demonstracija / Šta očekivati

Nakon uspješnog postavljanja, LCD će prikazati trenutno vrijeme, dan u sedmici i datum. Možete očekivati da se vrijeme ažurira svakih 5 sekundi, zahvaljujući funkciji loop(). Ako veza sa NTP serverom ne uspije, poruka će se pojaviti na Serial Monitoru koja ukazuje da vrijeme još nije dostupno (na videu u 12:00).

Uobičajene zamke uključuju pogrešno ožičenje, pogrešne I2C adrese i pogrešne Wi-Fi akreditive. Osigurajte da su sve veze sigurne i da je NTP server dostupan sa vaše mreže.

Vremenske oznake videa

  • 00:00 Početak
  • 2:10 Uvod
  • 5:15 Objašnjeno ožičenje
  • 7:32 Objašnjen Arduino kod
  • 18:43 Odabir ESP32 ploče i COM porta u Arduino IDE
  • 20:27 Demonstracija internet sata

Images

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

Things you might need

Resources & references

Files📁

Required File (.h)