IoT・電子工作

ArduinoとMQTTでスマートホームを自作!IoTセンサーデータをクラウドに送る方法

「Arduinoでセンサーのデータは取れるようになったけど、それをクラウドに飛ばして、どこからでも確認できるようにしたい…!」

そんな風に思ったことはありませんか? 実はその一歩、MQTTというプロトコルを使うと、驚くほどシンプルに実現できるんです。今回はArduinoとMQTTを組み合わせて、スマートホームの第一歩となるIoTセンサーデータのクラウド送信を一緒に試してみましょう! 🏠✨

📌 この記事の対象読者

  • Arduinoでセンサーを動かした経験がある方(初〜中級者)
  • IoTやスマートホームに興味がある方
  • MQTTという言葉を聞いたことはあるけど、よくわからない方

MQTTってそもそも何?

smart home IoT
smart home IoT / Photo by Jakub Zerdzicki via Pexels

まず「MQTT」という言葉、ちょっと聞き慣れないですよね。

イメージとしては、超軽量な「伝言板」システムです。センサーが「温度は25℃だよ」と伝言を書いて(=パブリッシュ)、スマホやサーバーがその伝言板を見に来る(=サブスクライブ)。その伝言板の役割を果たすのがMQTTブローカーです。

つまり、こんな流れになります。

  1. Arduino(センサー側)がデータをMQTTブローカーに送信(パブリッシュ)
  2. MQTTブローカー(クラウド上)がデータを一時保管
  3. スマホやPCがブローカーからデータを受信(サブスクライブ)

HTTP通信と違って常時接続・低消費電力・軽量なのがMQTTの強み。IoTデバイスとの相性が抜群なんです 💡

今回使う環境・部品の確認をしておきましょう

📦 ハードウェア

  • Arduino(ESP32 または ESP8266 推奨 ※Wi-Fi内蔵モデル)
  • 温湿度センサー(DHT11 または DHT22)
  • ブレッドボード・ジャンパーワイヤー

💻 ソフトウェア・サービス

  • Arduino IDE(2.x系)
  • MQTTブローカー:HiveMQ Cloud(無料プランあり)または Mosquitto(ローカル)
  • ライブラリ:PubSubClient(MQTT用)、DHT sensor library

今回は手軽に始めるためにHiveMQ Cloudの無料ブローカーを使います。アカウントを作成してホスト名・ポート・ユーザー名・パスワードをメモしておきましょう。

ライブラリのインストール

Arduino IDEのライブラリマネージャーから以下の2つをインストールします。

  • PubSubClient(by Nick O’Leary)
  • DHT sensor library(by Adafruit)

メニューから「ツール → ライブラリを管理」を開いて、それぞれ検索してインストールするだけです。簡単ですよね 😊

センサーデータをMQTTで送信するコード

では早速コードを書いていきましょう!ポイントをまとめるとこんな感じです。

  • Wi-Fiに接続してからMQTTブローカーに接続する
  • DHT11センサーで温湿度を読み取る
  • 読み取ったデータをJSON形式でパブリッシュ(送信)する
  • 5秒ごとにデータを送り続ける

#include <WiFi.h>          // ESP32のWi-Fiライブラリ
#include <PubSubClient.h>  // MQTTライブラリ
#include <DHT.h>           // 温湿度センサーライブラリ

// ===== Wi-Fi設定 =====
const char* ssid     = "YOUR_WIFI_SSID";      // あなたのWi-Fi名
const char* password = "YOUR_WIFI_PASSWORD";  // Wi-Fiパスワード

// ===== MQTTブローカー設定(HiveMQ Cloud)=====
const char* mqtt_server   = "YOUR_HIVEMQ_HOST"; // ブローカーのホスト名
const int   mqtt_port     = 8883;               // TLSポート
const char* mqtt_user     = "YOUR_USERNAME";
const char* mqtt_password = "YOUR_PASSWORD";
const char* mqtt_topic    = "home/sensor/temp"; // データを送るトピック名

// ===== DHT センサー設定 =====
#define DHTPIN  4      // センサーを接続したGPIOピン番号
#define DHTTYPE DHT11  // DHT11を使用

DHT dht(DHTPIN, DHTTYPE);
WiFiClient   wifiClient;
PubSubClient mqttClient(wifiClient);

