見出し画像

RTCモジュール(DS3231)を試す(1)

以前試したDS1302

DS1302、40NTD(約150円)と格安なのはいいのですが、どうも誤差が大きくて一日で十秒以上もずれてしまいます。およその時間を取得するにはいいですが、

みたいなことをやったところ、誤差が大きすぎて、かなり「残念!」な時計になってしまいました。そこで、少し前にグレードの高い、DS3231のRTCモジュールを、いつもの「今華電子」さんで買ってきたのです。185NTD(約710円)でした。

さて、先ほど改めて今華電子さんのウェブサイトを見たら

99NTD(約380円)ですと。突然半額近い大幅値下げじゃないですか(ショック)・・・。

さて、DS1302は,CE、I/O、SCLKの3線通信だったのですがDS3231はI2Cで2線通信です。

画像1

+に+5V, -にGND、 DをUNOのA4 CをUNOのA5につなぎます。この辺はArdunoのWireライブラリの説明

に、

Board      I2C / TWI pins
Uno, Ethernet   A4 (SDA), A5 (SCL)

とある通りですね。で、つなぎました。

画像2

さて、ライブラリはどうするか。いくつかあるようです。

「文系だってITしたい。」さんの同じテーマ(DS3231)の記事

を読ませていただいたところライブラリは「DS3232RTC」をお使いでした。

Arduinoの公式サイトでDS3231を検索するとAndrew Wickert さんのライブラリ

が出てくるので、当方ではこちらを使ってみることにします。

関数がいっぱいあります。
date2days()
time2long()
conv2d()
unixtime()
bcd2bin()
bin2bcd()
now()
getSecond()
getMinute()
getHour()
getDoW()
getDate()
getMonth()
getYear()
setSecond()
setMinute()
setHour()
setDoW()
setDate()
setMonth()
setYear()
setClockMode()
getTemperature()
getA1Time()
getA2Time()
setA1Time()
setA2Time()
turnOnAlarm()
turnOffAlarm()
checkAlarmEnabled()
checkIfAlarm()
enableOscillator()
enable32kHz()
oscillatorCheck()
decToBcd()
bcdToDec()
readControlByte()
writeControlByte()

豊富な機能は、おいおい調べるとして、今回、とりあえず使うのは、

日付時刻セット系
setSecond()
setMinute()
setHour()
setDate()
setMonth()
setYear()

日付時刻読み出し系
getSecond()
getMinute()
getHour()
getDate()
getMonth()
getYear()

だけにします。読み出し系で、 getHour()とgetMonth()については引数が必要で、設定しておかないと値がとれないので注意です。

getHour(bool& h12, bool& PM)
h12は 12時間表示かどうかを指定。12時間表示の場合は PMに午後かどうかが返されるようです。

getMonth(bool& Century)
Centuryは2100年代に入ったらtrueにするらしい。まあ、自分が生きている間はfalse固定。

ソースは次の通り、時刻合わせは、一度だけ使ってコメントアウトしています。

#include <DS3231.h>
#include <Wire.h>
DS3231 myRTC;
bool century = false; //century=true にするのは2100年代の話
bool h12Flag = false;
bool pmFlag;
void setup() {
	Wire.begin();
	Serial.begin(9600);
 /*
 myRTC.setYear(21);
 myRTC.setMonth(3);
 myRTC.setDate(20);
 myRTC.setHour(23);
 myRTC.setMinute(40);
 myRTC.setSecond(0);
 */
}
void loop() {
 Serial.print(20,DEC);
 Serial.print(myRTC.getYear(), DEC);
 Serial.print(' ');
 Serial.print(myRTC.getMonth(century), DEC);
 Serial.print(' ');
 Serial.print(myRTC.getDate(), DEC);
 Serial.print(' ');
 Serial.print(myRTC.getHour(h12Flag, pmFlag), DEC);
 Serial.print(' ');
 Serial.print(myRTC.getMinute(), DEC);
 Serial.print(' ');
 Serial.println(myRTC.getSecond(), DEC);
 delay(1000);
}


画像3

シリアルモニタで年月日、時分秒が取得できているのがわかります。

※そうそう、最近出たArduinoIDE 2.0 のベータ版を早速試しています。コード補完ができるのはうれしいです。

この記事が気に入ったらサポートをしてみませんか?