ኮድ ይፈልጉ

የESP32 ትምህርት 46/55 - የርቀት ሙቀት መከታተያ በHiveMQ MQTT በመጠቀም | የSunFounder የESP32 ኪት

የESP32 ትምህርት 46/55 - የርቀት ሙቀት መከታተያ በHiveMQ MQTT በመጠቀም | የSunFounder የESP32 ኪት

በዚህ አጋዥ ስልጠና ውስጥ፣ ESP32 እና MQTT ፕሮቶኮልን በመጠቀም የርቀት የሙቀት መቆጣጠሪያ ስርዓት እንፈጥራለን። ይህ ፕሮጀክት የሙቀት መረጃን ወደ MQTT ብሮከር እንድንልክ እና ኤልኢዲን በድር በይነገጽ በመጠቀም በርቀት እንድንቆጣጠር ያስችለናል። አንድ ቁልፍ በመጫን፣ የሙቀት መለኪያዎችን ወደ ደመና መላክ እንችላለን፣ እንዲሁም ኤልኢዲውን ለማብራት ወይም ለማጥፋት ትዕዛዞችን መቀበል እንችላለን።

esp32-47-mqt-1

ESP32 አብሮ የተሰራ ዋይ ፋይ እና ብሉቱዝ ያለው ኃይለኛ ማይክሮ መቆጣጠሪያ ነው፣ ይህም ለኢንተርኔት ኦፍ ዘንግስ (አይኦቲ) አፕሊኬሽኖች ተስማሚ ያደርገዋል። በዚህ ዝግጅት ውስጥ፣ የሙቀት መጠንን ለመለካት NTC ቴርሚስተርን፣ ንባቦችን ለማስነሳት የግፊት ቁልፍን እና ሁኔታን ለማመልከት ኤልኢዲን እንጠቀማለን። መረጃው ወደ HiveMQ፣ ታዋቂ የMQTT ብሮከር፣ ይላካል፣ እዚያም በርቀት መድረስ ይቻላል (በቪዲዮ በ00:45)።

esp32-47-mqt-2

ሃርድዌር ተብራርቷል

ለዚህ ፕሮጀክት፣ የሚከተሉትን ክፍሎች እንጠቀማለን፦

  • ESP32 ማይክሮ መቆጣጠሪያ፦ ይህ ቦርድ የዋይ ፋይ ግንኙነቶችን እና የMQTT ግንኙነቶችን በመያዝ እንደ ማዕከላዊ ማቀነባበሪያ ክፍል ያገለግላል።
  • NTC ቴርሚስተር፦ ይህ የሙቀት ዳሳሽ በሙቀት መጠን ላይ ተመስርቶ ተቃውሞውን ይለውጣል። የአሁኑን የሙቀት መጠን ለመወሰን ESP32 ሊያነበው የሚችለውን የአናሎግ ምልክት ይሰጣል።
  • ኤልኢዲ፦ ይህ የብርሃን አመንጪ ዳዮድ በMQTT በኩል በተቀበሉት ትዕዛዞች ላይ ተመስርቶ ሁኔታን ለማመልከት ያገለግላል።
  • የግፊት ቁልፍ፦ ይህ ቁልፍ ESP32 የሙቀት መጠኑን እንዲያነብ እና ወደ MQTT ብሮከር እንዲልክ ያስነሳዋል።

የዳታሼት ዝርዝሮች

አምራች SunFounder
የክፍል ቁጥር ESP32
የሎጂክ/አይኦ ቮልቴጅ 3.3 ቪ
የአቅርቦት ቮልቴጅ 5 ቪ (በዩኤስቢ በኩል)
የውጤት ጅረት (በአንድ ቻናል) 12 ሚኤ ከፍተኛ
የPWM ድግግሞሽ መመሪያ እስከ 40 ኪሎሄርትዝ
የግቤት ሎጂክ ገደቦች 0.3 ቪ (ዝቅተኛ)፣ 2.4 ቪ (ከፍተኛ)
የሙቀት ገደቦች -40 እስከ 85 ዲግሪ ሴልሺየስ
ፓኬጅ ESP32-WROOM-32

 

  • ጉዳትን ለማስቀረት ትክክለኛ የቮልቴጅ ደረጃዎችን ያረጋግጡ።
  • የተረጋጋ ንባቦችን ለማረጋገጥ ለግፊት ቁልፍ የመጎተት ተከላካዮችን (pull-up resistors) ይጠቀሙ።
  • የኃይል አቅርቦትን ለማረጋጋት የመለያያ መያዣዎች (decoupling capacitors) ሊረዱ ይችላሉ።
  • የተሳሳቱ ንባቦችን ለማስቀረት በቴርሚስተር ሽቦ ላይ ጠንቃቃ ይሁኑ።
  • ለተሳካ ግንኙነት የMQTT ብሮከር ዝርዝሮችዎን ያረጋግጡ።

