CopyButton

2026年4月29日水曜日

Raspberry Pi Pico 2 W + MicroPython で温湿度センサーを自作する【2026年版・Home Assistant に MQTT 送信】

※Claude Codeで記事の自動更新お試し中

Raspberry Pi Pico 2 W の水彩イラスト(緑色 PCB と castellated pin、無線モジュール、micro USB)

Raspberry Pi Pico 2 W が出てから「結局 ESP32 と何が違うんだ?」と聞かれることが増えました。RP2350 のデュアルコア Cortex-M33 + Wi-Fi/BLE が載った Pico 2 W で、温湿度センサー BME280 の値を Home Assistant に MQTT で送信し、Auto Discovery で勝手にセンサーが出てくるところまでを最短で通します。半田付け不要、ブレッドボードのみ。電子工作初学者でも 1〜2 時間で動きます。

この記事でできること

  • Raspberry Pi Pico 2 W に MicroPython を入れて Wi-Fi に繋げられる
  • BME280 で温度・湿度・気圧を I2C 経由で読める
  • Home Assistant に MQTT Discovery でセンサーが自動登録される(YAML 不要)
  • 必要なものは合計 2,500〜3,500円から
  • Pico W で詰まりがちな umqtt.simple のインストール方法と、無通信で切断される問題への対処がわかる

なぜ Pico 2 W なのか

ESP32 系で同じことができるのは事実ですが、Pico 2 W には MicroPython 公式サポートが手厚い・Thonny で REPL に即繋がる・RP2350 のデュアルコアで片方を BLE 受信に回せるといった違いがあります。Wi-Fi 4 + BLE 5.2 が両方乗っているので、後から「BLE で SwitchBot 温湿度計のデータも吸う」みたいな拡張がそのままできます。今回は MQTT 中心ですが、最後に拡張アイデアを置いておきます。

使ったもの

母艦側のソフトウェア環境:

  • MicroPython v1.24 以降(Pico 2 W 公式 UF2)
  • Thonny(REPL/ファイル転送/mip パッケージ管理を全部こなす)
  • Home Assistant(HAOS / Container どちらでも可)
  • Mosquitto(Home Assistant の Mosquitto broker アドオンが楽)

配線

BME280 は I2C で繋ぎます。Pico 2 W の I2C0 デフォルト(GP4=SDA / GP5=SCL)に合わせるとコードが短くなります。

Raspberry Pi Pico 2 W
3V3(OUT) → VIN
GND → GND
GP4 (SDA) → SDA
GP5 (SCL) → SCL
BME280 (I2C)

BME280 モジュールに 3.3V レギュレータが載っていれば 5V でも動きますが、ノイズと自己発熱(温度がやや高めに出る)を抑えるために 3V3(OUT) で給電するのを勧めます。

手順

1. MicroPython を Pico 2 W に書き込む

Pico 2 W の BOOTSEL ボタンを押しながら USB を挿すとマスストレージとして認識されます。ここに RP2350 用の最新 UF2 をドラッグ&ドロップ。

# raspberrypi.com/documentation/microcontrollers/micropython.html
# 「Raspberry Pi Pico 2 W」用 .uf2 を落として RPI-RP2 ドライブにコピー
# 自動で再起動して MicroPython が起動する

2. Thonny から umqtt.simple を入れる

古い記事だと upip でインストールしろと書いてありますが、2026 年現在は upip は廃止。代わりに mip を使います。Thonny のシェル(MicroPython 側)で:

>>> import mip
>>> mip.install("umqtt.simple")
>>> mip.install("umqtt.robust")  # 切断時の自動再接続用

Pico 2 W が Wi-Fi 接続前だと当然失敗するので、先にネットに繋ぐか、それが面倒なら PC で simple.py を落として Thonny でアップロードしても OK。

3. BME280 ドライバを入れる

MicroPython 用 BME280 ドライバはいくつかありますが、robert-hh/BME280 が安定。bme280_float.py を Thonny のファイルブラウザ経由で Pico に転送します。

4. main.py を書く

Wi-Fi 接続 → BME280 から読む → Home Assistant に Discovery 設定を一度送る → 60秒おきに値を publish、という最小構成にします。SECRETS は別ファイルに切り出すと git 管理しやすいですが、まずはベタ書きで動かします。

import network, time, ujson, machine
from umqtt.robust import MQTTClient
import bme280_float as bme280

WIFI_SSID = "YourSSID"
WIFI_PASS = "YourPass"
MQTT_HOST = "192.168.1.10"   # Home Assistant の IP
MQTT_USER = "pico"
MQTT_PASS = "picopass"
DEVICE_ID = "pico2w_livingroom"

# --- Wi-Fi ---
wlan = network.WLAN(network.STA_IF); wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
for _ in range(20):
    if wlan.isconnected(): break
    time.sleep(0.5)
print("ip:", wlan.ifconfig()[0])

# --- I2C / BME280 ---
i2c = machine.I2C(0, sda=machine.Pin(4), scl=machine.Pin(5), freq=100_000)
sensor = bme280.BME280(i2c=i2c)

# --- MQTT ---
c = MQTTClient(DEVICE_ID, MQTT_HOST, user=MQTT_USER, password=MQTT_PASS,
               keepalive=60)   # ←無通信切断対策
