Kod Ara

ESP32 Eğitimi 53/55 - Bir LCD İnternet Saati Oluşturun | SunFounder'ın ESP32 IoT Öğrenme Kiti

ESP32 Eğitimi 53/55 - Bir LCD İnternet Saati Oluşturun | SunFounder'ın ESP32 IoT Öğrenme Kiti

Bu eğitimde, SunFounder’dan ESP32 mikrodenetleyicisini kullanarak internete bağlı bir LCD saat kuracağız. Bu saat, internet üzerinden otomatik olarak güncel saate senkronize olacak ve saati 12 saatlik veya 24 saatlik formatta, haftanın günü, tarih ve ay ile birlikte gösterecektir. Ağ Zaman Protokolü’nün (NTP) kullanımı, saatin manuel ayar gerektirmeden doğru kalmasını sağlar.

esp32-53-internet-clock-main

Bu proje, ESP32’nin yerleşik Wi-Fi özelliklerini kullanarak bir NTP sunucusundan güncel saati alır. Zamanı kullanıcı tercihlerine göre biçimlendirilebilen bir Sıvı Kristal Ekran (LCD) kullanarak göstereceğiz. Herhangi bir adımda daha fazla açıklama için lütfen videoya bakın (videoda 00:30’da).

Donanım Açıklaması

Bu projenin ana bileşenleri ESP32 mikrodenetleyicisi, 20x4 LCD ekran ve bir güç kaynağıdır. ESP32, yerleşik Wi-Fi ve Bluetooth’a sahip güçlü bir mikrodenetleyicidir ve IoT projeleri için uygundur. LCD, saati ve tarihi göstermek için kullanılır ve farklı ekran boyutları için yapılandırılabilir.

LCD, iki kablo (SDA ve SCL) üzerinden iletişime olanak tanıyan I2C protokolü ile çalışır. Bu, kablolamayı basitleştirir ve ESP32’de gereken pin sayısını azaltır. NTP sunucusuna bağlantı, ESP32’nin Wi-Fi özellikleri kullanılarak yapılır ve gerçek zamanlı güncellemeler sağlar.

 

  • Doğru güç kaynağı voltajını (5 V) sağlayın.
  • Stabilite için güç pinlerinin yakınına dekuplaj kapasitörleri kullanın.
  • Veri yolu çakışmalarını önlemek için I2C bağlantılarına dikkat edin.
  • LCD’nin I2C adresini doğrulayın (0x27 veya 0x3F).
  • Doğru bağlantı için Wi-Fi kimlik bilgilerini kontrol edin.
  • Yazılımınızda yaz saati uygulaması ayarlarını yönetin.
  • Coğrafi konumunuz için doğru NTP sunucusunu kullanın.
  • Ekranı güncellemeden önce her zaman LCD’yi temizleyin.

Bağlantı Talimatları

ESP32-11_LCD-wiring

ESP32’yi LCD ile bağlamak için güç pinlerini bağlayarak başlayın. LCD’nin VCC’sini ESP32’deki 5V pinine ve LCD’nin GND pinini ESP32’deki GND pinine bağlayın. I2C iletişimi için LCD’nin SDA pinini ESP32’deki GPIO 21’e ve SCL pinini GPIO 22’ye bağlayın. İletişim sorunlarını önlemek için bağlantıların güvenli olduğundan emin olun.

Kablolamayı kurarken kolay bağlantılar için erkek-dişi jumper kablolar kullanın. LCD’niz farklı bir I2C adresine veya pin yapılandırmasına sahipse, kodu buna göre ayarlayın. Gerekirse alternatif bağlantı seçenekleri için videoya bakın (videoda 05:30’da).

Kod Örnekleri ve Açıklama

Kod, LCD’yi başlatır ve NTP sunucusundan zaman verisi almak için Wi-Fi bağlantısını kurar. ssid ve password gibi anahtar tanımlayıcılar Wi-Fi ağına bağlanmak için kullanılırken, ntpServer1 ve ntpServer2 kullanılacak NTP sunucularını belirtir.

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

Bu kod parçacığı ağ kimlik bilgilerini ve sunucu adreslerini gösterir. Wi-Fi SSID’nizi ve şifrenizi doğru girdiğinizden emin olun, çünkü herhangi bir hata ESP32’nin internete bağlanmasını engelleyecektir.

printLocalTime() fonksiyonunda, geçerli saat görüntüleme için biçimlendirilir. tm yapısı zaman bilgisini saklamak için kullanılırken, strftime zamanı okunabilir bir dizeye biçimlendirmeye yardımcı olur.

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

Bu kod, yerel saatin kullanılabilir olup olmadığını kontrol eder ve saati alır. Biçimlendirilen saat daha sonra LCD’de geçerli saati göstermek için kullanılır. Zaman henüz kullanılabilir değilse, Seri Monitöre bir mesaj yazdırır.

Son olarak, setup() fonksiyonu LCD’yi başlatır ve Wi-Fi’ye bağlanır. Ayrıca NTP sunucu ayarlarını yapılandırır ve zaman senkronizasyonu için bir geri çağırma işlevi ayarlar.

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

Bu alıntı, hata ayıklama için Seri Monitörü başlatır, LCD’yi kurar ve belirtilen Wi-Fi ağına bağlanmayı dener. Bağlantı durumu Seri Monitöre yazdırılacak ve bağlantıyı doğrulamanıza olanak tanıyacaktır.

Gösterim / Beklentiler

Başarılı kurulumun ardından LCD, geçerli saati, haftanın gününü ve tarihi gösterecektir. loop() fonksiyonu sayesinde saatin her 5 saniyede bir güncellenmesini bekleyebilirsiniz. NTP sunucusuna bağlantı başarısız olursa, Seri Monitörde saatin henüz kullanılabilir olmadığını belirten bir mesaj görünecektir (videoda 12:00’da).

Yaygın hatalar arasında yanlış kablolama, yanlış I2C adresleri ve yanlış Wi-Fi kimlik bilgileri bulunur. Tüm bağlantıların güvenli olduğundan ve NTP sunucusuna ağınızdan erişilebildiğinden emin olun.

Video Zaman Damgaları

  • 00:00 Başlangıç
  • 2:10 Giriş
  • 5:15 Kablolama açıklaması
  • 7:32 Arduino kodu açıklaması
  • 18:43 Arduino IDE’de ESP32 kartı ve COM portu seçimi
  • 20:27 İnternet Saati Gösterimi

Görseller

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

İhtiyacın olabileceğini düşünüyor

Kaynaklar ve referanslar

Dosyalar📁

Gerekli Dosya (.h)