IoT

Raspberry Pi + PythonでIoTダッシュボードを自作|DHT11温湿度センサーで自宅をリアルタイム監視

Raspberry Pi(ラズパイ)とPythonを使ってIoTダッシュボードを自作し、DHT11温湿度センサーのデータを自宅でリアルタイム監視する方法を、電子工作初心者の方にも分かりやすく徹底解説します。

「自宅の温湿度をスマートに管理したい」「IoT電子工作を始めてみたいけど何から手をつければいい?」——そんな疑問をお持ちの方にぴったりの内容です。この記事を最後まで読めば、ブラウザ上でリアルタイムに温湿度が確認できる簡易Webダッシュボードが完成します。

使うセンサーは電子工作初心者にも大人気のDHT11。コストも安く配線もシンプルなので、「ラズパイ × IoT」の入門プロジェクトとして最適です。それではさっそくいってみましょう!

この記事で作るもの・完成イメージ

今回作成するIoTダッシュボードの完成形は以下の通りです。

  • DHT11センサーから2秒ごとに温度・湿度データを取得
  • PythonのWebフレームワーク「Flask」でローカルWebサーバーを構築
  • 同一Wi-Fiネットワーク内のブラウザ(PC・スマホ)からリアルタイムで温湿度を確認
  • JavaScriptの自動更新機能で、ページ再読み込み不要のダッシュボードを実現

必要な材料・環境一覧

まずは準備するものをまとめておきます。

  • Raspberry Pi(3B+ / 4 どちらでもOK)
  • DHT11 温湿度センサー
  • ジャンパーワイヤー(オス→メス)× 3本
  • ブレッドボード(あると便利)
  • 10kΩ抵抗 × 1個
  • Raspberry Pi OS(最新版)がインストール済みであること

DHT11はAmazonや秋月電子で数百円から手に入るので、コスパは抜群です。ラズパイ本体は中古や公式代理店で入手可能です。

DHT11センサーのRaspberry Piへの配線方法

DHT11をRaspberry Piへ接続する配線はとてもシンプルです。DHT11のピン配置(正面から見て左から)は以下の通りです。

  • 1番ピン(VCC):ラズパイの3.3V(物理1番ピン)へ
  • 2番ピン(DATA):ラズパイのGPIO4(物理7番ピン)へ / ※VCCとの間に10kΩのプルアップ抵抗を挟む
  • 4番ピン(GND):ラズパイのGND(物理6番ピン)へ

⚠️ プルアップ抵抗(10kΩ)を忘れると正しく値が読めないことがあるので注意してください!DATAピンとVCCピンの間に抵抗を1本入れるだけでOKです。

配線時のよくあるミスと対処法

  • センサーの向きを逆に挿してしまう:DHT11正面(格子状の面)を手前にして確認しましょう
  • プルアップ抵抗を忘れる:データが読めなかったり不安定になります
  • GPIOピン番号と物理ピン番号の混同:コード上は「GPIO番号(4)」、配線は「物理ピン番号(7番)」を使うよう意識してください

PythonライブラリをRaspberry Piにインストールする

DHT11センサーをPythonで扱うために、Adafruit_DHTライブラリを使います。ターミナルで以下のコマンドを順番に実行してください。

sudo apt update
sudo apt install python3-pip -y
pip3 install Adafruit_DHT
pip3 install flask

Flaskもこのタイミングでまとめてインストールしておくとスムーズです。インストールが完了したら、さっそくセンサーのテストコードを書いていきましょう。

STEP1:DHT11から温湿度データを取得するPythonコード

まずは基本中の基本、DHT11センサーから温度と湿度を読み取るシンプルなPythonスクリプトです。下記コードを dht11_test.py として保存して実行してみてください。

import Adafruit_DHT
import time

# センサーの種類とGPIOピン番号を指定
SENSOR = Adafruit_DHT.DHT11
GPIO_PIN = 4

while True:
    humidity, temperature = Adafruit_DHT.read_retry(SENSOR, GPIO_PIN)

    if humidity is not None and temperature is not None:
        print(f"温度: {temperature:.1f}°C  湿度: {humidity:.1f}%")
    else:
        print("センサーからデータを取得できませんでした")

    time.sleep(2)  # 2秒ごとに取得

