ESP32 Упатство 46/55 - Далечинско следење на температурата користејќи HiveMQ MQTT | SunFounder-овиот ESP32 комплет
Во ова упатство, ќе создадеме систем за далечинско следење на температурата користејќи го ESP32 и MQTT протоколот. Овој проект ни овозможува да објавуваме податоци за температурата на MQTT брокер и да контролираме LED диода далечински преку веб интерфејс. Со притискање на копче, можеме да испратиме читања на температурата во облакот, а исто така можеме да примаме команди за вклучување или исклучување на LED диодата.
ESP32 е моќен микроконтролер кој има вградено Wi-Fi и Bluetooth, што го прави идеален за апликации на Интернет на нештата (IoT). Во оваа поставка, ќе користиме NTC термистор за мерење на температурата, копче за активирање на читањата и LED диода за означување на статусот. Податоците ќе бидат испратени до HiveMQ, популарен MQTT брокер, каде што можат да се пристапат далечински (во видеото на 00:45).
Објаснување на хардверот
За овој проект, ќе ги користиме следниве компоненти:
- ESP32 микроконтролер: Оваа плоча служи како централна процесорска единица, управувајќи со Wi-Fi врските и MQTT комуникациите.
- NTC термистор: Овој температурен сензор ја менува својата отпорност врз основа на температурата. Тој обезбедува аналоген сигнал што ESP32 може да го чита за да ја одреди моменталната температура.
- LED диода: Оваа светлечка диода ќе се користи за означување на статусот врз основа на командите примени преку MQTT.
- Копче: Ова копче ќе го активира ESP32 да ја прочита температурата и да ја објави на MQTT брокерот.
Детали од техничката документација
| Производител | SunFounder |
|---|---|
| Број на дел | ESP32 |
| Логички/IO напон | 3.3 V |
| Напон на напојување | 5 V (преку USB) |
| Излезна струја (по канал) | 12 mA макс. |
| Насоки за PWM фреквенција | До 40 kHz |
| Прагови на влезна логика | 0.3 V (ниско), 2.4 V (високо) |
| Термички граници | -40 до 85 °C |
| Пакет | ESP32-WROOM-32 |
- Осигурете се дека напонските нивоа се соодветни за да избегнете оштетување.
- Користете pull-up отпорници за копчето за да обезбедите стабилни читања.
- Декуплиншки кондензатори можат да помогнат во стабилизирање на напојувањето.
- Бидете внимателни со жиците на термисторот за да избегнете неточни читања.
- Проверете ги деталите за вашиот MQTT брокер за успешна врска.
Инструкции за поврзување

За да ги поврзете компонентите, започнете со поврзување на NTC термисторот. Поврзете еден пин од термисторот на 3.3 V напојувањето на ESP32. Другиот пин се поврзува на пин 36 на ESP32, и исто така треба да се поврзе со отпорник од 10 kΩ, кој потоа се поврзува на земја. Ова создава делител на напон што му овозможува на ESP32 да ја чита отпорноста на термисторот.
Следно, поврзете ја LED диодата. Подолгиот пин (анода) на LED диодата се поврзува на пин 4 на ESP32 преку отпорник од 220 Ω, додека пократкиот пин (катода) се поврзува на земја. За копчето, поврзете една страна на 3.3 V и другата страна на пин 14 на ESP32. Дополнително, поврзете отпорник од 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 диодата исто така се конфигурирани овде.
Функцијата loop постојано ја проверува состојбата на копчето и објавува податоци за температурата кога е притиснато. Еве фокусиран извадок од 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);
}
}
}
Во оваа loop, проверуваме дали ESP32 е поврзан со MQTT брокерот. Ако копчето е притиснато, ја чита температурата од термисторот и ја објавува на темата "SF/TEMP" секои 5 секунди.
Демонстрација / Што да очекувате
Когато проектот е поставен и работи, притискањето на копчето ќе ја објави моменталната температура на MQTT брокерот. Можете да ги следите овие податоци од било кој MQTT клиент. Дополнително, можете да испраќате пораки за контрола на LED-светилката; испраќањето „on“ ќе ја запали, додека „off“ ќе ја изгаси. Внимавајте на очекуваното однесување во видеото на 15:30, каде што читањата на температурата се прикажани по секое притискање на копчето.
Временски ознаки на видеото
- 00:00 Почеток
- 2:05 Вовед во проектот
- 7:06 Бесплатна HiveMQ услуга
- 7:56 Објаснување на жиците
- 11:11 Објаснување на Arduino кодот
- 18:46 Избор на ESP32 плочка и COM порта во Arduino IDE
- 20:30 Демонстрација на HiveMQ Free брокер
/*********
: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
Ресурси и референци
-
ДокументацијаESP32 Tutorial 46/55 - SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Датотеки📁
Нема достапни датотеки.