プログラミング入門

Raspberry PiとPythonで作るIoT温湿度モニター【電子工作初心者向け完全ガイド】

「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)
ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です