ESP32 ٹیوٹوریل 46/55 - HiveMQ MQTT کا استعمال کرتے ہوئے ریموٹ ٹمپریچر مانیٹرنگ | سن فاؤنڈر کا 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 کا لمبا پن (اینوڈ) ESP32 کے پن 4 سے 220 Ω ریزسٹر کے ذریعے جڑتا ہے، جبکہ چھوٹا پن (کیتھوڈ) گراؤنڈ سے جڑتا ہے۔ پش بٹن کے لیے، ایک طرف 3.3 V سے اور دوسری طرف ESP32 کے پن 14 سے جوڑیں۔ مزید برآں، بٹن پن سے گراؤنڈ تک ایک 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 کے پن موڈز بھی یہاں کنفیگر کیے گئے ہیں۔
لوپ فنکشن مسلسل بٹن کی اسٹیٹ چیک کرتا ہے اور دبائے جانے پر درجہ حرارت کا ڈیٹا شائع کرتا ہے۔ یہاں لوپ سے ایک فوکسڈ اقتباس ہے:
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
فائلیں📁
کوئی فائلیں دستیاب نہیں ہیں۔