実行コマンドは以下です。

python3 dht11_test.py

実行すると、2秒ごとにターミナルへ温度と湿度が表示されます。まずはこれで正しく動くか確認してから、次のステップに進んでください。「センサーからデータを取得できませんでした」が連続して出る場合は配線を見直しましょう。

STEP2:FlaskでIoT温湿度ダッシュボードのWebアプリを作る

センサーの値が正常に取れたら、いよいよブラウザでリアルタイム確認できるIoTダッシュボードを作りましょう!PythonのWebフレームワーク「Flask」を使って、シンプルなWebアプリを構築します。

以下のコードを dashboard.py という名前で保存してください。

from flask import Flask, jsonify, render_template_string
import Adafruit_DHT

app = Flask(__name__)

SENSOR = Adafruit_DHT.DHT11
GPIO_PIN = 4

# HTMLテンプレート(シンプルなダッシュボード)
HTML_TEMPLATE = """

<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>IoT 温湿度ダッシュボード | Raspberry Pi</title>
  <style>
    body {
      font-family: 'Segoe UI', sans-serif;
      background: #1a1a2e;
      color: #eee;
      text-align: center;
      padding: 50px;
      margin: 0;
    }
    h1 { font-size: 1.8rem; margin-bottom: 10px; color: #a0c4ff; }
    .subtitle { color: #888; margin-bottom: 40px; font-size: 0.9rem; }
    .dashboard { display: flex; justify-content: center; flex-wrap: wrap; gap: 20px; }
    .card {
      background: #16213e;
      border-radius: 16px;
      padding: 40px;
      min-width: 200px;
      box-shadow: 0 4px 20px rgba(0,0,0,0.4);
    }
    .card .label { font-size: 0.9rem; color: #888; margin-bottom: 12px; }
    .card .value { font-size: 3rem; font-weight: bold; }
    .temp .value { color: #ff6b6b; }
    .humi .value { color: #74b9ff; }
    .unit { font-size: 1.2rem; margin-left: 4px; }
    .updated { margin-top: 30px; font-size: 0.8rem; color: #555; }
  </style>
</head>
<body>
  <h1>🌡️ IoT 温湿度ダッシュボード</h1>
  <p class="subtitle">Raspberry Pi + DHT11 | 自動更新: 3秒ごと</p>
  <div class="dashboard">
    <div class="card temp">
      <div class="label">🌡 温度</div>
      <div class="value" id="temp">--<span class="unit">°C</span></div>
    </div>
    <div class="card humi">
      <div class="label">💧 湿度</div>
      <div class="value" id="humi">--<span class="unit">%</span></div>
    </div>
  </div>
  <p class="updated" id="updated">最終更新: --</p>

  <script>
    async function fetchData() {
      try {
        const res = await fetch('/api/sensor');
        const data = await res.json();
        document.getElementById('temp').innerHTML =
          data.temperature + '<span class="unit">°C</span>';
        document.getElementById('humi').innerHTML =
          data.humidity + '<span class="unit">%</span>';
        document.getElementById('updated').textContent =
          '最終更新: ' + new Date().toLocaleTimeString('ja-JP');
      } catch (e) {
        console.error('データ取得エラー:', e);
      }
    }
    fetchData();
    setInterval(fetchData, 3000);  // 3秒ごとに自動更新
  </script>
</body>
</html>
"""

@app.route('/')
def index():
    return render_template_string(HTML_TEMPLATE)

@app.route('/api/sensor')
def sensor_data():
    humidity, temperature = Adafruit_DHT.read_retry(SENSOR, GPIO_PIN)
    if humidity is not None and temperature is not None:
        return jsonify({
            'temperature': round(temperature, 1),
            'humidity': round(humidity, 1)
        })
    else:
        return jsonify({'error': 'センサーデータを取得できませんでした'}), 500

if __name__ == '__main__':
    # host='0.0.0.0' で同一ネットワークの端末からもアクセス可能
    app.run(host='0.0.0.0', port=5000, debug=False)

ダッシュボードの起動方法とブラウザでのアクセス手順

