概要
Raspberry Pi Pico W と温湿度センサー DHT11 を使い、気温・湿度から簡易的な暑さ指数(WBGT)を推定して、熱中症の警戒レベルを5段階(ほぼ安全/注意/警戒/厳重警戒/危険)で判定する MicroPython のコードを紹介します。判定結果は 0.96インチ OLED(SSD1306)に顔アイコンで表示しています。
Pico W で赤外線リモコンなどの工作を続ける中で、「センサーの値を取得する→計算する→表示する」の基本形として作った一例です。夏休みの自由研究の題材にもなります。
つまずいたポイント(検索で来た方向け)
作る過程で、次の3つで手が止まりました。
- DHT11 は気温と湿度しか測れず、正式な WBGT に必要な黒球温度(輻射熱)が測れない。どう近似するか。
- OLED と DHT11 が 同時に
OSError: [Errno 110] ETIMEDOUTで落ちる。 -
micropython-ssd1306の Thonny からのインストールが、Windows の日本語ユーザー名だと失敗する。
このうち、記事の核になる「WBGT の推定」と、ハマりやすい ETIMEDOUT の切り分けだけ、ここに抜き出します。
暑さ指数(WBGT)を推定するコア部分
DHT11 では黒球温度が測れないため、気温・湿度から屋内向けに簡易推定します。まず Tetens の式で水蒸気圧(hPa)を求め、屋内(日射なし)の簡易 WBGT 推定式に入れます。
def estimate_wbgt(temp, humidity):
# Tetensの式で水蒸気圧(hPa)を算出
e = (humidity / 100) * 6.1078 * 10 ** (7.5 * temp / (temp + 237.3))
# 屋内(日射なし)簡易WBGT推定式
return 0.567 * temp + 0.393 * e + 3.94
def classify_wbgt(wbgt):
if wbgt < 21:
return "ほぼ安全"
elif wbgt < 25:
return "注意"
elif wbgt < 28:
return "警戒"
elif wbgt < 31:
return "厳重警戒"
else:
return "危険"
しきい値は日本生気象学会の熱中症予防運動指針を参考にしています。これは 環境省が発表する正式な熱中症警戒アラートとは異なる簡易的な目安 です。室温26℃・湿度49%で推定 WBGT 25.2 =「警戒」となり、手計算とも一致しました。
I2Cが ETIMEDOUT になる時の切り分け
OLED と DHT11 が同時にタイムアウトする場合、両者は使うピンが別なので、個別の配線ミスより 電源(3.3V/GND)まわりの共通トラブル を疑うのが早いです。まず I2C アドレスが見えるか確認します。
from machine import Pin, I2C
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
print("I2Cデバイス検出:", i2c.scan()) # 正常なら [60] (0x3C) が出る
空リスト [] が返るときは配線不良です。自分の場合の原因は、Freenove ブレイクアウトボードと Pico 本体の挿し込みが甘い「半挿入」でした。見た目では気づきにくいので、複数デバイスが同時に落ちたらまず全体を奥まで挿し直してみてください。
完全なソースコードと配線・手順はブログにまとめています
顔アイコンを framebuf の基本図形だけで描く draw_face() の実装、DHT11・OLED の結線図とピン対応表、Thonny のセットアップ、main.py を Pico 本体に保存して PC なしで単体動作させる方法、日本語ユーザー名でのインストール失敗の対処まで、全体は以下の記事に書いています。
