ESP32 Оқулық 46/55 - HiveMQ MQTT көмегімен қашықтан температураны бақылау | SunFounder ESP32 жинағы
Бұл оқулықта біз ESP32 және MQTT протоколын қолдана отырып, қашықтан температураны бақылау жүйесін жасаймыз. Бұл жоба температура деректерін MQTT брокеріне жариялауға және веб-интерфейс арқылы жарықдиодты қашықтан басқаруға мүмкіндік береді. Түймені басу арқылы біз температура көрсеткіштерін бұлтқа жібере аламыз, сонымен қатар жарықдиодты қосу немесе өшіру пәрмендерін қабылдай аламыз.
ESP32 - бұл кірістірілген Wi-Fi және Bluetooth мүмкіндіктері бар қуатты микроконтроллер, оны Интернет заттары (IoT) қолданбалары үшін өте қолайлы етеді. Бұл қондырғыда біз температураны өлшеу үшін NTC термисторын, көрсеткіштерді іске қосу үшін түймені және күйді көрсету үшін жарықдиодты қолданамыз. Деректер танымал MQTT брокері HiveMQ-ге жіберіледі, оны қашықтан қол жетімді етеді (бейнеде 00:45).
Аппараттық құрал түсіндірмесі
Бұл жоба үшін біз келесі компоненттерді қолданамыз:
- ESP32 микроконтроллері: Бұл плата орталық өңдеу бірлігі ретінде қызмет етеді, Wi-Fi қосылымдарын және MQTT байланыстарын басқарады.
- NTC термисторы: Бұл температура сенсоры температураға байланысты кедергісін өзгертеді. Ол ESP32 ағымдағы температураны анықтау үшін оқи алатын аналогтық сигнал береді.
- Жарықдиод: Бұл жарық шығаратын диод MQTT арқылы қабылданған пәрмендерге негізделген күйді көрсету үшін қолданылады.
- Түйме: Бұл түйме ESP32 температураны оқуға және оны MQTT брокеріне жариялауға әкеледі.
Деректер парағының мәліметтері
| Өндіруші | SunFounder |
|---|---|
| Бөлшек нөмірі | ESP32 |
| Логика/IO кернеуі | 3.3 В |
| Қоректендіру кернеуі | 5 В (USB арқылы) |
| Шығыс тогы (арнаға) | 12 мА макс |
| PWM жиілігі бойынша нұсқау | 40 кГц дейін |
| Кіріс логикалық шектері | 0.3 В (төмен), 2.4 В (жоғары) |
| Жылулық шектер | -40-тан 85 °C-қа дейін |
| Қаптама | ESP32-WROOM-32 |
- Зақымдануды болдырмау үшін дұрыс кернеу деңгейлерін қамтамасыз етіңіз.
- Тұрақты көрсеткіштерді қамтамасыз ету үшін түйме үшін жоғары тарту резисторларын қолданыңыз.
- Ажырату конденсаторлары қуат көзін тұрақтандыруға көмектеседі.
- Қате көрсеткіштерді болдырмау үшін термистордың сымдарына абай болыңыз.
- Сәтті қосылу үшін MQTT брокерінің мәліметтерін тексеріңіз.
Сым қосу нұсқаулары

Компоненттерді қосу үшін алдымен NTC термисторын қосыңыз. Термистордың бір істікшесін ESP32-дегі 3.3 В қоректендіруге қосыңыз. Басқа істікше ESP32-дегі 36 істікшеге қосылады, сонымен қатар ол жерге қосылған 10 кΩ резисторға қосылуы керек. Бұл ESP32-ге термистордың кедергісін оқуға мүмкіндік беретін кернеу бөлгішін жасайды.
Әрі қарай, жарықдиодты қосыңыз. Жарықдиодтың ұзын істікшесі (анод) ESP32-дегі 4 істікшеге 220 Ω резистор арқылы қосылады, ал қысқа істікше (катод) жерге қосылады. Түйме үшін бір жағын 3.3 В-қа, ал екінші жағын ESP32-дегі 14 істікшеге қосыңыз. Сонымен қатар, түйме басылмаған кезде тұрақты LOW күйін қамтамасыз ету үшін түйме істікшесінен жерге 10 кΩ резисторды қосыңыз.
Қажетті кітапхананы орнату
Мұнда 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 серверін конфигурациялайды. Түйме мен жарықдиодтың істікше режимдері де осында конфигурацияланады.
Цикл функциясы түйменің күйін үздіксіз тексереді және басылған кезде температура деректерін жариялайды. Міне, циклден алынған үзінді:
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);
}
}
}
Бұл циклде біз ESP32-нің MQTT брокеріне қосылғанын тексереміз. Егер түйме басылса, ол термистордан температураны оқиды және оны әр 5 секунд сайын "SF/TEMP" тақырыбына жариялайды.
Демонстрация / Не күтуге болады
Жоба орнатылып, іске қосылған кезде, түймені басу ағымдағы температураны MQTT брокеріне жариялайды. Сіз бұл деректерді кез келген MQTT клиентінен бақылай аласыз. Сонымен қатар, LED-ді басқару үшін хабарлама жібере аласыз; "on" жіберу оны жағады, ал "off" өшіреді. 15:30-дағы бейнеде күтілетін әрекетті бақылаңыз, онда әр түйме басылғаннан кейін температура көрсеткіштері көрсетіледі.
Бейне уақыт белгілері
- 00:00 Басталуы
- 2:05 Жобаға кіріспе
- 7:06 Тегін HiveMQ қызметі
- 7:56 Сымдарды қосу түсіндірілді
- 11:11 Arduino коды түсіндірілді
- 18:46 Arduino IDE-де ESP32 платасын және COM портын таңдау
- 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
Файлдар📁
Файлдар жоқ.