void setup() {
  Serial.begin(115200);
  dht.begin();

  // Wi-Fiに接続する
  Serial.print("Wi-Fiに接続中...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" 接続完了!");

  // MQTTブローカーの設定
  mqttClient.setServer(mqtt_server, mqtt_port);
}

void reconnect() {
  // ブローカーに接続されていない場合は再接続を試みる
  while (!mqttClient.connected()) {
    Serial.print("MQTTブローカーに接続中...");
    if (mqttClient.connect("ArduinoClient", mqtt_user, mqtt_password)) {
      Serial.println(" 接続完了!");
    } else {
      Serial.print(" 失敗(エラーコード: ");
      Serial.print(mqttClient.state());
      Serial.println(")5秒後に再試行します");
      delay(5000);
    }
  }
}

void loop() {
  if (!mqttClient.connected()) {
    reconnect(); // 切断されていたら再接続
  }
  mqttClient.loop(); // MQTTの内部処理を維持

  // DHT11からデータを読み取る
  float humidity    = dht.readHumidity();
  float temperature = dht.readTemperature();

  // センサー読み取りエラーチェック
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("センサーの読み取りに失敗しました");
    return;
  }

  // JSON形式でデータを組み立てる
  String payload = "{\"temperature\": " + String(temperature) +
                   ", \"humidity\": " + String(humidity) + "}";

  // MQTTブローカーにデータをパブリッシュ(送信)
  mqttClient.publish(mqtt_topic, payload.c_str());

  Serial.println("送信データ: " + payload);

  delay(5000); // 5秒ごとに送信
}

ここが重要です ⚡

  • mqtt_topichome/sensor/tempはトピック名です。スラッシュで階層を表現できるので、home/livingroom/tempのように場所ごとに分けると管理しやすくなります
  • reconnect()関数で接続が切れても自動で復旧するようにしています
  • データはJSON形式で送っています。後でダッシュボードで扱いやすくなりますよ 😄

受信側:Pythonでデータをサブスクライブしてみよう


ArduinoからMQTTにデータを送れたら、今度はそれを受け取る側も作ってみましょう。PCでPythonを使ってリアルタイムにデータを受信できます。

まずpaho-mqttライブラリをインストールします。


pip install paho-mqtt

そしてこちらがサブスクライブ(受信)するPythonコードです。


import paho.mqtt.client as mqtt
import json

# ===== MQTTブローカー設定 =====
BROKER   = "YOUR_HIVEMQ_HOST"
PORT     = 8883
USERNAME = "YOUR_USERNAME"
PASSWORD = "YOUR_PASSWORD"
TOPIC    = "home/sensor/temp"  # Arduinoと同じトピック名を指定

def on_connect(client, userdata, flags, rc):
    """ブローカーに接続したときに呼ばれる"""
    if rc == 0:
        print("✅ MQTTブローカーに接続しました")
        client.subscribe(TOPIC)  # トピックを購読(サブスクライブ)開始
    else:
        print(f"❌ 接続失敗(コード: {rc})")

def on_message(client, userdata, msg):
    """メッセージを受信したときに呼ばれる"""
    payload = msg.payload.decode("utf-8")
    data    = json.loads(payload)  # JSON文字列をPythonの辞書に変換

    temperature = data["temperature"]
    humidity    = data["humidity"]

    print(f"🌡️  温度: {temperature}℃  💧 湿度: {humidity}%")

# MQTTクライアントの設定
client = mqtt.Client()
client.username_pw_set(USERNAME, PASSWORD)  # 認証情報をセット
client.tls_set()                            # TLS暗号化を有効化
client.on_connect = on_connect
client.on_message = on_message

client.connect(BROKER, PORT, 60)
client.loop_forever()  # メッセージを受け取り続ける(Ctrl+Cで終了)

ポイントをまとめるとこんな感じです。

  • on_connecton_messageはコールバック関数です。イベントが起きたときに自動で呼ばれます
  • client.loop_forever()でずっとメッセージを待ち続けます
  • 受信したJSONデータはjson.loads()で辞書に変換して扱いやすくしています

このPythonスクリプトを実行した状態で、Arduinoをリセットしてみてください。5秒ごとに温湿度データがターミナルに表示されるはずです 🎉

さらに発展させるアイデア


ここまでできたら、スマートホームの土台はバッチリです!次のステップとして、こんなことが試せます。

  • 📊 Node-REDやGrafanaと連携してデータをグラフで可視化する
  • 💾 InfluxDBなどの時系列データベースに保存して履歴を管理する
  • 🔔 温度が一定以上になったらLINE通知を送る
  • 💡 MQTTでコマンドを送って照明やエアコンを制御する
  • 📱 Home Assistantと組み合わせてスマートホームダッシュボードを作る

「むずかしそう」が「できそう」に変わってきたんじゃないでしょうか 😊

まとめ

今回はArduino(ESP32)とMQTTを使って、温湿度センサーのデータをクラウドに送信し、Pythonで受信するところまで解説しました。

🔑 今回のポイント

  • MQTTは「伝言板」方式の軽量通信プロトコルで、IoTと相性抜群
  • ArduinoはPubSubClientライブラリでMQTTブローカーにデータを送れる
  • PythonのPaho-MQTTでリアルタイムにデータを受信できる
  • トピック名を工夫すれば複数センサーの管理も簡単

スマートホームって聞くと大がかりに聞こえますが、こうして一つひとつ積み上げていくと「あれ、意外と作れるじゃん!」と感じてもらえると思います。ぜひ手元のArduinoで試してみてください!

次回はMQTTで受信したデータをGrafanaでリアルタイム可視化する方法を紹介する予定です。お楽しみに 👋

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

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

COMMENT

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