「Arduinoでセンサーのデータは取れるようになったけど、それをクラウドに飛ばして、どこからでも確認できるようにしたい…!」
そんな風に思ったことはありませんか? 実はその一歩、MQTTというプロトコルを使うと、驚くほどシンプルに実現できるんです。今回はArduinoとMQTTを組み合わせて、スマートホームの第一歩となるIoTセンサーデータのクラウド送信を一緒に試してみましょう! 🏠✨
📌 この記事の対象読者
- Arduinoでセンサーを動かした経験がある方(初〜中級者)
- IoTやスマートホームに興味がある方
- MQTTという言葉を聞いたことはあるけど、よくわからない方
MQTTってそもそも何?

まず「MQTT」という言葉、ちょっと聞き慣れないですよね。
イメージとしては、超軽量な「伝言板」システムです。センサーが「温度は25℃だよ」と伝言を書いて(=パブリッシュ)、スマホやサーバーがその伝言板を見に来る(=サブスクライブ)。その伝言板の役割を果たすのがMQTTブローカーです。
つまり、こんな流れになります。
- Arduino(センサー側)がデータをMQTTブローカーに送信(パブリッシュ)
- MQTTブローカー(クラウド上)がデータを一時保管
- スマホや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_topicのhome/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_connectとon_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コースや電子部品もまとめています。





