Raadi Koodka

Tutorial ESP32 46/55 - Kormeeridda Heerkulka Fog iyadoo la isticmaalayo HiveMQ MQTT | Qalabka ESP32 ee SunFounder

Tutorial ESP32 46/55 - Kormeeridda Heerkulka Fog iyadoo la isticmaalayo HiveMQ MQTT | Qalabka ESP32 ee SunFounder

Cashigarkani, waxaan ku samayn doonnaa nidaam kormeer heerkul ah oo fog, iyadoo la adeegsanayo ESP32 iyo borotokoolka MQTT. Mashruucani wuxuu noo ogolaanayaa inaan ku daabacno xogta heerkulka xarunta MQTT broker-ka, iyo inaan si fog u xakameyno LED-ka iyadoo la adeegsanayo interface web ah. Marka aad riixdo badhanka, waxaan u diri karnaa akhrinta heerkulka daruurta, waxaanan kaloo heli karnaa amarrada lagu shido ama lagu damiyo LED-ka.

esp32-47-mqt-1

ESP32 waa microcontroller awood badan oo leh Wi-Fi iyo Bluetooth ku dhex jira, taasoo ka dhigaysa mid ku habboon codsiyada Internet of Things (IoT). Qaabkan, waxaan u isticmaali doonnaa NTC thermistor si aan u cabbirno heerkulka, badhan riixid ah si aan u kiciyo akhrinta, iyo LED si uu u muujiyo heerka. Xogta waxaa loo diri doonaa HiveMQ, oo ah MQTT broker caan ah, halkaas oo laga heli karo si fog (fiidiyowga 00:45).

esp32-47-mqt-2

Qalabka La Sharaxay

Mashruucan, waxaan u isticmaali doonnaa qaybaha soo socda:

  • ESP32 Microcontroller: Guddigani wuxuu u shaqeeyaa sidii xarunta habaynta, isagoo maamulaya xiriirada Wi-Fi iyo isgaarsiinta MQTT.
  • NTC Thermistor: Dareemaha heerkulkan wuxuu beddelaa iska caabbintiisa iyadoo ku xiran heerkulka. Wuxuu bixiyaa signal analog ah oo ESP32 uu akhrin karo si uu u go'aamiyo heerkulka hadda jira.
  • LED: Nalka iftiinka leh waxaa loo isticmaali doonaa inuu muujiyo heerka iyadoo ku xusan amarrada laga helo MQTT.
  • Badhan Riixid: Badhankani wuxuu kiciyaa ESP32 si uu u akhriyo heerkulka oo uu u daabaco MQTT broker-ka.

Faahfaahinta Xogta

Soo saaraha SunFounder
Nambarka qaybta ESP32
Danabka Logic/IO 3.3 V
Danabka sahayda 5 V (via USB)
Qulqulka soo saarka (kanal kasta) 12 mA ugu badnaan
Hagaha soo noqnoqoshada PWM Ilaa 40 kHz
Heerarka caadiga ah ee gelinta 0.3 V (hoose), 2.4 V (sare)
Xadka kulaylka -40 ilaa 85 °C
Baakad ESP32-WROOM-32

 

  • Hubi heerarka danabka si aad uga fogaato waxyeelada.
  • Isticmaal resistors-ka kor u qaada ee badhanka riixida si aad u hubiso akhrin deggan.
  • Capacitors-ka kala goynta ayaa kaa caawin kara xasilinta sahayda korontada.
  • Ka digtoonow fiilooyinka thermistor-ka si aad uga fogaato akhrin khaldan.
  • Hubi faahfaahinta MQTT broker-kaaga si aad ugu guulaysato xirirka.

Tilmaamaha Fiilooyinka

esp32-47-mqtt-wiring

Si aad u xirto qaybaha, ku bilow isku xirka NTC thermistor-ka. Ku xir hal biin oo thermistor-ka ah sahayda 3.3 V ee ESP32-ga. Biinka kale wuxuu ku xirmaa biin 36 ee ESP32-ga, wuxuuna sidoo kale ku xirmayaa resistor 10 kΩ ah, kaas oo markaas ku xirma dhulka. Tani waxay abuurtaa qaybiye danab ah oo u oggolaanaya ESP32-ga inuu akhriyo iska caabbinta thermistor-ka.

Marka xigta, ku xir LED-ka. Biinka dheer (anode) ee LED-ka wuxuu ku xirmaa biin 4 ee ESP32-ga iyadoo loo marayo resistor 220 Ω ah, halka biinka gaaban (cathode) uu ku xirmaa dhulka. Badhanka riixida, ku xir hal dhinac 3.3 V iyo dhinaca kale biin 14 ee ESP32-ga. Intaa waxaa dheer, ku xir resistor 10 kΩ ah oo ka yimaada biinka badhanka ilaa dhulka si loo hubiyo heer hoose oo deggan marka badhanka aan la riixin.

Ku rakib maktabadda loo baahan yahay

Maktabadda PubSubClient ayaa halkan loo isticmaalay, waxaad ka rakibi kartaa Maareeyaha Maktabadda.

esp32-47-mqtt-library

Tusaalooyinka Koodka & Sharaxaad

Qaabaynta, waxaan bilaabaynaa isgaarsiinta serial-ka, waxaan dejinaynaa xirirka Wi-Fi, waxaanan qaabaynaynaa server-ka MQTT. Halkan waxaa ah qayb ka mid ah koodka qaabaynta:

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

Qaybtani waxay dejisaa xirirka shabakadda Wi-Fi waxayna qaabaysaa server-ka MQTT. Hababka biinanka ee badhanka iyo LED-ka ayaa sidoo kale halkan lagu qaabeeyaa.

Hawsha loop-ka waxay si joogto ah u hubisaa heerka badhanka waxayna daabacdaa xogta heerkulka marka la riixo. Halkan waxaa ah qayb kooban oo ka mid ah loop-ka:

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

Loop-kan, waxaan hubinaynaa haddii ESP32 uu ku xiran yahay MQTT broker-ka. Haddii badhanka la riixo, wuxuu akhriyaa heerkulka thermistor-ka wuxuuna u daabacaa mawduuca "SF/TEMP" kasta 5 ilbiriqsi.

Muuqaal / Waxa Laga Filan Karo

Marka hawgu hawlgalka la sameeyo oo uu shaqeynayo, riixida badhanka waxay ku daabici doontaa heerkulka hadda jira MQTT broker-ka. Waxaad kala socon kartaa xogtan qalab kasta oo MQTT ah. Intaa waxaa dheer, waxaad diri kartaa fariimo si aad u xakamayso LED-ga; dirista "on" waxay ifin doontaa, halka "off" ay demin doonto. Fiiri habdhaqanka la filayo fiidiyowga 15:30, halkaas oo akhrinta heerkulka lagu muujiyo ka dib riixitaan kasta oo badhanka ah.

Waqtiyada Fiidiyowga

  • 00:00 Bilow
  • 2:05 Hordhaca mashruuca
  • 7:06 Adeegga HiveMQ ee bilaashka ah
  • 7:56 Sharaxaadda fiilooyinka
  • 11:11 Sharaxaadda koodka Arduino
  • 18:46 Doorashada guddiga ESP32 iyo dekedda COM ee Arduino IDE
  • 20:30 Tusaalaynta HiveMQ Free broker-ka

Sawirro

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

Kheyraadka & Tixraacyada

Faylasha📁

Fayl la'aan.