ESP32 チュートリアル 53/55 - LCD インターネットクロックの作成 | SunFounder の ESP32 IoT 学習キット
このチュートリアルでは、SunFounderのESP32マイクロコントローラを使用して、インターネット接続型のLCD時計を作成します。この時計はインターネット経由で現在の時間と自動的に同期し、12時間形式または24時間形式で時間を表示し、曜日、日付、月も表示します。ネットワーク時間プロトコル(NTP)を使用することで、時計は手動調整なしで正確さを維持します。
このプロジェクトでは、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を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接続を設定します。重要な識別子として、ssidとpasswordWi-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に現在の時間を表示するために使用されます。時間がまだ利用できない場合は、シリアルモニターにメッセージを印刷します。
最後に、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 インターネット時計デモ
/*
* 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(); // 時間を同期するのに少し時間がかかります :)
}
Common Course Links
Common Course Files
必要かもしれないもの
-
アマゾンAmazonでLCD1602-I2Cを購入するamzn.to
-
イーベイeBayでLCD1602-I2Cを購入するebay.us
-
バングッドBanggoodからLCD1602ディスプレイを購入するbanggood.com
リソースと参考文献
-
外部BanggoodからLCD1602ディスプレイを購入するbanggood.com
ファイル📁
必要なファイル (.h)
-
TZ.h
TZ.h0.02 MB