Пребарување код

ESP32 Упатство 53/55 - Направете LCD интернет часовник | SunFounder-овиот ESP32 IoT комплет за учење

ESP32 Упатство 53/55 - Направете LCD интернет часовник | SunFounder-овиот ESP32 IoT комплет за учење

Во ова упатство, ќе изградиме интернет-поврзан LCD часовник користејќи го ESP32 микроконтролерот од SunFounder. Овој часовник автоматски ќе се синхронизира со моменталното време преку интернет, прикажувајќи го времето во 12-часовен или 24-часовен формат, заедно со денот во неделата, датумот и месецот. Употребата на Network Time Protocol (NTP) обезбедува часовникот да остане точен без рачни прилагодувања.

esp32-53-internet-clock-main

Овој проект ги користи вградените Wi-Fi можности на ESP32 за да го добие моменталното време од NTP сервер. Ќе користиме Liquid Crystal Display (LCD) за прикажување на времето, кое може да се форматира според корисничките преференции. За дополнително појаснување на било кој чекор, ве молиме погледнете го видеото (во видеото на 00:30).

Објаснување на хардверот

Примарните компоненти за овој проект вклучуваат ESP32 микроконтролер, 20x4 LCD дисплеј и извор на напојување. ESP32 е моќен микроконтролер со вграден Wi-Fi и Bluetooth, што го прави погоден за IoT проекти. LCD-от се користи за прикажување на времето и датумот, и може да се конфигурира за различни големини на дисплеј.

LCD-от работи преку I2C протоколот, кој овозможува комуникација преку две жици (SDA и SCL). Ова ја поедноставува инсталацијата и го намалува бројот на пинови потребни на ESP32. Врската со NTP серверот се воспоставува користејќи ги Wi-Fi можностите на ESP32, овозможувајќи ажурирања во реално време.

 

  • Обезбедете правилен напон на напојување (5 V).
  • Користете декуплерски кондензатори блиску до пиновите за напојување за стабилност.
  • Бидете внимателни со I2C врските за да избегнете конфликти на магистралата.
  • Проверете ја I2C адресата на LCD-от (0x27 или 0x3F).
  • Проверете ги Wi-Fi акредитивите за точна врска.
  • Ракувајте со прилагодувањата за летно сметање на времето во вашиот код.
  • Користете го точниот NTP сервер за вашата географска локација.
  • Секогаш исчистете го LCD-от пред ажурирање на дисплејот.

Инструкции за поврзување

ESP32-11_LCD-wiring

За да го поврзете ESP32 со LCD-от, започнете со поврзување на пиновите за напојување. Поврзете го VCC на LCD-от со 5V пинот на ESP32 и GND пинот на LCD-от со GND пинот на ESP32. За I2C комуникација, поврзете го SDA пинот на LCD-от со GPIO 21 на ESP32 и SCL пинот со GPIO 22. Обезбедете дека врските се сигурни за да избегнете комуникациски проблеми.

При поставување на жиците, користете машки-на-женски jumper жици за лесни врски. Ако вашиот LCD има различна I2C адреса или конфигурација на пинови, прилагодете го кодот соодветно. Погледнете го видеото (во видеото на 05:30) за алтернативни опции за поврзување ако е потребно.

Примери на код и објаснување

Кодот го иницијализира LCD-от и ја поставува Wi-Fi врската за да добие податоци за времето од NTP серверот. Клучни идентификатори како 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-от ќе го прикажува моменталното време, денот во неделата и датумот. Можете да очекувате времето да се ажурира на секои 5 секунди, благодарение на функцијата loop(). Ако врската со NTP серверот не успее, порака ќе се појави на Serial Monitor-от што укажува дека времето сè уште не е достапно (во видеото на 12:00).

Вообичаени грешки вклучуваат неточни жици, погрешни I2C адреси и неточни Wi-Fi акредитиви. Обезбедете дека сите врски се сигурни и дека NTP серверот е достапен од вашата мрежа.

Временски ознаки на видеото

  • 00:00 Почеток
  • 2:10 Вовед
  • 5:15 Објаснување на жиците
  • 7:32 Објаснување на Arduino кодот
  • 18:43 Избор на ESP32 плоча и COM порт во Arduino IDE
  • 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)