ラズパイピコで、温湿度ロガーを作ってみました。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)
コメント