Edited at

esp8266 で ds3231を使う2

More than 1 year has passed since last update.


概要

RTC(リアルタイムクロック)を使うために時刻を設定する。しなくてもいいけど。


パソコンの時間と同期

数種類あるDS3231のライブラリうちひとつをダウンロード。

https://github.com/jarzebski/Arduino-DS3231

スケッチ:Arduino-DS3231.ino

void setup()

{
Serial.begin(115200);

// Initialize DS3231
Serial.println("Initialize DS3231");
clock.begin();

// Set sketch compiling time
clock.setDateTime(__DATE__, __TIME__);
}

clock.setDateTime(DATE, TIME);

このコードでパソコンの日時をESP8266に書き込む。。。

コンパイル書き込みに時間がかかるので、30秒ぐらい実時間と遅れることが判明(T_T)


ntpを使って同期

下のサイトを参考にntpのスケッチを書き込み動作確認

http://qiita.com/exabugs/items/b1b7430d185b268a1abf

動くことが確認できたので2つのスケッチを組み合わせてntpをつかって同期した

#include <ESP8266WiFi.h>

#include <NTP.h>
#include <Wire.h>
#include <DS3231.h>

DS3231 clock;
RTCDateTime dt;

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

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

Serial.println();

// 自分のネットワークに合わせてください
WiFi.begin("SSID", "P/W");

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

Serial.println("WiFi connected");
ntp_begin(2390);

//ds3231
Serial.println("Initialize DS3231");;
clock.begin();

time_t n = now();
time_t t;
t = localtime(n, 9);
clock.setDateTime(year(t), month(t), day(t), hour(t), minute(t), second(t));

}

void display(){
time_t n = now();
time_t t;
t = localtime(n, 9);
sprintf(s, format, year(t), month(t), day(t), hour(t), minute(t), second(t));
Serial.print("NTP : ");
Serial.println(s);
}

void loop() {

display();
dt = clock.getDateTime();
sprintf(s, format, dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
Serial.print("DS3231: ");
Serial.println(s);

delay(1000);
}

これで大体パソコンと1秒以内の誤差でRTCの時刻を設定できた。

次は、定期処理を行う予定。