これまで購入したRTCは5V対応でラズパイ用にはよいのですが、
PICOで使うには信号電圧変換が必要でした。
もっと手軽な3.3V対応のRTC(DS3231)があることを知り、
AMAZONで入手しました。
■AMAZONに記載されている仕様の概略
VKLSVAN
DS3231 AT24C32 RTCモジュール IIC Arduino対応
DS3231は、温度補償水晶発振器(TCXO)と水晶を内蔵した、低コストI2C−RTC。(注記:TCXO内蔵ではなくMEMS方式でした)
バッテリー入力内蔵、主電源切断でも正確な時間管理を維持。(中略)
電圧:DC 3.3-5.5V;
製品名:リアルタイムクロックモジュール;
チップ:DS3231 ピン数:6
1×3V CR2032電池(非同梱);
PCB:3.8×2.3センチメートル/ 1.5"×0.9")
クロック精度::0 ~ 40 ℃レンジ 精度:2ppm 誤差:一分
材料:PCB; メインカラー:ブルー 純重量:11グラム;
パッケージ内容:2 ×リアルタイムクロックモジュール
■CR2032を使うときの充電回路の切断方法
DS3231は水晶発信式で時計精度の高いNタイプとMEMS式のやや精度が落ちるMタイプとあるそうです。今回購入したもの(2個)はMタイプでした。
電池としてCR2032を使うときは充電回路を外せとのこと。下記ご参照。
出典1
RTC (リアルタイムクロック) (DS3231)
https://ht-deko.com/arduino/rtc_ds3231.html
チップ抵抗を捻り外すのが一番簡単ですね。
出典2
リアルタイムクロック DS3231 を使った ZS-042 というモジュールを調べる(その2)
http://radiopench.blog96.fc2.com/blog-entry-922.html
■適用マイコン
今回はPICOではなくGPIOを30ピン使えるAE-RP2040を秋月電子から購入。
Wifiなしでよければこちらも選択枝になります。
PICOより若干安価ですが、ピンヘッダは自分ではんだ付けになります。
AE-RP2040については別途アップします。
AE-RP2040に配線してDS3231のI2Cアドレス0x68を確認しました。
■DS3231の使い方
出典
リアルタイムクロックモジュールDS3231の使い方
https://blog.boochow.com/article/459684626.html
ドライバ記述ありますが使わず
■DS3231仕様書
https://www.analog.com/media/en/technical-documentation/data-sheets/ds3231.pdf
■ライブラリ
出典
MicroPython TechNotes: DS3231 RTC
https://techtotinker.com/2021/04/21/030-micropython-technotes-ds3231-rtc/
上述にあるライブラリをコピーして名称をds3231.pyにしてAE-RP2040へ保存。
(Thonnyを使っています)
■メインコード例(出典のコードから少し編集しました)
# More details can be found in TechToTinker.blogspot.com
# George Bantique | tech.to.tinker@gmail.com
from machine import Pin
from machine import SoftI2C
from ds3231 import DS3231
from time import sleep_ms
#set RTC-object
i2c = SoftI2C(scl=Pin(17), sda=Pin(16), freq=400000)
ds = DS3231(i2c)
#set RTC(時刻を手動セット。1秒前に起動がよい。セット後は不要)
#ds.set_time(2024, 10, 27, 11, 00, 00, 6, 00)
#ds.set_time(YYYY,MM, DD, HH, MM, SS, WD, 00)
#print( "set time" )
#sleep_ms(2000)
for i in range(0,100):
t = ds.get_time()
#print( "ds3231 time :" , year )
print( "ds3231 time :" , t[0],t[1],t[2], t[3],t[4],t[5], t[6] )
sleep_ms(1000)
# The following line of codes can be tested using the REPL:
# 1. Get the current time
# ds.get_time()
# Return:
# YYYY, MM, DD, HH, mm, ss, WD, YD
# YYYY - year
# MM - month
# DD - day
# HH - hour in 24 hour
# mm - minutes
# ss - seconds
# WD - week day: 1=Monday, 7=Sunday
# YD - day of the year
# 2. Set the current time
# ds.set_time(YYYY, MM, DD, HH, mm, ss, WD, YD)
# ds.set_time(2021, 04, 20, 08, 30, 00, 02, 00)
これでうまくいきました。出典元さまに感謝!
MQTTなどで測定時刻をデータに入れる必要があればこれで十分と思います。
が、MQTT-Sub側で記録時刻入れられるならば発信側にRTC不要との論も。。。
要は使い分け。
以上