Raspberry Pi PicoとMicroPythonで作る初めてのIoTガジェット!温湿度・距離センサーをOLEDに表示する入門ガイド
「マイコンで電子工作してみたいけど、何から始めればいいかわからない…」
そんな気持ちを持っているあなたに、今回はぴったりの入門プロジェクトを紹介します!🎉
Raspberry Pi PicoとMicroPythonを使って、温湿度センサー・距離センサーのデータをOLEDディスプレイにリアルタイム表示するガジェットをゼロから作ります。
「センサーって難しそう…」「OLEDって配線が複雑そう…」と思っているかもしれませんが、MicroPythonを使えばPythonに近い感覚でサクサク書けるんですよね。コードの難しさより「動いた!」という達成感を先に体験できるのが、このプロジェクトの最大の魅力です。
完成したガジェットはこんな感じです👇
- 🌡️ DHT11センサーで室温・湿度を取得
- 📏 HC-SR04超音波センサーで距離を計測
- 🖥️ SSD1306 OLEDディスプレイに数値をリアルタイム表示
- ⚡ Raspberry Pi Pico上でMicroPythonが動く完結型IoTガジェット
対象読者:電子工作初〜中級者・MicroPython入門者・Pythonは少し触ったことがある方
📦 用意するもの(部品リスト)

