ESP32 チュートリアル 46/55 - HiveMQ MQTT を使用したリモート温度監視 | SunFounder の ESP32 キット
このチュートリアルでは、ESP32とMQTTプロトコルを使用してリモート温度監視システムを作成します。このプロジェクトでは、MQTTブローカーに温度データを公開し、ウェブインターフェースを使用してLEDをリモートで制御できます。ボタンを押すことで温度データをクラウドに送信でき、LEDをオンまたはオフにするコマンドを受信することもできます。
ESP32は、内蔵のWi-FiとBluetoothを備えた強力なマイクロコントローラーで、IoT(モノのインターネット)アプリケーションに最適です。このセットアップでは、温度を測定するためにNTCサーミスタを使用し、読み取りをトリガーするためのプッシュボタンと、ステータスを示すためのLEDを使用します。データは、人気のMQTTブローカーであるHiveMQに送信され、リモートでアクセスできます(動画の00:45で)。
ハードウェアの解説
このプロジェクトでは、次のコンポーネントを利用します:
- ESP32マイクロコントローラこのボードは中央処理ユニットとして機能し、Wi-Fi接続とMQTT通信を管理します。
- NTCサーミスタ:この温度センサーは、温度に基づいて抵抗を変えます。ESP32が現在の温度を把握するために読み取ることができるアナログ信号を提供します。
- LED:この発光ダイオードは、MQTTを介して受信したコマンドに基づいて状態を示すために使用されます。
- 押しボタン:このボタンを押すと、ESP32が温度を読み取り、MQTTブローカーに公開します。
データシートの詳細
| 製造者 | サンファウンダー |
|---|---|
| 部品番号 | ESP32 |
| 論理/入出力電圧 | 3.3 V |
| 供給電圧 | 5 V (USB経由) |
| 出力電流(チャンネルごと) | 最大12 mA |
| PWM周波数ガイダンス | 最大40 kHzまで |
| 入力ロジック閾値 | 0.3 V(低)、2.4 V(高) |
| 熱的限界 | -40から85 °C |
| パッケージ | ESP32-WROOM-32 |
- 適切な電圧レベルを維持して、損傷を避けてください。
- プッシュボタンにはプルアップ抵抗を使用して、安定した読み取りを確保してください。
- デカップリングコンデンサは電源を安定させるのに役立ちます。
- サーミスタの配線には注意して、不正確な測定を避けてください。
- MQTTブローカーの詳細を確認して、接続が成功するようにしてください。
配線指示

