「Raspberry PiでIoTって、なんか難しそう…センサーの配線とかよくわからないし…」
そんなふうに感じている方、多いんじゃないでしょうか。
でも実は、温湿度センサー+Raspberry Pi+Pythonの組み合わせは、IoT入門として最高の題材なんです。センサーは1個だけ、配線はたった3本、Pythonコードも50行以内で動きます。「むずかしそう」を「できそう」に変えていきましょう! 🎉
この記事では、部品の準備からPythonコードの実装、さらにブラウザでデータを確認するところまで、ゼロから一気に解決できるよう丁寧に解説します。
📋 この記事で作るもの・対象読者
完成イメージ:部屋に置いたRaspberry Piが室温・湿度をリアルタイムで取得し、ターミナルとWebブラウザの両方で確認できるIoT温湿度モニター
対象読者:
- ✅ Raspberry Piを持っているけど、センサーを使ったことがない方
- ✅ Pythonの基本(変数・ループ・関数)はなんとなくわかる方
- ✅ 電子工作は初めてだけど挑戦してみたい方
難易度:⭐⭐☆☆☆(初級〜中級)
🛒 必要な部品・環境
まず揃えるものを確認しておきましょう。
| 部品名 | 用途 | 目安価格 |
|---|---|---|
| Raspberry Pi 4 または 3B+ | メインコンピュータ | (お持ちのもの) |
| DHT11センサー | 温度・湿度の計測 | 約200〜300円 |
| ジャンパーワイヤ(メス-メス) | センサーとPiの接続 | 約200円〜 |
| ブレッドボード(あると便利) | 配線の整理 | 約300円〜 |
DHT11はAmazonや秋月電子で手軽に入手できます。DHT22でも同じコードがほぼそのまま使えるので、精度を重視したい方はDHT22がおすすめですよ。
🔌 STEP 1:配線をしよう
配線はたった3本です。イメージとしては「センサーに電気を送りながらデータを受け取る」だけです。
DHT11には3〜4本のピンがあります。モジュール基板タイプの場合はこの通りに接続してください。
- VCC(電源) → Raspberry PiのGPIO 1番ピン(3.3V)
- GND(グランド) → Raspberry PiのGPIO 6番ピン(GND)
- DATA(信号) → Raspberry PiのGPIO 4番ピン(BCM方式では4番)
⚠️ 配線を間違えるとセンサーが壊れることもあります。Raspberry Piの電源を切った状態で配線作業を行いましょう。
🐍 STEP 2:Pythonライブラリをインストール
Raspberry PiのターミナルでSSH接続またはデスクトップ画面を開いて、以下を実行します。
# システムパッケージを最新にしておく\nsudo apt update && sudo apt upgrade -y\n\n# Pythonパッケージ管理ツールの確認\npip3 --version\n\n# DHT11/22用ライブラリのインストール\npip3 install adafruit-circuitpython-dht\nsudo apt install libgpiod2 -y
インストールが終わったら、エラーが出ていないか確認しておきましょう。Successfully installedと表示されればOKです ✅
🌡️ STEP 3:温湿度を取得するPythonコードを書こう
まずはシンプルに、センサーの値をターミナルに表示するコードから始めます。
# dht_monitor.py\nimport adafruit_dht\nimport board\nimport time\n\n# DHT11センサーをGPIO4ピンに接続\ndht_sensor = adafruit_dht.DHT11(board.D4)\n\nprint(\"温湿度モニター起動中... Ctrl+Cで終了\")\n\nwhile True:\n try:\n # 温度と湿度を取得\n temperature = dht_sensor.temperature # 摂氏(℃)\n humidity = dht_sensor.humidity # 相対湿度(%)\n\n print(f\"🌡️ 温度: {temperature:.1f}℃ 💧 湿度: {humidity:.1f}%\")\n\n except RuntimeError as e:\n # DHT系センサーは読み取り失敗が起きやすいので無視してリトライ\n print(f\"読み取りエラー(リトライします): {e}\")\n\n time.sleep(2) # 2秒ごとに計測
ポイントをまとめるとこんな感じです:
- 📌
adafruit_dht.DHT11(board.D4)でGPIO4番ピンのセンサーを指定 - 📌
RuntimeErrorはDHTセンサー特有の読み取り失敗。catchして無視するのが定石です - 📌
time.sleep(2)で2秒間隔。DHT11は最低2秒間隔が推奨されています
実行はこちら:
python3 dht_monitor.py
ターミナルに温度と湿度が流れ始めたら成功です 🎉
🌐 STEP 4:Webブラウザで確認できるようにしよう
ターミナルだけだと少し味気ないですよね。せっかくIoTを作るなら、スマホやPCのブラウザから確認できると一気に「それっぽく」なります。
PythonのFlaskを使って、シンプルなWebサーバーを立ち上げましょう。
# web_dht_monitor.py
from flask import Flask, jsonify, render_template_string
import adafruit_dht
import board
app = Flask(__name__)
dht_sensor = adafruit_dht.DHT11(board.D4)
# シンプルなHTML(テンプレートを別ファイルにしなくてもOK)
HTML = """
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>IoT温湿度モニター</title>
<style>
body { font-family: sans-serif; text-align: center; padding: 40px; background: #f0f8ff; }
.card { background: white; border-radius: 16px; padding: 30px; display: inline-block;
box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
h1 { color: #333; }
.value { font-size: 3em; font-weight: bold; color: #2196F3; }
button { margin-top: 20px; padding: 10px 24px; font-size: 1em;
background: #2196F3; color: white; border: none; border-radius: 8px; cursor: pointer; }
</style>
</head>
<body>
<div class="card">
<h1>🌡️ 室内環境モニター</h1>
<p>温度</p><div class="value" id="temp">--</div><p>℃</p>
<p>湿度</p><div class="value" id="hum">--</div><p>%</p>
<button onclick="fetchData()">🔄 更新</button>
</div>
<script>
async function fetchData() {
const res = await fetch('/api/sensor');
const data = await res.json();
document.getElementById('temp').textContent = data.temperature ?? 'エラー';
document.getElementById('hum').textContent = data.humidity ?? 'エラー';
}
fetchData();
setInterval(fetchData, 5000); // 5秒ごとに自動更新
</script>
</body>
</html>
"""
@app.route('/')
def index():
return render_template_string(HTML)
@app.route('/api/sensor')
def sensor_api():
"""JSONでセンサーデータを返すAPI"""
try:
temp = dht_sensor.temperature
hum = dht_sensor.humidity
return jsonify({"temperature": round(temp, 1), "humidity": round(hum, 1)})
except RuntimeError as e:
return jsonify({"temperature": None, "humidity": None, "error": str(e)})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)

