Návod pre ESP32 46/55 – Diaľkové monitorovanie teploty pomocou HiveMQ MQTT | Súprava ESP32 od SunFounder
V tomto návode si vytvoríme systém diaľkového monitorovania teploty pomocou ESP32 a protokolu MQTT. Tento projekt nám umožňuje publikovať údaje o teplote do MQTT brokera a ovládať LED diódu na diaľku pomocou webového rozhrania. Stlačením tlačidla môžeme odoslať namerané teploty do cloudu a tiež môžeme prijímať príkazy na zapnutie alebo vypnutie LED diódy.
ESP32 je výkonný mikrokontrolér so zabudovaným Wi-Fi a Bluetooth, vďaka čomu je ideálny pre aplikácie internetu vecí (IoT). V tomto zapojení použijeme NTC termistor na meranie teploty, tlačidlo na spustenie meraní a LED diódu na indikáciu stavu. Údaje budú odosielané do HiveMQ, populárneho MQTT brokera, kde k nim možno pristupovať na diaľku (vo videu o 00:45).
Vysvetlenie hardvéru
Pre tento projekt použijeme nasledujúce komponenty:
- Mikrokontrolér ESP32: Táto doska slúži ako centrálna procesorová jednotka, ktorá spravuje Wi-Fi pripojenie a MQTT komunikáciu.
- NTC termistor: Tento teplotný senzor mení svoj odpor v závislosti od teploty. Poskytuje analógový signál, ktorý ESP32 dokáže prečítať na určenie aktuálnej teploty.
- LED dióda: Táto svetelná dióda sa použije na indikáciu stavu na základe príkazov prijatých cez MQTT.
- Tlačidlo: Toto tlačidlo spustí ESP32, aby prečítal teplotu a publikoval ju do MQTT brokera.
Podrobnosti z datasheetu
| Výrobca | SunFounder |
|---|---|
| Označenie dielu | ESP32 |
| Logické/IO napätie | 3,3 V |
| Napájacie napätie | 5 V (cez USB) |
| Výstupný prúd (na kanál) | max. 12 mA |
| Odporúčaná PWM frekvencia | až 40 kHz |
| Prahové hodnoty vstupnej logiky | 0,3 V (nízka), 2,4 V (vysoká) |
| Tepelné limity | -40 až 85 °C |
| Puzdro | ESP32-WROOM-32 |
- Zabezpečte správne úrovne napätia, aby nedošlo k poškodeniu.
- Použite pull-up rezistory pre tlačidlo, aby boli namerané hodnoty stabilné.
- Oddeľovacie kondenzátory môžu pomôcť stabilizovať napájanie.
- Buďte opatrní pri zapojení termistora, aby ste predišli nesprávnym meraniam.
- Overte si údaje o vašom MQTT brokeri pre úspešné pripojenie.
Pokyny na zapojenie

Pri zapájaní komponentov začnite pripojením NTC termistora. Pripojte jeden vývod termistora na 3,3 V napájanie na ESP32. Druhý vývod pripojte na pin 36 na ESP32 a tiež ho pripojte k 10 kΩ rezistoru, ktorý je následne pripojený na zem. Tým sa vytvorí napäťový delič, ktorý umožní ESP32 prečítať odpor termistora.
Ďalej pripojte LED diódu. Dlhší vývod (anóda) LED diódy pripojte na pin 4 na ESP32 cez 220 Ω rezistor, zatiaľ čo kratší vývod (katóda) pripojte na zem. Pre tlačidlo pripojte jednu stranu na 3,3 V a druhú stranu na pin 14 na ESP32. Okrem toho pripojte 10 kΩ rezistor z pinu tlačidla na zem, aby ste zabezpečili stabilný stav LOW, keď tlačidlo nie je stlačené.
Inštalácia požadovanej knižnice
Používa sa tu knižnica PubSubClient, ktorú môžete nainštalovať zo Správcu knižníc.
Príklady kódu a vysvetlenie
V nastavení inicializujeme sériovú komunikáciu, nastavíme Wi-Fi pripojenie a nakonfigurujeme MQTT server. Tu je ukážka nastavovacieho kódu:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Táto časť kódu vytvorí pripojenie k Wi-Fi sieti a nastaví MQTT server. Tu sú tiež nakonfigurované režimy pinov pre tlačidlo a LED diódu.
Funkcia loop nepretržite kontroluje stav tlačidla a po stlačení publikuje údaje o teplote. Tu je zameraný výňatok zo slučky:
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);
}
}
}
V tejto slučke kontrolujeme, či je ESP32 pripojený k MQTT brokerovi. Ak je tlačidlo stlačené, prečíta teplotu z termistora a publikuje ju do témy "SF/TEMP" každých 5 sekúnd.
Demonštrácia / Čo očakávať
Keď je projekt nastavený a spustený, stlačenie tlačidla publikuje aktuálnu teplotu do MQTT brokera. Tieto údaje môžete sledovať z ľubovoľného MQTT klienta. Okrem toho môžete posielať správy na ovládanie LED; odoslanie „on" ju rozsvieti, zatiaľ čo „off" ju vypne. Sledujte očakávané správanie vo videu v čase 15:30, kde sú zobrazené hodnoty teploty po každom stlačení tlačidla.
Časové značky videa
- 00:00 Začiatok
- 2:05 Úvod do projektu
- 7:06 Bezplatná služba HiveMQ
- 7:56 Vysvetlenie zapojenia
- 11:11 Vysvetlenie kódu Arduino
- 18:46 Výber dosky ESP32 a COM portu v Arduino IDE
- 20:30 Ukážka HiveMQ Free brokera
/*********
: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>
// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Add your MQTT Broker address, example:
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 Pin
const int ledPin = 4;
const int buttonPin = 14;
// When you connect to WIFI, only 36 39 34 35 32 33 pins can be used for analog reading.
// Define constants
const int thermistorPin = 36; // Pin connected to the thermistor
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // Resistance value (10k)
const float beta = 3950; // Beta value (Typical Value)
const float nominalTemperature = 25; // Nominal temperature for calculating the temperature coefficient
const float nominalResistance = 10000; // Resistance value at nominal temperature
void setup() {
Serial.begin(115200);
// default settings
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
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();
// If a message is received on the topic "SF/LED", you check if the message is either "on" or "off".
// Changes the output state according to the message
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() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(unique_identifier)) {
Serial.println("connected");
// Subscribe
client.subscribe("SF/LED");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
float thermistor() {
int adcValue = analogRead(thermistorPin); // Read ADC value
float voltage = (adcValue * referenceVoltage) / 4095.0; // Calculate voltage
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calculate thermistor resistance with updated configuration
// Calculate temperature using the Beta parameter equation
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
float tempC = tempK - 273.15; // Get temperature in Celsius
float tempF = 1.8 * tempC + 32.0; // Get temperature in Fahrenheit
//Print temperature
Serial.print("Temp: ");
Serial.println(tempC);
delay(200); //wait for 200 milliseconds
return tempC;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// if the button pressed, publish the temperature to topic "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
Resources & references
-
DocumentationESP32 Tutorial 46/55- SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Files📁
No files available.