ESP32 Tutorial 46/55 - Remote Temperature Monitoring using HiveMQ MQTT | SunFounder's ESP32 kit
In deze tutorial maken we een extern temperatuurbewakingssysteem met behulp van de ESP32 en het MQTT-protocol. Dit project stelt ons in staat om temperatuurgegevens te publiceren naar een MQTT-broker en een LED op afstand te bedienen via een webinterface. Door op een knop te drukken, kunnen we temperatuurmetingen naar de cloud sturen, en we kunnen ook opdrachten ontvangen om de LED aan of uit te zetten.
De ESP32 is een krachtige microcontroller met ingebouwde Wi-Fi en Bluetooth, waardoor deze ideaal is voor Internet of Things (IoT)-toepassingen. In deze opstelling gebruiken we een NTC-thermistor om temperatuur te meten, een drukknop om de metingen te activeren, en een LED om de status aan te geven. De gegevens worden verzonden naar HiveMQ, een populaire MQTT-broker, waar ze op afstand kunnen worden benaderd (in video op 00:45).
Hardware Uitgelegd
Voor dit project gebruiken we de volgende componenten:
- ESP32 Microcontroller: Dit bord fungeert als de centrale verwerkingseenheid en verzorgt Wi-Fi-verbindingen en MQTT-communicatie.
- NTC-thermistor: Deze temperatuursensor verandert zijn weerstand op basis van temperatuur. Het levert een analoog signaal dat de ESP32 kan lezen om de huidige temperatuur te bepalen.
- LED: Deze lichtgevende diode wordt gebruikt om de status aan te geven op basis van opdrachten die via MQTT worden ontvangen.
- Drukknop: Deze knop activeert de ESP32 om de temperatuur te lezen en deze naar de MQTT-broker te publiceren.
Datasheet Details
| Fabrikant | SunFounder |
|---|---|
| Onderdeelnummer | ESP32 |
| Logica/IO-spanning | 3,3 V |
| Voedingsspanning | 5 V (via USB) |
| Uitgangsstroom (per kanaal) | 12 mA max |
| PWM-frequentierichtlijn | Tot 40 kHz |
| Ingangslogische drempels | 0,3 V (laag), 2,4 V (hoog) |
| Thermische limieten | -40 tot 85 °C |
| Verpakking | ESP32-WROOM-32 |
- Zorg voor correcte spanningsniveaus om schade te voorkomen.
- Gebruik pull-up-weerstanden voor de drukknop om stabiele metingen te garanderen.
- Ontkoppelcondensatoren kunnen helpen de voeding te stabiliseren.
- Wees voorzichtig met de bedrading van de thermistor om onjuiste metingen te voorkomen.
- Controleer uw MQTT-brokergegevens voor een succesvolle verbinding.
Bedradingsinstructies

Om de componenten te bedraden, begin met het aansluiten van de NTC-thermistor. Verbind een pin van de thermistor met de 3,3 V-voeding op de ESP32. De andere pin verbindt met pin 36 op de ESP32, en deze moet ook worden verbonden met een 10 kΩ-weerstand, die vervolgens met de grond wordt verbonden. Dit creëert een spanningsdeler die de ESP32 in staat stelt de weerstand van de thermistor te lezen.
Verbind vervolgens de LED. De langere pin (anode) van de LED verbindt met pin 4 op de ESP32 via een 220 Ω-weerstand, terwijl de kortere pin (kathode) met de grond wordt verbonden. Voor de drukknop verbind je een zijde met 3,3 V en de andere zijde met pin 14 op de ESP32. Verbind daarnaast een 10 kΩ-weerstand van de knop-pin naar de grond om een stabiele LAGE toestand te garanderen wanneer de knop niet wordt ingedrukt.
Vereiste bibliotheek installeren
De PubSubClient-bibliotheek wordt hier gebruikt; je kunt deze installeren vanuit de Bibliotheekbeheerder.
Codevoorbeelden & Uitleg
In de setup initialiseren we de seriële communicatie, stellen we de Wi-Fi-verbinding in en configureren we de MQTT-server. Hier is een fragment van de setup-code:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Dit deel van de code brengt de verbinding met het Wi-Fi-netwerk tot stand en stelt de MQTT-server in. De pinmodi voor de knop en LED worden hier ook geconfigureerd.
De loop-functie controleert continu de knopstatus en publiceert temperatuurgegevens wanneer deze wordt ingedrukt. Hier is een gericht fragment uit de loop:
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);
}
}
}
In deze loop controleren we of de ESP32 is verbonden met de MQTT-broker. Als de knop wordt ingedrukt, leest het de temperatuur van de thermistor en publiceert deze naar het onderwerp "SF/TEMP" elke 5 seconden.
Demonstratie / Wat te Verwachten
Wanneer het project is opgezet en draait, zal het indrukken van de knop de huidige temperatuur publiceren naar de MQTT-broker. U kunt deze gegevens volgen vanuit elke MQTT-client. Daarnaast kunt u berichten sturen om de LED te bedienen; het sturen van "aan" laat deze oplichten, terwijl "uit" deze uitschakelt. Let op het verwachte gedrag in de video op 15:30, waar de temperatuurmetingen worden getoond na elke knopdruk.
Videotijdstippen
- 00:00 Start
- 2:05 Introductie tot het project
- 7:06 Gratis HiveMQ-service
- 7:56 Bedrading uitgelegd
- 11:11 Arduino-code uitgelegd
- 18:46 ESP32-board en COM-poort selecteren in Arduino IDE
- 20:30 Demonstratie van HiveMQ Free broker
/*********
: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
Hulpmiddelen en referenties
-
DocumentatieESP32 Tutorial 46/55- SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Bestanden📁
Geen bestanden beschikbaar.