کوډ ولټوئ

د ESP32 ټیوټوریل 46/55 - د HiveMQ MQTT په کارولو سره د لرې واټن تودوخې څارنه | د SunFounder د ESP32 کټ

د ESP32 ټیوټوریل 46/55 - د HiveMQ MQTT په کارولو سره د لرې واټن تودوخې څارنه | د SunFounder د 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 اوږد پن (انود) د 220 Ω ریزسټر له لارې د ESP32 په پن 4 سره وصل کیږي، پداسې حال کې چې لنډ پن (کاتود) ځمکې ته نښلول کیږي. د فشارونکې تڼۍ لپاره، یو اړخ 3.3 V ته او بل اړخ د ESP32 په پن 14 سره وصل کړئ. برسیره پردې، د تڼۍ له پن څخه ځمکې ته د 10 kΩ ریزسټر وصل کړئ ترڅو کله چې تڼۍ فشار نه وي، د ټیټ (LOW) باثباته حالت ډاډمن شي.

اړین کتابتون نصب کړئ

د PubSubClient کتابتون دلته کارول کیږي، تاسو کولی شئ دا د کتابتون مدیر (Library Manager) څخه نصب کړئ.

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);
    }
  }
}

سرچینې او حوالې

فایلونه📁

هیڅ فایل شتون نلري.