さて次はNTPで時刻合わせ。

ArduinoではRTC購入して配線して現在時刻をプログラムで書き込んでとやったけど

ESP32は標準でWiFi機能持ってるとはいえどんなものかなと。

あれまあほんとに1行だ

  configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); 

Wifiのアクセスポイントに接続して上の1行で時刻取得、あとは取得した時刻を表示形式を見やすくするだけ。

こりゃあいい。配線も何もいらない。コンパイルして書き込むだけ。

アクセスポイントつなげない場所だとRTCいるけど。

image

今日のスケッチ

/*
 * 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);
}