リアルタイムクロック/RTC DS3231+AT24C32 [ハード]
このモジュールは、リアルタイムクロック(RTC)のDS3231とEEPROMのAT24C32が載っている。
I2Cで、それぞれ別々にアクセスでき、時刻とともに計測データなどを記録するのに便利になってる。
I2Cのアドレスは、RTCが0x68、EEPROMが、何もしなければ0x57。
DS3231のデータシート
DS3231は、高精度、低消費電力が売りで、
確かにDS1307に比べると電池の持ちがかなりいいいようだ。
なお、「高精度」というと1秒も狂わないと思ってる人がいるようだけど、
単独で動いてる時計としては高精度な方ということ。
今、電波時計が流行ってるけど、結局時計メーカーでさえ単独で狂わないのをあきらめて、電波で補正することを選んだように、単独で正確な時刻を刻むのは無理。
DS3231は、電圧は、2.3-5.5V。推奨3.3V。
バックアップのバッテリ電圧は、2.3-5.5V。推奨3.0V。
ピンは、32K、SQW、SCL、SDA、VCC、GND。
(反対側にあるターミナルは、I2Cのカスケード用)
32Kは、FLAGをセットすることで、32KHzのパルスが出力される。
SQWは、FLAGでアラームをセットすることで、設定時刻になると
これもFLAGでセットされた周波数の方形波が出力される。
データの内容は、下記のようになる。
00h 秒:上4ビットの下3ビットが10の位、下4ビットが1の位。
01h 分:上4ビットの下3ビットが10の位、下4ビットが1の位。
02h 時:上4ビットが0、12/24=1、AM/PM、10の位、
または、 0、12/24=0、20の位、10の位、
下4ビットが1の位。
03h 曜日:下3ビット。ユーザーが決める。
04h日:上4ビットの下2ビットが10の位、下4ビットが1の位。
05h月:上4ビットの上1ビットが世紀、下1ビットが10の位、下4ビットが1の位。
06h年:上4ビットが10の位、下4ビットが1の位。
07h-0Ah:ALARM 1
0Bh-0Dh:ALARM 2
0Eh-0Fh:制御/ステータス
10h:オフセット値
11h-12h:温度
Arduinoのライブラリ。DS1307用だけど使えるようだ。
PCの時刻をセットできるので便利。
DS1307とTIMEの両方をArduinoのライブラリに入れて、
サンプルの「settime」を実行すればPCの時刻がセットされる。
EEPROM=AT24C32のデータシート
AT24C32は、32Kビット=4KバイトのEEPROM。
A0、A1,A2(写真の右下にある)は、短絡することでEEPROMの下位アドレスを変更できる。
デバイスアドレスは、1010、A2、A1、A0、R/W。(W=0、R=1)。
具体的には、何もしなければ0x57。A0を半田などで短絡させると最下位が0になるので、
アドレスは、0x56になる。これは、EEPROMを複数使う時に使い分けるためにあるので、
1つだけなら、何もしないで使える。
書き込みは、デバイスアドレス+ワードアドレス2バイト+データ
読み込みは、データなしで書き込んだ後に、デバイスアドレスでリードする。
使い方はこんな感じ。
EEPROMのでーたアドレス0に”A”を書き込んで、
アドレス0を読みだして、シリアルに表示しているだけ。
#include#define address 0x57 byte data; void setup() { Wire.begin(); Serial.begin(9600); delay(1000); //WRITE!!!!******************************* Wire.beginTransmission(address); Wire.write(0x00); //First Word Address Wire.write(0x00); //Second Word Address Wire.write(0x41); //Write an 'A' delay(10); Wire.endTransmission(); delay(10); //READ!!!!********************************* Wire.beginTransmission(address); Wire.write(0x00); //First Word Address Wire.write(0x00); //Second Word Address Wire.endTransmission(); delay(10); Wire.requestFrom(address, 1); delay(10); data = Wire.read(); Serial.write(data); //Read the data and print to Serial port Serial.println(); delay(10); } void loop() { }
RTC/リアルタイムクロックモジュール+EEPROM
コメント 0