የሽቦ መመሪያዎች

esp32-47-mqtt-wiring

ክፍሎቹን ለማገናኘት፣ NTC ቴርሚስተርን በማገናኘት ይጀምሩ። የቴርሚስተሩን አንድ ፒን በESP32 ላይ ካለው 3.3 ቪ አቅርቦት ጋር ያገናኙ። ሌላኛው ፒን በESP32 ላይ ካለው ፒን 36 ጋር ይገናኛል፣ እንዲሁም ከመሬት ጋር ከሚገናኝ 10 ኪሎ ኦም ተከላካይ ጋር መገናኘት አለበት። ይህ የቮልቴጅ መከፋፈያ ይፈጥራል፣ ይህም ESP32 የቴርሚስተሩን ተቃውሞ እንዲያነብ ያስችለዋል።

በመቀጠል፣ ኤልኢዲውን ያገናኙ። የኤልኢዲው ረጅሙ ፒን (አኖድ) በ220 ኦም ተከላካይ በኩል በESP32 ላይ ካለው ፒን 4 ጋር ይገናኛል፣ አጭሩ ፒን (ካቶድ) ደግሞ ከመሬት ጋር ይገናኛል። ለግፊት ቁልፍ፣ አንዱን ጎን ከ3.3 ቪ እና ሌላኛውን ጎን በESP32 ላይ ካለው ፒን 14 ጋር ያገናኙ። በተጨማሪም፣ ቁልፉ በማይጫንበት ጊዜ የተረጋጋ ዝቅተኛ (LOW) ሁኔታን ለማረጋገጥ ከቁልፍ ፒን ወደ መሬት 10 ኪሎ ኦም ተከላካይ ያገናኙ።

የሚፈለገውን ቤተ-መጻሕፍት ይጫኑ

PubSubClient ቤተ-መጻሕፍት እዚህ ጥቅም ላይ ይውላል፣ ከቤተ-መጻሕፍት አስተዳዳሪ ሊጭኑት ይችላሉ።

esp32-47-mqtt-library

የኮድ ምሳሌዎች እና ማብራሪያ

በማዋቀሩ ውስጥ፣ ተከታታይ ግንኙነትን እንጀምራለን፣ የዋይ ፋይ ግንኙነትን እናዘጋጃለን፣ እና የMQTT አገልጋይን እናዋቅራለን። የማዋቀር ኮድ ክፍል እነሆ፦

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

ይህ የኮድ ክፍል ከዋይ ፋይ አውታረ መረብ ጋር ግንኙነትን ያቋቁማል እና የ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 ደንበኛ መከታተል ይችላሉ። በተጨማሪም ኤልኢዲውን ለመቆጣጠር መልዕክቶችን መላክ ይችላሉ; "on" መላክ ያበራል, "off" መላክ ደግሞ ያጠፋል። በቪዲዮው በ15:30 ላይ የሚጠበቀውን ባህሪ ይመልከቱ, እዚያ ላይ የሙቀት መጠን ንባቦች ከእ প্রতিটি ቁልፍ መጫን በኋላ ይታያሉ።

የቪዲዮ ጊዜ ምልክቶች

  • 00:00 መጀመሪያ
  • 2:05 ለፕሮጀክቱ መግቢያ
  • 7:06 ነፃ የHiveMQ አገልግሎት
  • 7:56 የሽቦ አያያዝ ተብራርቷል
  • 11:11 የአርዱኖ ኮድ ተብራርቷል
  • 18:46 በአርዱኖ 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);
    }
  }
}

ምንጮች እና ምንጮች

ፋይሎች📁

አንድ ፋይል የለም።