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 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).
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

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.
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
/*********
: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
Kheyraadka & Tixraacyada
-
DukumentiESP32 Tutorial 46/55 - SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Faylasha📁
Fayl la'aan.