hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

NTPで取得した時刻をRTCへセットする

2019-09-03 09:55:00 | マイコンハードウェア
データロガーの記録データに時間を添えるために時計機能が
必要です。(続編へのリンクあり)
ESP-WROOM-02マイコンはWiFiでネットワーク接続できるの
で、NTPという選択肢ありますがWiFiが使えない環境で
時刻が合わないのでは困ります。
RTCで時計機能は実現できますが、正確な時刻をセットする
方法はサンプルスケッチから見つけられませんでした。

そこで、
NTPとRTCを組み合わせる方法を考えてみました。
NTPから時刻を取得し、取得出来た時のみRTCを
合わせます。
(スケッチ例や作例を公開している方々に感謝します。)

RTCはI2C接続のDS1307を使っていまが、PCF8523や
DS3231等のRTCでも少しの変更で使えます。

続編の記事を投稿しました。
Arduion UNOとEthernet shield、DS3231 I2C RTCモジュールを
使ってスケッチ例Etherenet2 UdpNtpClentを改変して
やってみました。2020.08.22
NTPで取得した時刻をRTCへセットする(Arduino編)

ESPr One(ESP-WROOM-02)とDS3231 I2C RTCモジュール
を使って、スケッチ例NTPCilentを改変してやって
みました。2020.08.24
NTPで取得した時刻をRTCへセットする(ESP編2)

電圧ロガースケッチからの抜粋です。
#include行ライブラリ名はすべて<>で囲って下さい。
使うときは手直ししてください。
NTP.hとNTP.ccpはスイッチサイエンスさんの温度ロガー
記事からたどって入手して下さい。

#include Time.h
#include TimeLib.h
#include NTP.h
#include Wire.h
#include RTClib.h

#define UTC_TOKYO +9

unsigned long unixtime;

NTPClient ntp;
RTC_DS1307 RTC;

void setup() {
Serial.begin(115200);
ntp.udpSetup();
RTC.begin();
Wire.begin();

void loop() {
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
}
if (ntp.getTime(&unixtime)) {
time_t t = unixtime + (UTC_TOKYO * 60 * 60); // 日本標準時(JST)に調整
RTC.adjust(DateTime(year(t), month(t), day(t), hour(t), minute(t), second(t)));
Serial.println("Received NTP packet and set RTC !!");
}
}

NTP取得した時刻をRTC.adjustの引数とします。
抜粋なので抜けがあります。

無保証自己責任でお願いします。