Samouczek ESP32 46/55 - Zdalne monitorowanie temperatury za pomocą HiveMQ MQTT | Zestaw SunFounder ESP32
W tym samouczku stworzymy zdalny system monitorowania temperatury z wykorzystaniem ESP32 i protokołu MQTT. Ten projekt pozwala nam publikować dane temperatury do brokera MQTT oraz zdalnie sterować diodą LED za pomocą interfejsu internetowego. Po naciśnięciu przycisku możemy wysyłać odczyty temperatury do chmury, a także możemy odbierać polecenia włączania lub wyłączania diody LED.
ESP32 to wydajny mikrokontroler z wbudowanym Wi-Fi i Bluetooth, co czyni go idealnym do zastosowań w Internecie Rzeczy (IoT). W tej konfiguracji użyjemy termistora NTC do pomiaru temperatury, przycisku do wyzwalania odczytów oraz diody LED do wskazywania statusu. Dane będą wysyłane do HiveMQ, popularnego brokera MQTT, gdzie można uzyskać do nich zdalny dostęp (na filmie w 00:45).
Wyjaśnienie Sprzętu
Do tego projektu wykorzystamy następujące komponenty:
- Mikrokontroler ESP32: Ta płyta służy jako centralna jednostka przetwarzająca, obsługująca połączenia Wi-Fi i komunikację MQTT.
- Termistor NTC: Ten czujnik temperatury zmienia swoją rezystancję w zależności od temperatury. Dostarcza sygnał analogowy, który ESP32 może odczytać, aby określić aktualną temperaturę.
- Dioda LED: Ta dioda elektroluminescencyjna będzie używana do wskazywania statusu na podstawie poleceń otrzymywanych przez MQTT.
- Przycisk: Ten przycisk spowoduje, że ESP32 odczyta temperaturę i opublikuje ją do brokera MQTT.
Szczegóły z Karty Katalogowej
| Producent | SunFounder |
|---|---|
| Numer części | ESP32 |
| Napięcie logiki/IO | 3,3 V |
| Napięcie zasilania | 5 V (przez USB) |
| Prąd wyjściowy (na kanał) | maks. 12 mA |
| Zalecana częstotliwość PWM | Do 40 kHz |
| Progi logiczne wejścia | 0,3 V (niski), 2,4 V (wysoki) |
| Limity termiczne | -40 do 85 °C |
| Obudowa | ESP32-WROOM-32 |
- Zapewnij odpowiednie poziomy napięcia, aby uniknąć uszkodzeń.
- Użyj rezystorów podciągających dla przycisku, aby zapewnić stabilne odczyty.
- Kondensatory odsprzęgające mogą pomóc w stabilizacji zasilania.
- Zachowaj ostrożność przy okablowaniu termistora, aby uniknąć błędnych odczytów.
- Zweryfikuj dane swojego brokera MQTT, aby zapewnić pomyślne połączenie.
Instrukcje Okablowania

Aby podłączyć komponenty, zacznij od podłączenia termistora NTC. Podłącz jeden pin termistora do zasilania 3,3 V na ESP32. Drugi pin podłącz do pinu 36 na ESP32, a także do rezystora 10 kΩ, który jest następnie podłączony do masy. Tworzy to dzielnik napięcia, który pozwala ESP32 odczytać rezystancję termistora.
Następnie podłącz diodę LED. Dłuższy pin (anoda) diody LED podłącz do pinu 4 na ESP32 przez rezystor 220 Ω, podczas gdy krótszy pin (katoda) podłącz do masy. Dla przycisku podłącz jedną stronę do 3,3 V, a drugą do pinu 14 na ESP32. Dodatkowo podłącz rezystor 10 kΩ od pinu przycisku do masy, aby zapewnić stabilny stan NISKI, gdy przycisk nie jest wciśnięty.
Zainstaluj Wymaganą Bibliotekę
Używana jest tutaj biblioteka PubSubClient, którą można zainstalować z Menedżera Bibliotek.
Przykłady Kodu i Omówienie
W konfiguracji inicjalizujemy komunikację szeregową, ustawiamy połączenie Wi-Fi i konfigurujemy serwer MQTT. Oto fragment kodu konfiguracji:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Ta część kodu ustanawia połączenie z siecią Wi-Fi i konfiguruje serwer MQTT. Tryby pinów dla przycisku i diody LED są również tutaj skonfigurowane.
Funkcja pętli ciągle sprawdza stan przycisku i publikuje dane temperatury po jego naciśnięciu. Oto skoncentrowany fragment z pętli:
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);
}
}
}
W tej pętli sprawdzamy, czy ESP32 jest podłączony do brokera MQTT. Jeśli przycisk jest wciśnięty, odczytuje temperaturę z termistora i publikuje ją do tematu "SF/TEMP" co 5 sekund.
Demonstracja / Czego Się Spodziewać
Gdy projekt jest skonfigurowany i uruchomiony, naciśnięcie przycisku opublikuje bieżącą temperaturę do brokera MQTT. Możesz monitorować te dane z dowolnego klienta MQTT. Dodatkowo możesz wysyłać wiadomości w celu sterowania diodą LED; wysłanie "on" spowoduje jej zapalenie, a "off" jej wyłączenie. Obserwuj oczekiwane zachowanie na wideo w czasie 15:30, gdzie odczyty temperatury są pokazywane po każdym naciśnięciu przycisku.
Znaczniki czasowe wideo
- 00:00 Start
- 2:05 Wprowadzenie do projektu
- 7:06 Darmowa usługa HiveMQ
- 7:56 Wyjaśnienie podłączeń
- 11:11 Wyjaśnienie kodu Arduino
- 18:46 Wybór płytki ESP32 i portu COM w Arduino IDE
- 20:30 Demonstracja darmowego brokera 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>
// 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
Zasoby i odniesienia
-
DokumentacjaESP32 Tutorial 46/55- SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Pliki📁
Brak dostępnych plików.