Search Code

Mafunzo ya ESP32 53/55 - Tengeneza Saa ya Mtandao ya LCD | Kifurushi cha Kujifunza cha IoT cha SunFounder cha ESP32

Mafunzo ya ESP32 53/55 - Tengeneza Saa ya Mtandao ya LCD | Kifurushi cha Kujifunza cha IoT cha SunFounder cha ESP32

Katika mafunzo haya, tutaunda saa ya LCD iliyounganishwa na mtandao kwa kutumia microcontroller ya ESP32 kutoka SunFounder. Saa hii itajiweka sawa kiotomatiki na wakati wa sasa kupitia mtandao, ikionyesha wakati katika muundo wa saa 12 au saa 24, pamoja na siku ya wiki, tarehe, na mwezi. Matumizi ya Itifaki ya Wakati wa Mtandao (NTP) inahakikisha kwamba saa inabaki sahihi bila marekebisho ya mikono.

esp32-53-internet-clock-main

Mradi huu unatumia uwezo wa Wi-Fi uliojengewa ndani wa ESP32 kupata wakati wa sasa kutoka kwa seva ya NTP. Tutatumia Onyesho la Kioo cha Kioevu (LCD) kuonyesha wakati, ambao unaweza kupangwa kulingana na mapendeleo ya mtumiaji. Kwa ufafanuzi zaidi kuhusu hatua zozote, tafadhali rejelea video (katika video saa 00:30).

Vifaa Vimeelezwa

Vipengele vikuu vya mradi huu ni pamoja na microcontroller ya ESP32, onyesho la LCD la 20x4, na chanzo cha nguvu. ESP32 ni microcontroller yenye nguvu iliyo na Wi-Fi na Bluetooth iliyojengewa ndani, inayofaa kwa miradi ya IoT. LCD inatumiwa kuonyesha wakati na tarehe, na inaweza kusanidiwa kwa ukubwa tofauti wa onyesho.

LCD inafanya kazi kupitia itifaki ya I2C, ambayo inaruhusu mawasiliano kupitia waya mbili (SDA na SCL). Hii inarahisisha wiring na kupunguza idadi ya pini zinazohitajika kwenye ESP32. Uunganisho kwa seva ya NTP unafanywa kwa kutumia uwezo wa Wi-Fi wa ESP32, kuwezesha masasisho ya wakati halisi.

 

  • Hakikisha voltage sahihi ya usambazaji wa nguvu (5 V).
  • Tumia capacitors za kutenganisha karibu na pini za nguvu kwa utulivu.
  • Kuwa makini na miunganisho ya I2C ili kuepuka migogoro ya basi.
  • Thibitisha anwani ya I2C ya LCD (0x27 au 0x3F).
  • Angalia vitambulisho vya Wi-Fi kwa uunganisho sahihi.
  • Shughulikia marekebisho ya wakati wa kuokoa mchana katika msimbo wako.
  • Tumia seva sahihi ya NTP kwa eneo lako la kijiografia.
  • Safisha LCD kila wakati kabla ya kusasisha onyesho.

Maagizo ya Wiring

ESP32-11_LCD-wiring

Ili kuunganisha ESP32 na LCD, anza kwa kuunganisha pini za nguvu. Unganisha VCC ya LCD kwenye pini ya 5V kwenye ESP32 na pini ya GND ya LCD kwenye pini ya GND kwenye ESP32. Kwa mawasiliano ya I2C, unganisha pini ya SDA ya LCD kwenye GPIO 21 kwenye ESP32 na pini ya SCL kwenye GPIO 22. Hakikisha miunganisho ni salama ili kuepuka matatizo yoyote ya mawasiliano.

Wakati wa kusanidi wiring, tumia waya za jumper za kiume-kwa-kike kwa miunganisho rahisi. Ikiwa LCD yako ina anwani tofauti ya I2C au usanidi wa pini, rekebisha msimbo ipasavyo. Rejelea video (katika video saa 05:30) kwa chaguo mbadala za wiring ikiwa ni lazima.

Mifano ya Msimbo na Maelekezo

Msimbo huanzisha LCD na kusanidi uunganisho wa Wi-Fi kupata data ya wakati kutoka kwa seva ya NTP. Vitambulisho muhimu kama ssid na password vinatumiwa kuunganisha kwenye mtandao wa Wi-Fi, wakati ntpServer1 na ntpServer2 vinabainisha seva za NTP za kutumia.

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

Sehemu hii inaonyesha vitambulisho vya mtandao na anwani za seva. Hakikisha unaingiza SSID na password yako ya Wi-Fi kwa usahihi, kwani kosa lolote litazuia ESP32 kuunganisha kwenye mtandao.

Katika kazi ya printLocalTime(), wakati wa sasa unapangwa kwa ajili ya kuonyeshwa. Muundo wa tm unatumiwa kuhifadhi taarifa za wakati, wakati strftime inasaidia kupanga wakati kuwa mfuatano wa kusomeka.

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

Msimbo huu huangalia ikiwa wakati wa ndani unapatikana na hupata saa. Saa iliyopangwa kisha inatumiwa kuonyesha wakati wa sasa kwenye LCD. Ikiwa wakati bado haupatikani, inachapisha ujumbe kwenye Serial Monitor.

Hatimaye, kazi ya setup() huanzisha LCD na kuunganisha kwenye Wi-Fi. Pia inasanidi mipangilio ya seva ya NTP na kuweka wito wa kurudi kwa usawazishaji wa wakati.

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

Sehemu hii huanzisha Serial Monitor kwa ajili ya utatuzi, inasanidi LCD, na inajaribu kuunganisha kwenye mtandao wa Wi-Fi uliobainishwa. Hali ya uunganisho itachapishwa kwenye Serial Monitor, kukuwezesha kuthibitisha uunganisho.

Maonyesho / Nini cha Kutarajia

Baada ya usanidi uliofanikiwa, LCD itaonyesha wakati wa sasa, siku ya wiki, na tarehe. Unaweza kutarajia wakati kusasishwa kila sekunde 5, kutokana na kazi ya loop(). Ikiwa uunganisho kwa seva ya NTP unashindwa, ujumbe utaonekana kwenye Serial Monitor kuonyesha kwamba wakati bado haupatikani (katika video saa 12:00).

Makosa ya kawaida ni pamoja na wiring isiyo sahihi, anwani zisizo sahihi za I2C, na vitambulisho visivyo sahihi vya Wi-Fi. Hakikisha miunganisho yote ni salama na kwamba seva ya NTP inapatikana kutoka kwenye mtandao wako.

Vidokezo vya Muda wa Video

  • 00:00 Mwanzo
  • 2:10 Utangulizi
  • 5:15 Wiring imeelezwa
  • 7:32 Msimbo wa Arduino umeelezwa
  • 18:43 Kuchagua bodi ya ESP32 na bandari ya COM katika Arduino IDE
  • 20:27 Maonyesho ya Saa ya Mtandao

Bilder

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
Språk: 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 :)
}

Tänker att du kanske behöver

Resurser och referenser

Filer📁

Krävd fil (.h)