Arduino
IoT
ESP8266
ArduinoIDE
ESP-WROOM-02

ESP8266 (ESP-WROOM-02) でNTP(時刻合わせ)をするライブラリ。(Timeライブラリと連携して)

More than 3 years have passed since last update.


概要

ESP8266 (以下 WROOM02) で、Timeライブラリと連携して、自動的に時刻合わせをする。


はじめに

ESP8266 (以下 WROOM02) では、時刻に関する処理は Time ライブラリを使うのが便利ですが、起動直後は時刻がズレて(1970/01/01になって)いるので、時刻修正をしないといけない。

Time ライブラリでは外部時刻合わせ用の関数を設定できるので、それに対応した NTP サーバから正確な時刻を取得する関数をライブラリ化しておきます。


準備

ArduinoIDE でのライブラリの使い方は、Qiita「はじめての Arduino ライブラリ」 等を参照してください。

ネットワーク(Wi-Fi)への接続が必要です。

(より詳しくは、Qiita「ESP8266 (ESP-WROOM-02) でWi-Fi使用時のSSID/パスワードをブラウザで設定できるように」 等を参照してください。)


ライブラリの使い方



  1. Timeライブラリ をインポートします。

    (zipを作成して、「zip形式のライブラリをインポート」を実行)

$ git clone https://github.com/PaulStoffregen/Time.git Time

$ zip -r Time.zip Time


  1. 今回作成した、NTPライブラリをインポートします。

    (zipを作成して、「zip形式のライブラリをインポート」を実行)


$ git clone https://github.com/exabugs/sketchLibraryNTP NTP

$ zip -r NTP.zip NTP


  1. スケッチは以下になります。

#include <ESP8266WiFi.h>

#include <NTP.h>

void setup() {
Serial.begin(115200);
Serial.println();

// 自分のネットワークに合わせてください
WiFi.begin("your-ssid", "your-password");

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");

Serial.println("WiFi connected");

// 初期化
// 2390 はローカルのUDPポート。空いている番号なら何番でもいいです。
ntp_begin(2390);

// NTPサーバを変更 (デフォルト: ntp.nict.jp)
//setTimeServer("s2csntp.miz.nao.ac.jp");

// NTP同期間隔を変更 (デフォルト: 300秒)
//setSyncInterval(10);
}

void display(){

time_t n = now();
time_t t;

char s[20];
const char* format = "%04d-%02d-%02d %02d:%02d:%02d";

// JST
t = localtime(n, 9);
sprintf(s, format, year(t), month(t), day(t), hour(t), minute(t), second(t));
Serial.print("JST : ");
Serial.println(s);

// UTC
t = localtime(n, 0);
sprintf(s, format, year(t), month(t), day(t), hour(t), minute(t), second(t));
Serial.print("UTC : ");
Serial.println(s);
}

void loop() {
display();
delay(2000);
}


  • time_t から年月日への変換結果はTimeライブラリ内部でキャッシュされていますので、連続した year(t), month(t) 等の実行は効率的に処理されます。


実行結果

...

WiFi connected
Transmit NTP Request
sendNTPpacket : ntp.nict.jp
Receive NTP Response
JST : 2016-01-10 12:36:42
UTC : 2016-01-10 03:36:42
JST : 2016-01-10 12:36:44
UTC : 2016-01-10 03:36:44
JST : 2016-01-10 12:36:46
UTC : 2016-01-10 03:36:46
...


個人利用が許可されている国内の公開NTPサーバー

出典:http://www.atmarkit.co.jp/ait/articles/1507/08/news003.html

提供組織
アドレス

独立行政法人 情報通信研究機構(NICT)
ntp.nict.jp

インターネットマルチフィード(MFEED)
ntp.jst.mfeed.ad.jp

国立天文台
s2csntp.miz.nao.ac.jp

Ring Server Project
ntp.ring.gr.jp

NTP POOL PROJECT
jp.pool.ntp.org


公開NTPサーバーでは、NICT(情報通信研究機構)が運営するサーバーの時刻精度が日本標準時に対して10ナノ秒(1億分の1秒)以内、処理能力も毎秒100万リクエスト以上と、信頼性とキャパシティの両面から推奨できます。


NTPサーバは、冗長化のためにDNSラウンドロビンされている場合があるので、IPアドレスではなく、ホスト名でアクセスするようにします。


まとめ

Timeライブラリに時刻同期用関数を設定できる仕組みがあるので、それを使ってNTP同期するライブラリを作成しました。

(完全に非同期になるようにしたかったのですが、うまくいかなかったのでTimeライブラリの時刻同期用関数を使う方式になっています。)

次は、Qiita「ESP8266 (ESP-WROOM-02) で7セグメントLEDを制御する」 で、NTP時計を作ろうかと思っています。