CircuitPython 10行プログラミング Step2 (3) RTC DS3231
日時や時刻を利用するにはRTC(Real Time Clock)が便利です。Cortex-Mシリーズでは時計用の水晶発振子に対応した発振回路をもち、時刻を管理するマイコンもあります。Arduino MKRZEROでは、ボードがRTCに対応していました。
ここで利用しているAdafruit Grand Central M4 Express featuring the SAMD51は、そのような回路は搭載されていません。I2CインターフェースをもつDS3231を利用します。裏側にはCR2032の電池が取り付けられます。アマゾンで入手しました。
(※)2019/5/20 このボードは電池に充電するため、ボタン電池のCR2032を使い続けると発熱し、発火などの事故が起こることをメールでご指摘いただきました。ありがとうございます。充電経路にあたる200Ωの抵抗をはんだゴテで取り除き、対応して利用しています。
<参考> https://ht-deko.com/arduino/rtc_ds3231.html Arduinoフォーラム
●接続
DS3231 | Grand Central |
---|---|
SCL | SCL |
SDA | SDA |
Vcc | 3.3V |
GND | GND |
●rtcモジュールを利用
基本的なモジュールの中にrtcがあります。ドキュメントによれば、このクラスのメソッドは次のとおりです。
- datetime
- calibration
●時間を利用するのはtimeモジュール
timeモジュール内で利用できる関数を表示します。いつも使っているのはsleepです。
>>> import time >>> help(time) object <module 'time'> is of type module __name__ -- time monotonic -- <function> sleep -- <function> struct_time -- <class 'struct_time'> localtime -- <function> mktime -- <function> time -- <function> monotonic_ns -- <function> |
いくつか実行してみます。
>>> import time >>> print(time.time()) 946689011 >>> print(time.localtime()) struct_time(tm_year=2000, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=10, tm_sec=21, tm_wday=5, tm_yday=1, tm_isdst=-1) >>> print(time.monotonic()) 4257.72 |
年月日および時刻はstruct_time()で得られることがわかります。
tm_year=西暦4桁, tm_mon=月1~12, tm_mday=日1~31, tm_hour=時0~23, tm_min=分0~59, tm_sec=秒0~61, tm_wday=曜日0~6, tm_yday=年1~366, tm_isdst=0、1、-1のいずれか(夏時間が有効な場合は1、そうでない場合は0。値が-1の場合は夏時間は不明) |
●Adaruitのrtcプログラム
RTC用IC DS3231を利用する解説はこちらのページにあります。ds3231_simpletest.pyから最小限のプログラムを抜き出しました。
import time
import board
import busio as io
import adafruit_ds3231
i2c = io.I2C(board.SCL, board.SDA) # Change to the appropriate I2C clock & data
rtc = adafruit_ds3231.DS3231(i2c)
days = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
# year, mon, date, hour, min, sec, wday, yday, isdst
#t = time.struct_time((2019, 5, 19, 10, 3, 15, 0, -1, -1))
#rtc.datetime = t
while True:
t = rtc.datetime
#print(t) # uncomment for debugging
print("The date is {}/{}/{} {}".format(t.tm_year, t.tm_mon, t.tm_mday, days[int(t.tm_wday)]))
print("The time is {}:{:02}:{:02}".format(t.tm_hour, t.tm_min, t.tm_sec))
time.sleep(1) # wait a second
新規に日時や時刻を設定するには、
#t = time.struct_time((2019, 5, 19, 10, 3, 15, 0, -1, -1))
#rtc.datetime = t
のコメントを外し、必要な数字を入れます。そして保存すると実行し、RTC IC内に保存され、新たな時を刻み始めます。
コメントに戻して再度保存すると、読み出し部分が有効になり、日時を表示します。
●電池
RTCボードにはCR2032のボタン電池が入ります。これをセットして、上記のように時刻をセットします。
USBケーブルを抜き、翌日にUSBケーブルを挿して上記のプログラムを実行すると、今の時刻を表示します。ボタン電池でRTCは正常に時を刻んでいたようです。