さて次はNTPで時刻合わせ。
ArduinoではRTC購入して配線して現在時刻をプログラムで書き込んでとやったけど
ESP32は標準でWiFi機能持ってるとはいえどんなものかなと。
あれまあほんとに1行だ
configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
Wifiのアクセスポイントに接続して上の1行で時刻取得、あとは取得した時刻を表示形式を見やすくするだけ。
こりゃあいい。配線も何もいらない。コンパイルして書き込むだけ。
アクセスポイントつなげない場所だとRTCいるけど。
今日のスケッチ
/*
* ESP32 JST から時間取得
*
* ref: https://qiita.com/h_nari/items/d0374d1e1e36b9d988c0
*/
#include <WiFi.h>
#include <time.h>
#include <SPI.h>
#include <Wire.h>
#include "SSD1306.h"
SSD1306 display(0x3c, 21, 22); //SSD1306インスタンスの作成(I2Cアドレス,SDA,SCL)
// WiFi Setting
#define WIFI_SSID "AP名前"
#define WIFI_PASSWORD "APパスワード"
#define JST 3600*9
void setup() {
Serial.begin(115200);
display.init(); //ディスプレイを初期化
Serial.print("\n\nReset:\n");
// WiFi starting
// drawLog("WiFi connecting...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while(WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println();
Serial.printf("Connected, IP address: ");
Serial.println(WiFi.localIP());
// drawLog("WiFi connected!");
// NTP start
//configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); // こっちでも動いた
configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");// 2.7.0以降, esp32コンパチ
delay(1000);
}
void loop() {
time_t t;
struct tm *tm;
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
char rdate[30], rtime[30];
t = time(NULL);
tm = localtime(&t);
Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
wd[tm->tm_wday],
tm->tm_hour, tm->tm_min, tm->tm_sec);
sprintf(rdate, " %04d/%02d/%02d(%s)",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, wd[tm->tm_wday]);
sprintf(rtime, " %02d:%02d:%02d",
tm->tm_hour, tm->tm_min, tm->tm_sec);
display.clear();
display.setFont(ArialMT_Plain_16); //フォントを設定
display.drawString(0, 0,rdate);
display.drawString(0, 16,rtime);
display.display(); //指定された情報を描画
// drawClock(rdate, rtime);
delay(1000);
}