ラズパイピコで温湿度ロガー

ラズパイピコ

 ラズパイピコで、温湿度ロガーを作ってみました。10分ごとに温度と湿度を測定して、SDカードに保存していきます。SDカードリーダーと、DHT11モジュールの使い方は、過去に書いた記事を参考にしました。

広告

使用する電子部品

 SDカードリーダーとDHT11を組み合わせました。エラーなどで止まっていないか確認できるように、タクトスイッチをつけました。

電子部品個数備考
1個Raspberry Pi Pico
1個E-MICRO-SD-DIP
秋月電子通商で売っているmicro-SDカードリーターです。
なおmicro-SDカード自体は別途準備して下さい。
1個DHT11モジュール
温度と湿度が一緒に計測できるデジタルセンサです。
1個タクトスイッチ
プログラムの停止と、動作確認用につけました。稼働中は押すとピコのLEDが点灯します。長押しするとプログラムが停止します。

配線図

 以下のように配線しました。

MicroPythonのコード

 コーディングは下記の通りです。
 まず、RTC(real time clock)を初期化します。プログラム開始時(=picoの電源投入時)に、sdカード内のRTCinitialize.txtを読み込んで、現在の日時を設定します。
 次に、日にちのcsvファイルをsdカード内に作成し、10分ごとに温度と湿度を記録していきます。日付が変われば、新たなcsvファイルが作られます。一日分のデータは2KBちょいなので、SDカードの容量にもよりますが、半永久的に温湿度データを溜め続けられます(溜めて何に使う?)。

from machine import Pin, SPI, RTC
import os, sdcard, dht, time

spi = SPI(0,sck=Pin(18), mosi=Pin(19), miso=Pin(16))
sd = sdcard.SDCard(spi, Pin(17))
d = dht.DHT11(Pin(2))
btn = Pin(15, Pin.IN, Pin.PULL_DOWN)
led = Pin(25, Pin.OUT)
rtc = RTC()

def saveTempHumd():
    #本日のファイル名
    file="/sd/"+str(rtc.datetime()[0])+str(rtc.datetime()[1])+str(rtc.datetime()[2])+".csv"
    #ファイルを追記用に開く(無ければ新規作成)
    fp = open(file, 'a')
    #現在の時刻、温度、湿度をファイルに書き込み
    d.measure()
    fp.write(str(rtc.datetime()[4])+":"+str(rtc.datetime()[5])+":"+str(rtc.datetime()[6])+","+str(d.temperature)+","+str(d.humidity)+"\n")
    #ファイルを閉じる
    fp.close()

#SDカードをマウント
os.mount(sd, '/sd')

#RTCを設定するファイルを読み込む
try:
    #ファイルを読み取り用に開く
    fp = open('/sd/RTCinitialize.txt', 'r')
    #ファイルから読み出して日時を設定する
    datetime=fp.read()
    print(datetime)
    rtc.datetime(eval(datetime))
    #ファイルを閉じる
    fp.close()
except:
    rtc.datetime((2022, 11, 13, 6, 12, 0, 0, 0))

#プログラム継続のフラグ
loopflag=True
#保存するかどうかのフラグ
saveflag=True
#プログラムを終了するためのカウンタ
counter=0

while loopflag:
    #ボタンが押されればLEDを点灯
    if btn.value()==1:
        led.high()
        counter=counter+1
        time.sleep(0.1)
    else:
        led.low()
        counter=0
    #ボタンが3秒以上おされていればプログラムを終了
    if counter>30:
        loopflag=False
    #10分ごとに温度と湿度を記録する
    if rtc.datetime()[5] == 0 or rtc.datetime()[5] == 10 or rtc.datetime()[5] == 20 or rtc.datetime()[5] == 30 or rtc.datetime()[5] == 40 or rtc.datetime()[5] == 50:
        if saveflag:
            try:
                saveTempHumd()
                print("saved")
                saveflag=False
            except:
                print("error")
                time.sleep(2)

    else:
        saveflag=True
        
for i in range(5):
    led.high()
    time.sleep(0.2)
    led.low()
    time.sleep(0.2)

 以下のRTCinitialize.txtをSDカード内に入れておいて、電源投入時に読み込んで、そこから日時のカウントを開始するようにしました。 (年, 月, 日, 曜日(0~6), 時, 分, 秒, マイクロ秒)の並びです。

(2022, 11, 13, 6, 12, 0, 0, 0)

コメント

タイトルとURLをコピーしました