ArduinoでNTP取得(ESP-WROOM-02を使用)


Arduino本体の方で現在時刻を取得(誰か需要あるのだろうか…)

ちなみにESP-WROOM-02は単体でArduinoとして使用でき,
ライブラリによって直接NTPから現在時刻を取得できます.
ESP8266のntpの設定は1行で

回路構成

下の記事を参考に回路を組みます.
Arduino Leonardoで試しましたが,本体の3.3Vで駆動できました.
ただし,Software Serialがうまくいかなかったので10, 9番ピンに変更しました.
【Arduino】ESP-WROOM-02( ESP8266 )を使ってWifiで無線通信する

サンプルプログラム概要

  1. ESP-WROOM-02でWiFi接続
  2. NICTのjson形式のNTP情報をHTTP/GET
  3. jsonを展開して現在時刻へ登録

サンプルプログラム

NTP.ino
#include <TESP8266.h> //ESP-WROOM-02ライブラリ
#include <TimeLib.h> 
#include <ArduinoJson.h>

// Wifi Config
const char* host = "ntp-a1.nict.go.jp";
const char* path = "/cgi-bin/json";
// Wifi
const char* ssid = "YOUR SSID";
const char* password = "YOUR WIFI PASSWORD";
TESP8266 httpClient(10, 9);

void setup() {
  Serial.begin(9600);

  // ESP-WROOM-02との接続確認(ATコマンドのテスト)
  while (true) {
    if (httpClient.statusAT(true)) {
      Serial.println("*** ESP-WROOM-02と接続しました。");
      break;
    }
    else Serial.println("*** ESP-WROOM-02と接続できません。");
    delay(1000);
  }

  // アクセスポイントに接続(DHCP)
  while (true) {
    if (httpClient.connectAP(ssid, password)) {
      Serial.println("*** アクセスポイントに接続しました。");
      break;
    }
    else Serial.println("*** アクセスポイントに接続できませんでした。 再試行中...");
    delay(1000);
  }

  // Wifi接続の確認
  while (true) {
    if (httpClient.statusWiFi()) {
      Serial.println("*** Wifi接続しました。");
      break;
    }
    else Serial.println("*** Wifi接続できません。");
    delay(1000);
  }

  ntp(); //本体へ登録 

}


void loop() {
  time_t t = now(); 
  char s[20];

  const char* format = "%04d-%02d-%02d %02d:%02d:%02d";
  sprintf(s, format, year(t), month(t), day(t), hour(t), minute(t), second(t));
  Serial.println(s);
  delay(1000);
}

void ntp() {
  StaticJsonBuffer<200> jsonBuffer;
  uint32_t filesize = 0;
  String resultString  = httpClient.get(host, path, filesize);
  JsonObject& root = jsonBuffer.parseObject(resultString);
  String ntp = root["st"];
  long unsigned int nt = ntp.toInt();
  setTime(nt);
}

動作サンプル