コンポーネントを配線するには、まずNTCサーミスタを接続します。サーミスタの1つの端子をESP32の3.3 V電源に接続します。もう1つの端子をESP32の36番ピンに接続し、さらに10 kΩの抵抗にも接続します。この抵抗はグラウンドにも接続されます。これにより、ESP32がサーミスタの抵抗を読み取ることができるボルテージディバイダが作成されます。
次に、LEDを接続します。LEDの長いピン(アノード)は、220 Ωの抵抗を介してESP32のピン4に接続し、短いピン(カソード)はグラウンドに接続します。押しボタンについては、一方の端を3.3 Vに接続し、もう一方の端をESP32のピン14に接続します。さらに、ボタンピンからグラウンドに10 kΩの抵抗を接続して、ボタンが押されていないときに安定したLOW状態を確保します。
必要なライブラリをインストールします
そのPubSubClientライブラリはここで使用されています。インストールするには、あなたはそれをから入手することができます。ライブラリマネージャー.
コードの例とウォークスルー
セットアップでは、シリアル通信を初期化し、Wi-Fi接続を設定し、MQTTサーバーを構成します。以下はセットアップコードの一部です:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}このコードの部分はWi-Fiネットワークへの接続を確立し、MQTTサーバーを設定します。ボタンとLEDのピンモードもここで構成されています。
ループ関数はボタンの状態を継続的にチェックし、押されたときに温度データを公開します。こちらがループからの重点的な抜粋です:
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (digitalRead(buttonPin)) {
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
char tempString[8];
dtostrf(thermistor(), 1, 2, tempString);
client.publish("SF/TEMP", tempString);
}
}
}このループでは、ESP32がMQTTブローカーに接続されているかどうかを確認します。ボタンが押されると、サーミスタから温度を読み取り、5秒ごとにトピック「SF/TEMP」に公開します。
デモンストレーション / 期待すること
プロジェクトが設定されて動作を開始すると、ボタンを押すことで現在の温度がMQTTブrokerに公開されます。このデータは任意のMQTTクライアントから監視できます。さらに、LEDを制御するためのメッセージを送信することもできます。「on」を送信すると点灯し、「off」を送信すると消灯します。ボタンを押すたびに温度読み取り値が表示される15:30のビデオで期待される動作を確認してください。
ビデオのタイムスタンプ
- 00:00 開始
- 2:05 プロジェクトの紹介
- 7:06 無料HiveMQサービス
- 7:56 配線の説明
- 11:11 Arduinoコードの説明
- 18:46 Arduino IDEでESP32ボードとCOMポートを選択中
- 20:30 HiveMQ無料ブローカーのデモンストレーション
/*
* :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
* https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*/
#include <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
// 次の変数をあなたのSSID/パスワードの組み合わせに置き換えてください。
const char* ssid = "SSID";
const char* password = "PASSWORD";
// MQTTブローカーのアドレスを追加してください。例:
const char* mqtt_server = "broker.hivemq.com";
const char* unique_identifier = "sunfounder-client-sdgvsda";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// LEDピン
const int ledPin = 4;
const int buttonPin = 14;
// WIFIに接続すると、36 39 34 35 32 33のピンのみがアナログ読み取りに使用できます。
// 定数を定義する
const int thermistorPin = 36; // サーミスタに接続されたピン
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // 抵抗値 (10k)
const float beta = 3950; // ベータ値(典型値)
const float nominalTemperature = 25; // 温度係数を計算するための名目温度
const float nominalResistance = 10000; // 名目温度での抵抗値
void setup() {
Serial.begin(115200);
// デフォルト設定
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void setup_wifi() {
delay(10);
// WiFiネットワークに接続することから始めます。
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// メッセージが「SF/LED」に関するものである場合、そのメッセージが「オン」または「オフ」のいずれかであるかを確認します。
// メッセージに応じて出力状態を変更します。
if (String(topic) == "SF/LED") {
Serial.print("Changing state to ");
if (messageTemp == "on") {
Serial.println("on");
digitalWrite(ledPin, HIGH);
} else if (messageTemp == "off") {
Serial.println("off");
digitalWrite(ledPin, LOW);
}
}
}
void reconnect() {
// 再接続されるまでループします。
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// 接続を試みる
if (client.connect(unique_identifier)) {
Serial.println("connected");
// 購読する
client.subscribe("SF/LED");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// 再試行する前に5秒待ってください
delay(5000);
}
}
}
float thermistor() {
int adcValue = analogRead(thermistorPin); // ADC値を読み取る
float voltage = (adcValue * referenceVoltage) / 4095.0; // 電圧を計算する
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // 更新された構成でサーミスタの抵抗を計算する
// ベータパラメータ方程式を使用して温度を計算します。
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
float tempC = tempK - 273.15; // 摂氏で温度を取得する
float tempF = 1.8 * tempC + 32.0; // 華氏で温度を取得する
// 印刷温度
Serial.print("Temp: ");
Serial.println(tempC);
delay(200); // 200ミリ秒待機する
return tempC;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// ボタンが押された場合、温度をトピック「SF/TEMP」に公開します。
if (digitalRead(buttonPin)) {
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
char tempString[8];
dtostrf(thermistor(), 1, 2, tempString);
client.publish("SF/TEMP", tempString);
}
}
}
Common Course Links
Common Course Files
リソースと参考文献
-
ドキュメンテーションESP32 チュートリアル 46/55 - SunFounder IoT 通信のための MQTT に関するドキュメントページdocs.sunfounder.com
ファイル📁
ファイルは利用できません。