کوڈ تلاش کریں

ESP32 ٹیوٹوریل 46/55 - HiveMQ MQTT کا استعمال کرتے ہوئے ریموٹ ٹمپریچر مانیٹرنگ | سن فاؤنڈر کا ESP32 کٹ

ESP32 ٹیوٹوریل 46/55 - HiveMQ MQTT کا استعمال کرتے ہوئے ریموٹ ٹمپریچر مانیٹرنگ | سن فاؤنڈر کا ESP32 کٹ

اس ٹیوٹوریل میں، ہم ESP32 اور MQTT پروٹوکول کا استعمال کرتے ہوئے ایک ریموٹ ٹمپریچر مانیٹرنگ سسٹم بنائیں گے۔ یہ پروجیکٹ ہمیں درجہ حرارت کا ڈیٹا MQTT بروکر پر شائع کرنے اور ویب انٹرفیس کے ذریعے LED کو ریموٹ کنٹرول کرنے کی اجازت دیتا ہے۔ بٹن دبانے سے، ہم درجہ حرارت کی ریڈنگز کلاؤڈ پر بھیج سکتے ہیں، اور ہم LED کو آن یا آف کرنے کے لیے کمانڈز بھی وصول کر سکتے ہیں۔

esp32-47-mqt-1

ESP32 ایک طاقتور مائیکروکنٹرولر ہے جس میں بلٹ ان Wi-Fi اور Bluetooth موجود ہے، جو اسے انٹرنیٹ آف تھنگز (IoT) ایپلیکیشنز کے لیے مثالی بناتا ہے۔ اس سیٹ اپ میں، ہم درجہ حرارت کی پیمائش کے لیے NTC تھرمسٹر، ریڈنگز کو متحرک کرنے کے لیے ایک پش بٹن، اور اسٹیٹس ظاہر کرنے کے لیے ایک LED استعمال کریں گے۔ ڈیٹا HiveMQ پر بھیجا جائے گا، جو ایک مقبول MQTT بروکر ہے، جہاں اسے ریموٹ طور پر رسائی حاصل کی جا سکتی ہے (ویڈیو میں 00:45 پر)۔

esp32-47-mqt-2

ہارڈویئر کی وضاحت

اس پروجیکٹ کے لیے، ہم درج ذیل اجزاء استعمال کریں گے:

  • 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 بروکر کی تفصیلات کی تصدیق کریں۔

وائرنگ ہدایات

esp32-47-mqtt-wiring

اجزاء کو وائر کرنے کے لیے، NTC تھرمسٹر کو جوڑ کر شروع کریں۔ تھرمسٹر کے ایک پن کو ESP32 پر 3.3 V سپلائی سے جوڑیں۔ دوسرا پن ESP32 کے پن 36 سے جڑتا ہے، اور اسے 10 kΩ ریزسٹر سے بھی جوڑنا چاہیے، جو پھر گراؤنڈ سے جڑتا ہے۔ یہ ایک وولٹیج ڈیوائیڈر بناتا ہے جو ESP32 کو تھرمسٹر کی مزاحمت پڑھنے کی اجازت دیتا ہے۔

اگلا، LED کو جوڑیں۔ LED کا لمبا پن (اینوڈ) ESP32 کے پن 4 سے 220 Ω ریزسٹر کے ذریعے جڑتا ہے، جبکہ چھوٹا پن (کیتھوڈ) گراؤنڈ سے جڑتا ہے۔ پش بٹن کے لیے، ایک طرف 3.3 V سے اور دوسری طرف ESP32 کے پن 14 سے جوڑیں۔ مزید برآں، بٹن پن سے گراؤنڈ تک ایک 10 kΩ ریزسٹر جوڑیں تاکہ بٹن دبائے جانے پر مستحکم LOW اسٹیٹ یقینی بنایا جا سکے۔

مطلوبہ لائبریری انسٹال کریں

یہاں PubSubClient لائبریری استعمال کی گئی ہے، آپ اسے لائبریری مینیجر سے انسٹال کر سکتے ہیں۔

esp32-47-mqtt-library

کوڈ مثالیں اور واک تھرو

سیٹ اپ میں، ہم سیریل کمیونیکیشن کو انیشیالائز کرتے ہیں، 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 فری بروکر کا مظاہرہ

تصاویر

esp32-47-mqt-1
esp32-47-mqt-1
esp32-47-mqt-2
esp32-47-mqt-2
esp32-47-mqtt-library
esp32-47-mqtt-library
esp32-47-mqtt-wiring
esp32-47-mqtt-wiring
847-ESP32 Tutorial 46/55- Arduino code for IoT Communication with MQTT
زبان: C++
/*********
  :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);
    }
  }
}

وسائل اور حوالہ جات

فائلیں📁

کوئی فائلیں دستیاب نہیں ہیں۔