TinyRTC(HW-111)の約一か月の時刻差

以前購入したお手軽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()

Updated: 2026年2月21日 — 10:31

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です