شِفر (کود) جستجو

آموزش ESP32 53/55 - ساخت یک ساعت اینترنتی LCD | کیت یادگیری IoT ESP32 سان‌فاندر

آموزش ESP32 53/55 - ساخت یک ساعت اینترنتی LCD | کیت یادگیری IoT ESP32 سان‌فاندر

در این آموزش، ما یک ساعت LCD متصل به اینترنت با استفاده از میکروکنترلر ESP32 از SunFounder خواهیم ساخت. این ساعت به صورت خودکار با زمان فعلی از طریق اینترنت همگام‌سازی می‌شود و زمان را به فرمت 12 ساعته یا 24 ساعته نمایش می‌دهد، همراه با روز هفته، تاریخ و ماه. استفاده از پروتکل زمان شبکه (NTP) اطمینان می‌دهد که ساعت بدون نیاز به تنظیمات دستی دقیق باقی بماند.

esp32-53 ساعت اینترنتی اصلی

این پروژه از قابلیت‌های Wi-Fi داخلی ESP32 برای دریافت زمان جاری از یک سرور NTP استفاده می‌کند. ما از یک نمایشگر کریستال مایع (LCD) برای نمایش زمان استفاده خواهیم کرد که می‌تواند بر اساس ترجیحات کاربر قالب‌بندی شود. برای توضیحات بیشتر در مورد هر کدام از مراحل، لطفاً به ویدیو (در ویدیو در ۰۰:۳۰) مراجعه کنید.

توضیح سخت‌افزار

اجزای اصلی این پروژه شامل میکروکنترلر ESP32، یک نمایشگر LCD 20x4 و یک منبع تغذیه است. ESP32 یک میکروکنترلر قدرتمند با Wi-Fi و بلوتوث داخلی است که آن را برای پروژه‌های اینترنت اشیا مناسب می‌سازد. LCD برای نمایش زمان و تاریخ استفاده می‌شود و می‌توان آن را برای سایزهای مختلف نمایش پیکربندی کرد.

ال‌سی‌دی از طریق پروتکل I2C کار می‌کند که امکان ارتباط روی دو سیم (SDA و SCL) را فراهم می‌آورد. این کار باعث ساده‌تر شدن سیم‌کشی و کاهش تعداد پایه‌های مورد نیاز بر روی ESP32 می‌شود. ارتباط با سرور NTP با استفاده از قابلیت‌های Wi-Fi ESP32 برقرار می‌شود و بروزرسانی‌های آنی را ممکن می‌سازد.

  • ولتاژ منبع تغذیه را درست تأمین کنید (5 ولت).
  • از خازن‌های کلاچ‌زدایی در نزدیکی پایه‌های تغذیه برای پایداری استفاده کنید.
  • با اتصالات 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 متصل کنید. اطمینان حاصل کنید که اتصالات محکم هستند تا از مشکلات ارتباطی جلوگیری کنید.

در هنگام راه‌اندازی سیم‌کشی، از سیم‌های پرش مرد به زن برای اتصالات آسان استفاده کنید. اگر LCD شما آدرس I2C یا پیکربندی پایه متفاوتی دارد، شِفر (کود) را به‌طور مناسب تنظیم کنید. برای گزینه‌های دیگر سیم‌کشی در صورت لزوم به ویدیو در (در ویدیو در ۰۵:۳۰) مراجعه کنید.

نمونه کدها و راهنمایی

شِفر (کود) ال‌سی‌دی را راه‌اندازی کرده و اتصال 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";

این بخش نام کاربری شبکه و آدرس‌های سرور را نشان می‌دهد. اطمینان حاصل کنید که SSID و رمز عبور Wi-Fi خود را به درستی وارد می‌کنید، زیرا هر گونه اشتباه باعث خواهد شد که ESP32 نتواند به اینترنت متصل شود.

In theprintLocalTime()تابع، زمان کنونی برای نمایش فرمت‌بندی می‌شود. ساختار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 استفاده می‌شود. اگر زمان هنوز در دسترس نباشد، پیامی را در نمایشگر مسلسل چاپ می‌کند.

در نهایت، این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);

این بخش، نمایشگر مسلسل را برای اشکال‌زدایی راه‌اندازی می‌کند، LCD را تنظیم می‌کند و سعی در اتصال به شبکه Wi-Fi تعیین‌شده دارد. وضعیت اتصال در نمایشگر مسلسل چاپ خواهد شد تا شما بتوانید اتصال را تأیید کنید.

نمایش / چه انتظاری داشته باشید

