検索コード

ESP32 チュートリアル 53/55 - LCD インターネットクロックの作成 | SunFounder の ESP32 IoT 学習キット

ESP32 チュートリアル 53/55 - LCD インターネットクロックの作成 | SunFounder の ESP32 IoT 学習キット

このチュートリアルでは、SunFounderのESP32マイクロコントローラを使用して、インターネット接続型のLCD時計を作成します。この時計はインターネット経由で現在の時間と自動的に同期し、12時間形式または24時間形式で時間を表示し、曜日、日付、月も表示します。ネットワーク時間プロトコル(NTP)を使用することで、時計は手動調整なしで正確さを維持します。

esp32-53-インターネット時計-メイン

このプロジェクトでは、ESP32の内蔵Wi-Fi機能を活用してNTPサーバーから現在の時刻を取得します。ユーザーの好みに応じてフォーマットできる液晶ディスプレイ(LCD)を使用して時刻を表示します。手順についてのさらなる説明は、(動画の00:30で)ご覧ください。

ハードウェアの解説

このプロジェクトの主なコンポーネントには、ESP32マイクロコントローラー、20x4 LCDディスプレイ、および電源が含まれます。ESP32は、内蔵Wi-FiとBluetoothを備えた強力なマイクロコントローラーであり、IoTプロジェクトに適しています。LCDは時刻と日付を表示するために使用され、異なる表示サイズに設定できます。

LCDはI2Cプロトコルを介して動作し、2本のワイヤ(SDAとSCL)で通信します。これにより配線が簡素化され、ESP32に必要なピンの数が減ります。NTPサーバーへの接続はESP32のWi-Fi機能を使用して行われ、リアルタイムでの更新が可能です。

  • 正しい電源電圧(5 V)を確保してください。
  • 電源ピンの近くにデカップリングコンデンサを使用して、安定性を確保してください。
  • I2C接続にはバスの競合を避けるために注意してください。
  • LCDのI2Cアドレスを確認してください(0x27または0x3F)。
  • Wi-Fiの認証情報を確認して、正確に接続してください。
  • コードで夏時間調整を扱います。
  • 自分の地理的な位置に合った正しいNTPサーバーを利用してください。
  • 表示を更新する前に、必ずLCDをクリアしてください。

配線指示

ESP32-11_LCD-wiring

ESP32をLCDに接続するには、まず電源ピンを接続します。LCDのVCCをESP32の5Vピンに接続し、LCDのGNDピンをESP32のGNDピンに接続します。I2C通信のために、LCDのSDAピンをESP32のGPIO 21に接続し、SCLピンをGPIO 22に接続します。接続が確実であることを確認し、通信の問題を避けてください。

配線を設定する際は、簡単に接続できるようにオス-メスのジャンパーワイヤーを使用してください。LCDに異なるI2Cアドレスまたはピン構成がある場合は、コードを適宜調整してください。必要に応じて、代替の配線オプションについては(動画の05:30で)動画を参照してください。

コード例とウォークスルー

コードはLCDを初期化し、NTPサーバーから時間データを取得するためのWi-Fi接続を設定します。重要な識別子として、ssidpasswordWi-Fiネットワークに接続するために使用されますが、ntpServer1ntpServer2使用する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に現在の時間を表示するために使用されます。時間がまだ利用できない場合は、シリアルモニターにメッセージを印刷します。

最後に、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に現在の時刻、曜日、日付が表示されます。時刻は5秒ごとに更新されることが期待できます。loop()関数。NTPサーバーへの接続が失敗した場合、時間がまだ利用できないことを示すメッセージがシリアルモニターに表示されます(ビデオの12:00にて)。

一般的な落とし穴には、配線の誤り、間違ったI2Cアドレス、および不正確なWi-Fi認証情報が含まれます。すべての接続が確実であり、NTPサーバーがネットワークから到達可能であることを確認してください。

ビデオのタイムスタンプ

  • 00:00 開始
  • 2:10 はじめに
  • 5:15 配線の説明
  • 7:32 Arduinoコードの説明
  • 18:43 Arduino IDEでESP32ボードとCOMポートを選択しています
  • 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++
/*
 * SunFounderのIoT ESP32学習キットを使ったインターネット時計
 * フルビデオ指示 https://youtu.be/0KnuNqfiVug
 * 📚⬇️ ダウンロードとリソースページ https://robojax.com/RJT686
 * ESP32用インターネット時計
 * 2023年12月31日19:29にAhamd Shasmhiriが執筆
 * www.Robojax.com
 */
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 // SDA->21,SCL->22
LiquidCrystal_I2C lcd(0x27,16,2); // 16文字2行のディスプレイのためにLCDアドレスを0x27に設定します。

const bool showSeconds = true; // "true"に設定すると秒が表示され、"false"に設定すると非表示になります。
const bool showShortMonth = false; // 12月 = 偽、12月 = 真
const bool show24Hours = true; // 18:30の場合はtrue、6:30の場合はfalse

#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 12時間: %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); // ワイフ 3秒
 // 通知コールバック関数を設定する
  sntp_set_time_sync_notification_cb( timeavailable );

/*
 * NTPサーバーアドレスはDHCPを介して取得される可能性があります。
 * 
 * 注意:この呼び出しは、esp32がDHCPを介してIPアドレスを取得する前に行う必要があります。そうしないと、SNTPオプション42はデフォルトで拒否されます。
 * 注意:configTime()関数の呼び出しがDHCPクライアントの実行後に行われた場合、取得したNTPサーバーアドレスは上書きされます。
 */
  sntp_servermode_dhcp(1); // (optional)

/*
 * これは設定されたntpサーバーと一定のタイムゾーン/夏時間オフセットを設定します。あなたのタイムゾーンが年に2回夏時間オフセットを調整する必要がない場合は問題ありません。その場合、時間調整は自動的には処理されません。
 */
 // configTime(gmtOffset_sec, daylightOffset_sec, ntpServer1, ntpServer2);

/*
 * 日付変更のオフセットを扱うためのより便利なアプローチは、日付調整ルールを含むタイムゾーン定義を指定した環境変数を設定することです。あなたのゾーンのルールのリストは、https://github.com/esp8266/Arduino/blob/master/cores/esp8266/TZ.h から入手できます。
 */

 // configTzTime(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)