د 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 |
- د زیان د مخنیوي لپاره د ولټاژ مناسبې کچې ډاډمن کړئ.
- د فشارونکې تڼۍ لپاره د پل-اپ ریزسټرونه وکاروئ ترڅو باثباته لوستل ډاډمن شي.
- د برېښنا رسولو د ثبات لپاره کولی شي د ډیکپلینګ کپاسیټرونه مرسته وکړي.
- د ترمیسټر د تارونو په اړه محتاط اوسئ ترڅو ناسم لوستل مخنیوی وشي.
- د بریالي اړیکې لپاره خپل د MQTT بروکر تفصیلات تایید کړئ.
د تارونو د نښلولو لارښوونې

د اجزاوو د نښلولو لپاره، لومړی د NTC ترمیسټر په نښلولو سره پیل وکړئ. د ترمیسټر یو پن د ESP32 په 3.3 V برېښنا رسولو سره وصل کړئ. بل پن د ESP32 په پن 36 سره وصل کیږي، او دا باید د 10 kΩ ریزسټر سره هم وصل شي، کوم چې بیا ځمکې ته نښلول کیږي. دا یو ولټاژ ویشونکی جوړوي چې ESP32 ته اجازه ورکوي د ترمیسټر مقاومت ولولي.
بیا، LED وصل کړئ. د LED اوږد پن (انود) د 220 Ω ریزسټر له لارې د ESP32 په پن 4 سره وصل کیږي، پداسې حال کې چې لنډ پن (کاتود) ځمکې ته نښلول کیږي. د فشارونکې تڼۍ لپاره، یو اړخ 3.3 V ته او بل اړخ د ESP32 په پن 14 سره وصل کړئ. برسیره پردې، د تڼۍ له پن څخه ځمکې ته د 10 kΩ ریزسټر وصل کړئ ترڅو کله چې تڼۍ فشار نه وي، د ټیټ (LOW) باثباته حالت ډاډمن شي.
اړین کتابتون نصب کړئ
د PubSubClient کتابتون دلته کارول کیږي، تاسو کولی شئ دا د کتابتون مدیر (Library Manager) څخه نصب کړئ.
د کوډ مثالونه او تفصیل
په ترتیب کې، موږ سریال مخابرات پیل کوو، د 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 لپاره د پن حالتونه هم دلته تنظیم شوي دي.
د لوپ فنکشن په دوامداره توګه د تڼۍ حالت چیک کوي او کله چې فشار شي د تودوخې معلومات خپروي. دلته د لوپ څخه یوه متمرکزه برخه ده:
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 وړیا بروکر مظاهره
/*********
: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
فایلونه📁
هیڅ فایل شتون نلري.