I2Cクラスが使えるようになったので、OLED以外にも手持ちのI2Cデバイスを試してみます。
今回は「DS3231」を使ったリアルタイムクロックモジュールです。
実は前回の写真にも、ちょこっと登場しています。
DS3231はバッテリバックアップつきの時計モジュールで、Aliexpressで100円程度で入手できます。ちなみにバッテリは交換不可能です。
接続は、以下の写真のように、5つのピンソケットのうち4本を使ったI2Cです。
(左から、+、SDA、SCL、NC、-)
マニュアルはネットでダウンロードできます。
単純なレジスタアクセス方式です。レジスタの一覧を以下に示します。
時計機能のほか、アラームが2セットと温度計が搭載されています。
時刻情報は10進数形式(8bitを4bit+4bitに分け、それぞれ10の位と1の位を表す)になっています。
例えば10進の「12」は、レジスタ上では16進数で「0x12」になっています。
MicroPythonでのドライバを書いてみました。(アラーム関係は省略しています。)
使い方はこんな感じです。
c = DS3231(i2c) c.write([2018, 5, 30, 23, 30, 45, 3]) # 2018/5/30 23:30:45 Wed c.read()
DS3231から1秒ごとに情報を取得して、I2C接続したOLEDに表示させればデジタルクロックのできあがりです。
1秒ごとの画面更新はTimerクラスが使えます。
なおOLEDのSSD1306のドライバは、MicroPython付属のものに対して以下のように修正が必要です。
def write_data(self, buf):
self.i2c.writeto(self.addr, bytearray([0x40]), False)
self.i2c.writeto(self.addr, buf)
動かしている様子です。
コメント