概要

こんにちは,けりです. みなさん,ESP32使ってますか?

今回はESP32の時刻合わせのArduinoライブラリを作ったので紹介します.

ESP32Time

ESP32Time - Arduino Library for ESP32 Time Adjustment

こちらはArduinoのライブラリです.zipファイルをダウンロードして,Arduino IDEで読み込めば簡単に使うことができます.ライブラリを読み込むと,自動的にサンプルプログラムも追加されます.

ライブラリの概要

  • NTPから時刻を取得し,ESP32の内部の時計を合わせる
  • 1日ごとに時計を合わせる

使い方

  1. WiFiに接続する
  2. setup()内でESP32Time.begin()を呼んで時刻合わせタスクを起動する

動作環境

Arduino core for ESP32 WiFi chip環境があれば動作します.

コード

最新のコードはこちら

ESP32Time.h

ESP32Timeクラスの実体は既に定義されていますが,ESP32.begin()をしない限りCPUリソースを消費することはありません.

#pragma once

#include <WiFi.h>
#include "freertos/task.h"

class ESP32Time;
extern class ESP32Time ESP32Time;

class ESP32Time {
  public:
    ESP32Time(char *time_zone = "JST-9");
    ~ESP32Time();

    void begin(int stack_size = 1024, int priority = 0);
    void set_time();

  private:
    const char* time_zone;
    xTaskHandle handle;

    void periodicTimeAdjustmentTask();
    bool getNtpTime(struct timeval * tvp);
};

サンプルプログラム

/**
  @file     ESP32Time.ino
  @author   kerikun11
  @date     2017.08.29
*/

#include <WiFi.h>
#include <ESP32Time.h>

const char* ssid = "";
const char* psk = "";

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

  // WiFi Connection
  log_i("connecting to %s ...", ssid);
  WiFi.begin(ssid, psk);
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    log_e("WiFi connection failed:(");
    while (1) delay(1000);
  }

  // adjust the time just now,
  // and automatically adjust the time once a day
  ESP32Time.begin(); //< adjusted the time
}

void loop() {
  // get the time
  time_t t = time(NULL);
  struct tm *t_st;
  t_st = localtime(&t);
  // display the time
  log_d("year: %d", 1900 + t_st->tm_year);
  log_d("month: %d", 1 + t_st->tm_mon);
  log_d("month day: %d", t_st->tm_mday);
  log_d("week day: %c%c", "SMTWTFS"[t_st->tm_wday], "uouehra"[t_st->tm_wday]);
  log_d("year day: %d", 1 + t_st->tm_yday);
  log_d("hour: %d", t_st->tm_hour);
  log_d("minute: %d", t_st->tm_min);
  log_d("second: %d", t_st->tm_sec);
  log_d("ctime: %s", ctime(&t));
  // wait
  delay(1000);
}

まとめ

ESP32Time.begin()をするだけなので,すぐに使えます!

なんらかのアプリケーションを作るとき,時刻管理は欠かせないのでとりあえずbeginしときましょう.