پس از تنظیم موفقیت‌آمیز، صفحه‌نمایش LCD زمان فعلی، روز هفته و تاریخ را نمایش خواهد داد. می‌توانید انتظار داشته باشید که زمان هر ۵ ثانیه یکبار به‌روز شود، به‌لطفloop()اگر اتصال به سرور NTP ناموفق باشد، پیامی در نمایشگر مسلسل ظاهر می‌شود که نشان می‌دهد زمان هنوز در دسترس نیست (در ویدیو در ساعت ۱۲:۰۰).

دامنه‌های متداول شامل سیم‌کشی نادرست، آدرس‌های نادرست I2C و اعتبارنامه‌های نادرست Wi-Fi است. اطمینان حاصل کنید که همه اتصالات ایمن هستند و سرور NTP قابل دسترسی از شبکه شماست.

زمان‌بندی ویدئو

  • ۰۰:۰۰ شروع
  • مقدمه ۲:۱۰
  • ۵:۱۵ توضیح سیم‌کشی
  • شِفر (کود) آردوینو در ساعت ۷:۳۲ توضیح داده شده است
  • ۱۸:۴۳ انتخاب برد 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++
/*
 * ساعت اینترنتی با استفاده از کیت یادگیری IoT ESP32 سون‌فاندز  
 * آموزش کامل ویدئویی https://youtu.be/0KnuNqfiVug  
 * 📚⬇️ صفحه دانلود و منابع https://robojax.com/RJT686  
 * ساعت اینترنتی برای ESP32  
 * نوشته احمد ششمiri در 31 دسامبر 2023 ساعت 19:29  
 * www.Robojax.com
 */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 // SDA->21, SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // آدرس LCD را بر روی 0x27 برای یک نمایشگر 16 کاراکتری و 2 خطی تنظیم کنید

const bool showSeconds = true; // برای نمایش ثانیه‌ها به "true" تنظیم کنید و برای پنهان کردن به "false" تنظیم کنید.
const bool showShortMonth = false; // دسامبر = نادرست، دسامبر=true
const bool show24Hours = true; // درست برای ۱۸:۳۰ یا نادرست برای ۶:۳۰

#include <WiFi.h>
#include "time.h"
#include "sntp.h"
#include "TZ.h"
 // TZ.h از 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");

 // فرمت زمان HH:MM
  char timeHour[5];
  strftime(timeHour,5, "%H", &timeinfo);
  String hourString = String(timeHour); // زمان ساعت را به رشته تبدیل کن
  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); // اگر 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);





}

 // تابع بازگشتی (زمانی که زمان از طریق NTP تنظیم می‌شود فراخوانی می‌شود)
void timeavailable(struct timeval *t)
{
  Serial.println("Got time adjustment from NTP!");
  printLocalTime();
}

void setup()
{
  Serial.begin(115200);
  lcd.init(); // lcd را راه‌اندازی کنید
  lcd.backlight(); // نور پس‌زمینه LCD را روشن می‌کند.
  lcd.print("Internet Clock");
  delay(3000); // ویف ۳ ثانیه
 // تابع برگشت تماس اعلان را تنظیم کنید
  sntp_set_time_sync_notification_cb( timeavailable );

/*
 * آدرس سرور NTP می‌تواند از طریق DHCP به دست آید،
 * 
 * توجه: این فراخوانی باید قبل از اینکه esp32 آدرس IP را از طریق DHCP بگیرد انجام شود، در غیر این صورت گزینه SNTP 42 به طور پیش‌فرض رد خواهد شد. 
 * توجه: اگر فراخوانی تابع configTime() پس از اجرای DHCP-client انجام شود، آدرس سرور NTP به دست آمده را نادیده خواهد گرفت.
 */
  sntp_servermode_dhcp(1); // (optional)

/*
 * این تنظیمات سرورهای NTP پیکربندی شده و زمان ثابت/اختلاف نور روز را تعیین می‌کند. اگر منطقه زمانی شما نیاز به تنظیم اختلاف نور روز دو بار در سال نداشته باشد، باید مناسب باشد؛ در این صورت تنظیم زمان به طور خودکار مدیریت نخواهد شد.
 */
 // تعیین کننده زمان (gmtOffset_sec، daylightOffset_sec، ntpServer1، ntpServer2)؛

/*
 * یک رویکرد راحت‌تر برای مدیریت نواحی زمانی با offset روز روشن، مشخص کردن یک متغیر محیطی با تعریف ناحیه زمانی شامل قوانین تنظیم روز روشن خواهد بود. فهرستی از قوانین برای ناحیه شما می‌تواند از https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h به‌دست آید.
 */

 // تنظیم زمان منطقه‌ای(TZ_America_Toronto, ntpServer1, ntpServer2);
  configTzTime(TZ_America_Toronto, ntpServer1, ntpServer2);

 // به 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(); // همزمان‌سازی زمان کمی زمان می‌برد :)
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

منابع و مراجع

فایل‌ها📁

فایل مورد نیاز (.h)