ESP32 Tutorijal 46/55 - Daljinsko praćenje temperature koristeći HiveMQ MQTT | SunFounder-ov ESP32 komplet
U ovom tutorijalu ćemo kreirati sistem za daljinsko praćenje temperature koristeći ESP32 i MQTT protokol. Ovaj projekat nam omogućava da objavimo podatke o temperaturi na MQTT broker i daljinski upravljamo LED diodom koristeći web interfejs. Pritiskanjem dugmeta možemo poslati očitanja temperature u oblak, a također možemo primati komande za uključivanje ili isključivanje LED diode.
ESP32 je moćan mikrokontroler koji ima ugrađen Wi-Fi i Bluetooth, što ga čini idealnim za Internet stvari (IoT) aplikacije. U ovoj postavci koristit ćemo NTC termistor za mjerenje temperature, tipku za pokretanje očitanja i LED diodu za prikaz statusa. Podaci će biti poslani na HiveMQ, popularni MQTT broker, gdje im se može pristupiti daljinski (u videu na 00:45).
Objašnjenje hardvera
Za ovaj projekat koristit ćemo sljedeće komponente:
- ESP32 mikrokontroler: Ova ploča služi kao centralna procesna jedinica, upravljajući Wi-Fi vezama i MQTT komunikacijom.
- NTC termistor: Ovaj temperaturni senzor mijenja svoj otpor na osnovu temperature. Pruža analogni signal koji ESP32 može očitati kako bi odredio trenutnu temperaturu.
- LED dioda: Ova svjetleća dioda koristit će se za prikaz statusa na osnovu komandi primljenih putem MQTT-a.
- Tipka: Ova tipka će pokrenuti ESP32 da očita temperaturu i objavi je na MQTT broker.
Detalji iz tehničke dokumentacije
| Proizvođač | SunFounder |
|---|---|
| Broj dijela | ESP32 |
| Logički/IO napon | 3.3 V |
| Napon napajanja | 5 V (putem USB-a) |
| Izlazna struja (po kanalu) | 12 mA max |
| Smjernice za PWM frekvenciju | Do 40 kHz |
| Ulazni logički pragovi | 0.3 V (nisko), 2.4 V (visoko) |
| Toplotna ograničenja | -40 do 85 °C |
| Paket | ESP32-WROOM-32 |
- Osigurajte odgovarajuće nivoe napona kako biste izbjegli oštećenja.
- Koristite pull-up otpornike za tipku kako biste osigurali stabilna očitanja.
- Dekopling kondenzatori mogu pomoći u stabilizaciji napajanja.
- Budite oprezni s ožičenjem termistora kako biste izbjegli pogrešna očitanja.
- Provjerite detalje vašeg MQTT brokera za uspješnu vezu.
Upute za ožičenje

Za ožičenje komponenti, počnite spajanjem NTC termistora. Spojite jedan pin termistora na 3.3 V napajanje na ESP32. Drugi pin spojite na pin 36 na ESP32, a također ga spojite na otpornik od 10 kΩ, koji je zatim spojen na masu. Ovo stvara djelitelj napona koji omogućava ESP32 da očita otpor termistora.
Zatim spojite LED diodu. Duži pin (anoda) LED diode spojite na pin 4 na ESP32 kroz otpornik od 220 Ω, dok se kraći pin (katoda) spaja na masu. Za tipku, spojite jednu stranu na 3.3 V, a drugu stranu na pin 14 na ESP32. Dodatno, spojite otpornik od 10 kΩ od pina tipke na masu kako biste osigurali stabilno NISKO stanje kada tipka nije pritisnuta.
Instalacija potrebne biblioteke
Biblioteka PubSubClient se ovdje koristi, možete je instalirati iz Upravitelja bibliotekama.
Primjeri koda i objašnjenje
U postavci inicijaliziramo serijsku komunikaciju, postavljamo Wi-Fi vezu i konfiguriramo MQTT server. Evo isječka koda za postavku:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Ovaj dio koda uspostavlja vezu s Wi-Fi mrežom i postavlja MQTT server. Načini rada pinova za tipku i LED diodu također su konfigurirani ovdje.
Funkcija petlje kontinuirano provjerava stanje tipke i objavljuje podatke o temperaturi kada je pritisnuta. Evo fokusiranog izvatka iz petlje:
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);
}
}
}
U ovoj petlji provjeravamo je li ESP32 povezan s MQTT brokerom. Ako je tipka pritisnuta, očitava temperaturu s termistora i objavljuje je na temu "SF/TEMP" svakih 5 sekundi.
Demonstracija / Šta očekivati
Kada je projekat postavljen i pokrenut, pritiskanje dugmeta će objaviti trenutnu temperaturu na MQTT broker. Ove podatke možete pratiti sa bilo kojeg MQTT klijenta. Dodatno, možete slati poruke za kontrolu LED diode; slanje "on" će je upaliti, dok će "off" ugasiti. Obratite pažnju na očekivano ponašanje u videu na 15:30, gdje su prikazana očitanja temperature nakon svakog pritiska dugmeta.
Vremenske oznake videa
- 00:00 Početak
- 2:05 Uvod u projekat
- 7:06 Besplatna HiveMQ usluga
- 7:56 Objašnjeno povezivanje
- 11:11 Objašnjen Arduino kod
- 18:46 Odabir ESP32 ploče i COM porta u Arduino IDE
- 20:30 Demonstracija 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.