Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
39
Help us understand the problem. What is going on with this article?
@exabugs

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

More than 5 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時計を作ろうかと思っています。

39
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
exabugs

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
39
Help us understand the problem. What is going on with this article?