c.connect()

# --- HA Auto Discovery (一度だけ retain で送る) ---
def disc(component, name, key, unit, dev_class):
    topic = "homeassistant/sensor/{}/{}/config".format(DEVICE_ID, key)
    payload = {
        "name": name,
        "state_topic": "ontheh/{}/state".format(DEVICE_ID),
        "unit_of_measurement": unit,
        "value_template": "{{{{ value_json.{} }}}}".format(key),
        "unique_id": "{}_{}".format(DEVICE_ID, key),
        "device_class": dev_class,
        "device": {"identifiers":[DEVICE_ID], "name":"Pico 2W Livingroom",
                   "manufacturer":"Raspberry Pi", "model":"Pico 2 W"},
    }
    c.publish(topic, ujson.dumps(payload), retain=True)

disc("sensor", "リビング温度", "temp", "°C", "temperature")
disc("sensor", "リビング湿度", "hum",  "%",  "humidity")
disc("sensor", "リビング気圧", "pres", "hPa","pressure")

# --- メインループ ---
while True:
    t, p, h = sensor.read_compensated_data()
    payload = ujson.dumps({
        "temp": round(t, 2),
        "hum":  round(h, 2),
        "pres": round(p / 100, 2),    # Pa → hPa
    })
    c.publish("ontheh/{}/state".format(DEVICE_ID), payload)
    print(payload)
    time.sleep(60)

5. Home Assistant 側で確認

Mosquitto broker アドオンを起動してユーザーを作っておけば、main.py を実行した瞬間に Settings → Devices & services → MQTT に「Pico 2W Livingroom」がデバイスとして自動登録されます。YAML 編集も再起動も不要。

# MQTT を覗きたいときは Mosquitto アドオン経由でも OK
$ mosquitto_sub -h 127.0.0.1 -u pico -P picopass -t 'ontheh/#' -v
ontheh/pico2w_livingroom/state {"temp": 24.31, "hum": 53.78, "pres": 1011.42}

詰まりポイント

  • USB を繋いでも認識されない → 充電専用ケーブルあるある。データ線が結線されたケーブルに変える。
  • mip.installnot found → Wi-Fi 未接続。network.WLAN で接続してから実行する。
  • I2C デバイスが i2c.scan() に出てこない → BME280 のアドレスは 0x76 または 0x77。SDO の処理で変わる。bme280.BME280(i2c=i2c, address=0x77) を試す。
  • 数時間後に publish が止まる → ブローカーから keepalive で切られている。MQTTClient(..., keepalive=60) + umqtt.robust で自動再接続させるのが鉄板。
  • 温度が +2℃ ぐらい高めに出る → BME280 の自己発熱。長辺を立てる、5V→3V3 給電に変える、それでもズレるなら value_template でオフセット補正。
  • HA に出ない → Discovery トピックは必ず retain=True で送る。送り損ねた場合は HA を再起動するか、空ペイロード "" を送って消してから再送する。

ハック拡張アイデア

  • BLE モードを使って SwitchBot 温湿度計ハック: Pico 2 W の BLE 5.2 で SwitchBot のアドバタイズを直接受け、HA Bridge を経由せずに温湿度を吸い出す。OpenWonderLabs の公開仕様を読めば実装できます。
  • 0.96 インチ HiLetgo OLED ディスプレイ(SSD1306 / I2C 128×64)(Amazonで確認)を Pico の I2C1 (GP14/GP15) に追加して、温湿度をローカル表示する。BME280 と I2C アドレスを分けて同じバスに乗せても可。
  • RP2350 のもう一方のコアに _thread でリングバッファを置く: 片方のコアが I2C 読み出し、もう片方が MQTT 送信、を完全分離すると Wi-Fi 切断中もサンプリングが止まらない。Pico 1 ではここまでしんどかったのが楽になります。
  • HA の自動化と連動: 「湿度 60% を超えたら除湿器の SwitchBot プラグを ON」みたいな自動化が、Discovery で自動登録されたエンティティ名を参照するだけで書ける。

消費電力メモ

Pico 2 W を 5V USB 給電・60 秒 publish ループで放置すると、平均 70mA 前後(Wi-Fi 維持のため)。machine.deepsleep() でセンサー読み出しの瞬間だけ起こす運用にすると 10〜15mA まで下がりますが、Wi-Fi 再接続に毎回 3〜5 秒かかるので、1 分間隔のホームセンサーなら常時接続のままで実用です。

※本記事の手順・コードは執筆時点(2026 年 4 月)で動作確認していますが、ライブラリやハードのバージョンが変わるとそのままでは動かない場合があります。動かない場合は コメント欄でお知らせください。

まとめ

Raspberry Pi Pico 2 W + BME280 + MQTT Discovery で、半田付けなしの温湿度モニタを Home Assistant に組み込みました。umqtt.simple のインストール方法と keepalive を押さえれば、あとは公式チュートリアル系の罠もそんなにありません。同じ仕組みを増やしてリビング・寝室・玄関に置けば、家全体の温湿度マップが完成します。

この記事が役に立ったら X(Twitter)でシェアしてもらえると喜びます。

参考

0 件のコメント:

コメントを投稿