まず必要なパーツを確認しておきましょう。すべてAmazonや秋月電子などで手に入るものばかりです。
| 部品名 | 型番・種類 | 数量 |
|---|---|---|
| マイコンボード | Raspberry Pi Pico(または Pico W) | 1個 |
| 温湿度センサー | DHT11 | 1個 |
| 超音波距離センサー | HC-SR04(3.3V対応版推奨) | 1個 |
| OLEDディスプレイ | SSD1306(128×64、I2C接続) | 1個 |
| 抵抗 | 1kΩ・2kΩ(HC-SR04の分圧用) | 各1本 |
| ブレッドボード | 標準サイズ | 1枚 |
| ジャンパーワイヤ | オス-オス・オス-メス | 適量 |
| USBケーブル | Micro USB | 1本 |
⚠️ HC-SR04の注意点:一般的なHC-SR04はEchoピンが5V出力です。Raspberry Pi Picoは3.3VのGPIOなので、分圧回路(1kΩ+2kΩ)を使って電圧を下げる必要があります。「3.3V対応版(HC-SR04+)」を購入すると分圧不要で楽になりますよ。
🔌 配線の全体像(ピン対応表)
Raspberry Pi Picoのピン配置を確認しながら接続していきましょう。ざっくりとした流れをつかめるよう、センサーごとに整理します。
DHT11(温湿度センサー)の配線
| DHT11のピン | Pico側の接続先 |
|---|---|
| VCC(+) | 3V3(OUT)(ピン36) |
| DATA | GP15(ピン20) |
| GND(-) | GND(ピン38) |
HC-SR04(超音波センサー)の配線
| HC-SR04のピン | Pico側の接続先 |
|---|---|
| VCC | VBUS(5V、ピン40) |
| Trig | GP14(ピン19) |
| Echo | GP13(ピン17)※分圧後 |
| GND | GND |
Echoピンは「1kΩ→GP13→2kΩ→GND」という分圧回路を挟んで接続します。こうすることで5V出力が約3.3Vに下がり、Picoを安全に動かせます。
SSD1306 OLED(I2C)の配線
| OLEDのピン | Pico側の接続先 |
|---|---|
| VCC | 3V3(OUT)(ピン36) |
| GND | GND |
| SDA | GP0(ピン1、I2C0 SDA) |
| SCL | GP1(ピン2、I2C0 SCL) |
🛠️ Raspberry Pi PicoにMicroPythonを書き込む
まだMicroPythonを書き込んでいない方は、最初にセットアップをしておきましょう。
STEP 1: BOOTSELボタンを押しながらPicoをUSBで接続すると、Windowsのエクスプローラーに「RPI-RP2」というドライブが現れます。
STEP 2: Raspberry Pi公式サイトからMicroPythonの.uf2ファイルをダウンロードして、そのドライブにドラッグ&ドロップするだけ。自動的に再起動してMicroPython環境の完成です✅
STEP 3: 開発環境としてThonny IDEをおすすめします。無料で使えて、Picoとのシリアル接続・コード転送がGUIで簡単にできます。「インタープリタ」の設定でMicroPython(Raspberry Pi Pico)を選択してください。
📚 必要なライブラリをPicoに転送する
今回使うライブラリは2つです。
- dht.py:DHT11センサー用(MicroPythonに標準搭載)
- ssd1306.py:OLEDドライバ(外部ライブラリ)
ssd1306.pyはMicroPython公式のGitHubリポジトリ(micropython/micropython-lib)から入手できます。ThonnyのファイルマネージャーでPicoの「/」ディレクトリに転送しておきましょう。
💻 コードを書いてみよう!
ではいよいよ本番のコードです。まずはパーツごとに動作確認してから、最後にまとめる流れで進めます。
① DHT11で温湿度を読み取るテスト
# dht11_test.py
import dht
import machine
import time
# GP15に接続したDHT11センサーを初期化
sensor = dht.DHT11(machine.Pin(15))
while True:
sensor.measure() # センサーの計測を実行
temp = sensor.temperature() # 温度(℃)を取得
humi = sensor.humidity() # 湿度(%)を取得
print(f"温度: {temp}℃ 湿度: {humi}%")
time.sleep(2) # DHT11は最低2秒間隔で計測
ポイントをまとめるとこんな感じです👇
dht.DHT11()にPinオブジェクトを渡すだけで初期化完了measure()で計測→temperature()/humidity()で値を取得する2ステップ- DHT11は計測間隔が最低2秒必要。
time.sleep(2)は省かないこと!
② HC-SR04で距離を計測するテスト
# ultrasonic_test.py
import machine
import time
# TrigとEchoのピン設定
trig = machine.Pin(14, machine.Pin.OUT)
echo = machine.Pin(13, machine.Pin.IN)
def measure_distance():
"""超音波で距離をcm単位で返す関数"""
# Trigピンに10マイクロ秒のパルスを送信
trig.low()
time.sleep_us(2)
trig.high()
time.sleep_us(10)
trig.low()
# Echoが HIGH になるまで待機(タイムアウト付き)
timeout = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), timeout) > 30000:
return -1 # タイムアウト
start = time.ticks_us()
# Echoが LOW に戻るまで待機(タイムアウト付き)
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), start) > 30000:
return -1 # タイムアウト
end = time.ticks_us()
# 音速343m/s をもとに距離を計算(往復なので÷2)
duration = time.ticks_diff(end, start)
distance = (duration * 0.0343) / 2
return round(distance, 1)
while True:
dist = measure_distance()
if dist == -1:
print("計測タイムアウト")
else:
print(f"距離: {dist} cm")
time.sleep(0.5)
ここが重要です!
- タイムアウト処理を入れているのがポイント。センサーが外れていたり距離が遠すぎるとプログラムが止まってしまうため、30msのタイムアウトで
-1を返す設計にしています - 距離の計算式:
距離(cm) = 経過時間(μs) × 0.0343 / 2。音速と往復時間がキーワードです
③ OLEDに文字を表示するテスト
# oled_test.py
import machine
from ssd1306 import SSD1306_I2C
# I2C0(GP0=SDA、GP1=SCL)を初期化
i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)
# 128×64ピクセルのOLEDを初期化
oled = SSD1306_I2C(128, 64, i2c)
# 画面をクリアして文字を表示
oled.fill(0) # 全画面を黒でクリア
oled.text("Hello, Pico!", 0, 0) # (テキスト, x座標, y座標)
oled.text("IoT Gadget", 0, 16)
oled.text("MicroPython", 0, 32)
oled.show() # 書いた内容を画面に反映
「Hello, Pico!」がOLEDに表示されたらOKです! oled.show()を呼ばないと画面に反映されないので要注意ですよ。
④ すべてを統合した完成コード
各センサーの動作確認ができたら、いよいよ全部まとめます!
# main.py ← Picoに転送するとボード起動時に自動実行される
import dht
import machine
import time
from ssd1306 import SSD1306_I2C
# ─── 各デバイスの初期化 ───────────────────────
# DHT11センサー(GP15)
temp_sensor = dht.DHT11(machine.Pin(15))
# 超音波センサー(Trig: GP14, Echo: GP13)
trig = machine.Pin(14, machine.Pin.OUT)
echo = machine.Pin(13, machine.Pin.IN)
# OLEDディスプレイ(I2C0: SDA=GP0, SCL=GP1)
i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
# ─── 距離計測関数 ─────────────────────────────
def measure_distance():
trig.low()
time.sleep_us(2)
trig.high()
time.sleep_us(10)
trig.low()
timeout = time.ticks_us()
while echo.value() == 0:
if time.ticks_diff(time.ticks_us(), timeout) > 30000:
return -1
start = time.ticks_us()
while echo.value() == 1:
if time.ticks_diff(time.ticks_us(), start) > 30000:
return -1
end = time.ticks_us()
duration = time.ticks_diff(end, start)
return round((duration * 0.0343) / 2, 1)
# ─── OLEDに表示する関数 ──────────────────────
def update_display(temp, humi, dist):
oled.fill(0) # 画面クリア
# タイトル行
oled.text("[ IoT Sensor ]", 0, 0)
# 区切り線代わりに点線
oled.text("----------------", 0, 10)
# 温度・湿度・距離を表示
oled.text(f"Temp : {temp} C", 0, 22)
oled.text(f"Humi : {humi} %", 0, 34)
if dist == -1:
oled.text("Dist : -- cm", 0, 46)
else:
oled.text(f"Dist : {dist} cm", 0, 46)
oled.show() # 画面を更新
# ─── メインループ ─────────────────────────────
print("IoT Gadget 起動!")
while True:
try:
# 温湿度の計測
temp_sensor.measure()
temp = temp_sensor.temperature()
humi = temp_sensor.humidity()
# 距離の計測
dist = measure_distance()
# コンソールにも出力(デバッグ用)
print(f"温度:{temp}℃ 湿度:{humi}% 距離:{dist}cm")
# OLEDに表示
update_display(temp, humi, dist)
except Exception as e:
# エラーが起きてもOLEDにエラーメッセージを表示して続行
print(f"エラー: {e}")
oled.fill(0)
oled.text("Sensor Error!", 0, 28)
oled.show()
time.sleep(2) # 2秒ごとに更新
完成コードのポイントをまとめます👇
- ファイル名を
main.pyにするのがミソ。Pico上のルートに置いておくと、電源を入れるたびに自動起動します try / exceptでエラーをキャッチしているので、センサーが一時的に読めなくてもクラッシュせず動き続けますupdate_display()を関数化することで、表示ロジックをすっきり分離できています- コンソールへの
print()も残しておくと、Thonnyのシェルでデバッグしやすいです
🖥️ 動作確認のチェックリスト
コードを転送したら、以下の順番で確認しておきましょう。
- ✅ ThonnyのシェルにDHT11の温度・湿度が表示されているか
- ✅ 手を近づけると距離の数値が変わるか
- ✅ OLEDに3行のセンサー値がリアルタイムで更新されているか
- ✅ センサーを外したときに「Sensor Error!」表示になるか(安全確認)
- ✅ USBを抜いて外部電源(モバイルバッテリーなど)で動くか
もしOLEDが真っ暗なままなら、I2CのSDA/SCLの配線違いかアドレスの問題が多いです。次のスキャンコードで確認できますよ。
# i2c_scan.py ← I2Cデバイスのアドレスを確認するデバッグ用
import machine
i2c = machine.I2C(0, sda=machine.Pin(0), scl=machine.Pin(1), freq=400000)
devices = i2c.scan()
if devices:
for addr in devices:
print(f"I2Cデバイス検出: 0x{addr:02X}")
else:
print("I2Cデバイスが見つかりません。配線を確認してください")
SSD1306は通常0x3Cか0x3Dが表示されます。これが出ていれば配線OKです!
🚀 さらに発展させるアイデア
基本のガジェットが動いたら、次のアレンジに挑戦してみましょう!
- 🌐 Pico Wを使えばWi-Fi送信も可能:取得したセンサーデータをHTTPリクエストでクラウドに送ったり、簡易Webサーバーを立てて別端末から確認できます
- ⚠️ しきい値アラート:温度が30℃を超えたらOLEDにアラートを点滅表示させるなど、
if文一つで実装できます - 📈 ログ記録:測定値をCSV形式でシリアル出力してPCで記録すると、温湿度の時系列グラフが作れます
- 🔊 距離センサーで近接警告:一定距離以内に物が入ったらブザーを鳴らす「簡易セキュリティセンサー」に応用できます
まとめ
今回はRaspberry Pi PicoとMicroPythonを使って、温湿度センサー・距離センサーのデータをOLEDにリアルタイム表示するIoTガジェットを作りました。
学んだことをまとめるとこんな感じです👇
- MicroPythonでのセンサー制御は、Pythonの知識がそのまま活かせる
- DHT11は
dhtモジュール、OLEDはssd1306.pyで簡単に扱える - HC-SR04は5V→3.3Vの分圧に注意が必要
main.pyとして保存すれば電源オンで自動起動するスタンドアロンガジェットになるtry / exceptでエラー処理を入れるとガジェットが止まりにくくなる
「むずかしそう」と思っていた電子工作も、MicroPythonがあればPythonを書く感覚でどんどん作れるんですよね。まずは今回のコードをそのまま動かしてみて、少しずつアレンジしていくのが上達への近道です。
ぜひ手を動かして、自分だけのIoTガジェットを完成させてみてください!🎉
一緒に電子工作を楽しんでいきましょう。
こちらも読まれています
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





