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は正常に時を刻んでいたようです。