以前購入したお手軽RTCモジュール、TinyRTC。
目的のものを作るまでの間、ずっと電池は入れっぱなしで、たまーに接続して、時刻を取得していました。

その計測結果がこちら

近い計測間隔で時間差が出てるのは、適当コードなので、時刻取得してからWiFi接続してからサーバーにデータ送信するまでの時間差だと思われます。
時間差のプラスは、TinyRTCの方が早いことを表すので、26日で200秒くらい早く時刻が進んでいます。
このままの時刻差が継続する場合、1年で46分くらいずれる(早くなる)ことになりますね。
ソースコード(MicroPython)
コードは、ATOM Liteの時とほぼ同じですが、使用頻度の低いSeeed Studio XIAO ESP32C3を使ってDeepSleepで間欠動作させたので、一応、載せておきます。
起動後、Bootボタンを1秒程度押すことで、間欠動作がスタートします。
データ送信先は、自前のウェブツールです。
https://webapps.tiblab.net/device/alive-monitor/
import machine
from machine import Pin, SoftI2C
import utime
import network
import socket
import ds1307
sda_pin = 6
scl_pin = 7
def connect_wifi():
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print('connecting to network...')
sta_if.active(True)
sta_if.connect('WiFi-NAME','PASSWORD') #要変更
while not sta_if.isconnected():
pass
print('network config:', sta_if.ifconfig())
def access_http(url):
_, _, host, path = url.split('/', 3)
addr = socket.getaddrinfo(host, 80)[0][-1]
s = socket.socket()
s.connect(addr)
s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
while True:
data = s.recv(100)
if data:
print(str(data, 'utf8'), end='')
else:
break
s.close()
def get_time_from_rtc():
i2c = SoftI2C(scl=Pin(scl_pin), sda=Pin(sda_pin), freq=100000)
ds = ds1307.DS1307(i2c)
dt = ds.datetime()
dt_tuple = (dt[0],dt[1],dt[2],dt[4],dt[5],dt[6],0,0)
return utime.mktime(dt_tuple)
def main():
button = Pin(9, Pin.IN, Pin.PULL_UP)
if machine.reset_cause() != machine.DEEPSLEEP_RESET:
#最初の動作bootボタンがおされるまで待機
while True:
if button.value() == 0:
break
utime.sleep(1)
machine.deepsleep(1)
else:
#ディープスリープ復帰後の動作
while True:
dt = get_time_from_rtc()
connect_wifi()
url = 'http://webapps.tiblab.net/device/alive-monitor/?p=input-XXXXXXXX&d1=%s' % dt #ID要変更
access_http(url)
print(url)
machine.deepsleep(60*60*1000)
def check():
unix_time = get_time_from_rtc()
print(utime.localtime(unix_time))
if __name__ == '__main__':
#check()
main()
