Uncategorized

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 を開いて スケッチ → ライブラリをインクルード → ライブラリを管理 を選択し、次をインストールします:

  1. PubSubClient by Nick O’Leary(MQTT 通信用)
  2. DHT sensor library by Adafruit(DHT22 ドライバー)
  3. 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:クラウドでデータを確認

  1. ブラウザで https://www.hivemq.com/mqtt-web-client/ を開く
  2. Connect をクリック
  3. Subscriptions の下でトピック sensbench/home/# を追加
  4. ESP32 が30秒ごとにリアルタイムデータを送るのを見守る

次のステップ

データがクラウドに乗ったら、次のことができます:

  • ダッシュボードを作る — Node-RED や Home Assistant でデータを可視化
  • センサーを増やす — 気圧用 BME280、植物用の土壌水分センサーなど
  • 自動化をトリガーする — 「温度 > 30°C ならファンを回す」のように
  • バッテリー駆動にする — ディープスリープモードで数ヶ月の運用も可能

Leave a Reply

Your email address will not be published. Required fields are marked *