ブログ
ESP32 MQTT スマートホーム:30分でセンサーデータをクラウドへ
問題
ESP32 で気象ステーションを作ったとしましょう。温度と湿度はシリアルモニターに完璧に表示されます。でも、ここが問題です — そのデータはノートPCの中に閉じ込められています。スマホで確認できない。ログにも残せない。自動化もトリガーできません。
MQTT がこれを解決します。 世界の大半の IoT システム — スマートファクトリーから Home Assistant まで — を支えている通信プロトコルです。
作るもの
次のことができる ESP32 センサーノード:
- 30秒ごとに温度と湿度を読み取る
- 無料のクラウド MQTT ブローカーにデータを公開(パブリッシュ)する
- どこからでも、あらゆる Web ブラウザで監視できる
難易度: 初心者 | 所要時間: 30分 | 費用: 部品代 約$23
必要なハードウェア(部品リスト)
| 部品 | 型番 | 数量 | 価格 | 購入 |
|---|---|---|---|---|
| マイコントローラー | ESP32 DevKitC V4 | 1 | $13.49 | 製品を見る |
| 温湿度センサー | DHT22 | 1 | $5.24 | 製品を見る |
| ディスプレイ(任意) | 0.96″ OLED SSD1306 | 1 | $5.99 | 製品を見る |
| ブレッドボード | 830点 | 1 | $4.49 | 製品を見る |
| ジャンパーワイヤー | M-M 40本 | 1 | $2.99 | 製品を見る |
ステップ1:配線
ESP32 ↔ DHT22
| DHT22 ピン | ESP32 ピン | 備考 |
|---|---|---|
| VCC | 3V3 | 電源 |
| GND | GND | 接地 |
| DATA | GPIO 13 | データ線 |
ESP32 ↔ OLED(任意)
| OLED ピン | ESP32 ピン | 備考 |
|---|---|---|
| VCC | 3V3 | 電源 |
| GND | GND | 接地 |
| SDA | GPIO 21 | I2C データ |
| SCL | GPIO 22 | I2C クロック |
ステップ2:ライブラリのインストール
Arduino IDE を開いて スケッチ → ライブラリをインクルード → ライブラリを管理 を選択し、次をインストールします:
- PubSubClient by Nick O’Leary(MQTT 通信用)
- DHT sensor library by Adafruit(DHT22 ドライバー)
- Adafruit SSD1306(OLED ディスプレイ用。使う場合)
ステップ3:コードをアップロード
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// --- WiFi Settings ---
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// --- MQTT Settings ---
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* temp_topic = "sensbench/home/temperature";
const char* hum_topic = "sensbench/home/humidity";
// --- Sensor Settings ---
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Globals ---
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("nWiFi connected! IP: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
String clientId = "sensbench-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected!");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5s");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor read failed!");
return;
}
char tempStr[8], humStr[8];
dtostrf(t, 4, 2, tempStr);
dtostrf(h, 4, 2, humStr);
client.publish(temp_topic, tempStr);
client.publish(hum_topic, humStr);
Serial.printf("Temp: %s°C Humidity: %s%%n", tempStr, humStr);
delay(30000);
}
ステップ4:クラウドでデータを確認
- ブラウザで https://www.hivemq.com/mqtt-web-client/ を開く
- Connect をクリック
- Subscriptions の下でトピック
sensbench/home/#を追加 - ESP32 が30秒ごとにリアルタイムデータを送るのを見守る
次のステップ
データがクラウドに乗ったら、次のことができます:
- ダッシュボードを作る — Node-RED や Home Assistant でデータを可視化
- センサーを増やす — 気圧用 BME280、植物用の土壌水分センサーなど
- 自動化をトリガーする — 「温度 > 30°C ならファンを回す」のように
- バッテリー駆動にする — ディープスリープモードで数ヶ月の運用も可能