以下のコマンドでFlaskサーバーを起動します。

python3 dashboard.py

起動後、同じWi-Fiに接続されたPCやスマホのブラウザで以下のURLにアクセスしてください。

  • ラズパイ本体からアクセスする場合:http://localhost:5000
  • 同一ネットワークの別端末からアクセスする場合:http://(ラズパイのIPアドレス):5000

ラズパイのIPアドレスは hostname -I コマンドで確認できます。温度・湿度のカードが表示され、3秒ごとに値が自動更新されれば成功です!🎉

STEP3:Raspberry Pi起動時にダッシュボードを自動起動させる設定

毎回手動で起動するのは手間がかかります。Raspberry Pi起動時にFlaskダッシュボードが自動起動するよう、systemdでサービス登録しておきましょう。

まず、サービス定義ファイルを作成します。

sudo nano /etc/systemd/system/iot-dashboard.service

以下の内容を貼り付けてください(pi部分は実際のユーザー名・パスに合わせて変更)。

[Unit]
Description=IoT Temperature Humidity Dashboard
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/dashboard.py
WorkingDirectory=/home/pi
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

保存後、以下のコマンドでサービスを有効化します。

sudo systemctl daemon-reload
sudo systemctl enable iot-dashboard
sudo systemctl start iot-dashboard
# 動作確認
sudo systemctl status iot-dashboard

これで電源を入れるだけで自動的にダッシュボードが起動するようになります。

トラブルシューティング:よくあるエラーと対処法

「RuntimeError: Timed out waiting for PulseIn」が出る場合

配線の接触不良かプルアップ抵抗の付け忘れが原因のことがほとんどです。以下を確認してください。

  • ブレッドボードの接触を確認し、ジャンパーワイヤーを差し直す
  • 10kΩ抵抗がVCCとDATAピンの間に正しく入っているか確認
  • GPIO番号の指定が正しいか確認(GPIO4 = 物理7番ピン)

「ModuleNotFoundError: No module named ‘Adafruit_DHT’」が出る場合

sudoで実行する際にパスが異なる場合があります。以下のように絶対パスで指定するか、仮想環境(venv)の利用を検討してください。

# pip3のインストール先を確認
which pip3
# sudoの場合はsudo pip3でインストール
sudo pip3 install Adafruit_DHT flask

発展アイデア:このIoTダッシュボードをさらに進化させるには

今回作ったRaspberry Pi + DHT11のIoTダッシュボードは、あくまでスタート地点です。次のステップとして以下のような発展が考えられます。

  • 📊 データをCSVやSQLiteに記録して、温湿度の時系列グラフを表示する
  • 📱 LINE NotifyやSlackで閾値超えを通知する(例:湿度70%超でアラート)
  • 🌐 ngrokやCloudflare Tunnelを使って外出先からもアクセスできるようにする
  • 🌡️ DHT22センサーに変更して、より高精度な温湿度測定を行う
  • 🏠 複数センサーを設置してリビング・寝室など部屋ごとの温湿度を一元管理する

これらの発展テーマについても、当ブログでは順次解説記事を公開予定です。関連する記事もぜひ参考にしてみてください。

まとめ:Raspberry Pi + DHT11でIoTダッシュボードを自作しよう

今回はRaspberry PiとPythonを使ってDHT11温湿度センサーのデータをブラウザでリアルタイム監視できるIoTダッシュボードを作る方法を解説しました。改めて手順を振り返りましょう。

  1. DHT11センサーをRaspberry Piに配線(プルアップ抵抗を忘れずに)
  2. Adafruit_DHTライブラリをインストールしてセンサー動作確認
  3. FlaskでWebダッシュボードを構築し、ブラウザからリアルタイムアクセス
  4. systemdでRaspberry Pi起動時に自動起動するよう設定

数百円のセンサー1つとRaspberry Piがあれば、これだけ実用的なIoTシステムが作れてしまうのが電子工作の醍醐味です。ぜひ今回のプロジェクトを起点に、自分だけのスマートホーム環境づくりに挑戦してみてください!

記事の内容で分からない点や、うまく動かないケースがあればコメント欄でお気軽にご質問ください😊

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

COMMENT

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