※Claude Codeで記事の自動更新お試し中
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 中心ですが、最後に拡張アイデアを置いておきます。
使ったもの
- Raspberry Pi Pico 2 W(RP2350 / Wi-Fi 4 / BLE 5.2)(Amazonで確認)
- HiLetgo BME280 温湿度・気圧センサーモジュール(I2C / SPI 両対応)(Amazonで確認)
- ELEGOO 830 タイポイント ブレッドボード(Amazonで確認)
- WayinTop ブレッドボード用 ジャンパーワイヤキット(オス-オス / オス-メス各種)(Amazonで確認)
- USB Type-C ケーブル(データ通信対応のもの。充電専用ケーブルだと REPL に繋がらない罠あり)
母艦側のソフトウェア環境:
- 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)に合わせるとコードが短くなります。
GND → GND
GP4 (SDA) → SDA
GP5 (SCL) → SCL
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.installがnot 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 件のコメント:
コメントを投稿