Èkọ́ 46/55 ESP32 - Àtúnyẹ̀wò Ìwọ̀n Ooru Lọ́nà Jíjìn nípa lílo HiveMQ MQTT | Àkójọpọ̀ ESP32 ti SunFounder
Nínú ẹ̀kọ́ yìí, a óò ṣẹ̀dá ètò ìṣàkóso ìwọ̀n-otútù láti ọ̀nà jíjìn nípa lílo ESP32 àti ìlànà MQTT. Iṣẹ́ yìí gbà wá láyè láti tẹ̀ ìwọ̀n-otútù jáde sí olùpèsè MQTT kan àti láti darí LED kan láti ọ̀nà jíjìn nípa lílo ojú-ojú wẹ́bù kan. Nípa títẹ̀ bọ́tìnnì kan, a lè rán àwọn ìwọ̀n-otútù sí àwọsánmọ̀, a sì tún lè gba àwọn àṣẹ láti tan LED náà tàbí pa á.
ESP32 jẹ́ ẹ̀rọ-ìṣàkóso alágbára kan tí ó ní Wi-Fi àti Bluetooth nínú ara rẹ̀, tí ó mú un dára fún àwọn ohun èlò Internet of Things (IoT). Nínú ìtòlẹ́yọ̀ yìí, a óò lo thermistor NTC kan láti díwọ̀n otútù, bọ́tìnnì títẹ̀ kan láti mú àwọn ìwọ̀n jáde, àti LED kan láti fi ìpòlówó hàn. A óò fi àwọn ìwọ̀n náà rán sí HiveMQ, olùpèsè MQTT olókìkí kan, níbi tí a ti lè wọ̀ ọ́ wọlé láti ọ̀nà jíjìn (nínú fídíò ní 00:45).
Àlàyé Ohun Èlò
Fún iṣẹ́ yìí, a óò lo àwọn ẹ̀yà wọ̀nyí:
- ESP32 Microcontroller: Bíọ́dù yìí ṣiṣẹ́ gẹ́gẹ́ bí ẹ̀yà àárín tí ń ṣiṣẹ́, tí ń bójú tó àwọn ìsopọ̀ Wi-Fi àti àwọn ìbánisọ̀rọ̀ MQTT.
- NTC Thermistor: Ẹ̀rọ-ìwọ̀n-otútù yìí ń yí ìdènà rẹ̀ padà ní ìbámu pẹ̀lú otútù. Ó ń pèsè àmì analog kan tí ESP32 lè kà láti mọ otútù tí ó wà lọ́wọ́lọ́wọ́.
- LED: Ẹ̀rọ-ìmọ́lẹ̀ yìí ni a óò lò láti fi ìpòlówó hàn ní ìbámu pẹ̀lú àwọn àṣẹ tí a gbà nípasẹ̀ MQTT.
- Bọ́tìnnì Títẹ̀: Bọ́tìnnì yìí yóò mú ESP32 kà otútù náà kí ó sì tẹ̀ ẹ́ jáde sí olùpèsè MQTT.
Àwọn Àlàyé Datasheet
| Olùṣe | SunFounder |
|---|---|
| Nọ́mbà ẹ̀yà | ESP32 |
| Fóltì Logic/IO | 3.3 V |
| Fóltì ìpèsè | 5 V (nípasẹ̀ USB) |
| Ìwọ̀n-ìjàde (fún ikanni kọ̀ọ̀kan) | 12 mA tó pọ̀jù |
| Ìtọ́sọ́nà ìgbohùnsáfẹ́fẹ́ PWM | Títí di 40 kHz |
| Àwọn ìpele ìwọ̀n-ìkólogi | 0.3 V (rẹ̀lẹ̀), 2.4 V (ga) |
| Àwọn ìwọ̀n-ìgbóná | -40 sí 85 °C |
| Ìpako | ESP32-WROOM-32 |
- Rí i dájú pé àwọn ìpele fóltì tọ́ láti yẹra fún ìbàjẹ́.
- Lo àwọn resistor ìfà-sókè fún bọ́tìnnì títẹ̀ náà láti rí i dájú pé àwọn ìwọ̀n dúró ṣinṣin.
- Àwọn capacitor ìyàsọ́tọ̀ lè ran lọ́wọ́ láti mú ìpèsè agbára dúró ṣinṣin.
- Ṣọ́ra pẹ̀lú ìsopọ̀ thermistor náà láti yẹra fún àwọn ìwọ̀n tí kò tọ́.
- Rí i dájú pé àwọn àlàyé olùpèsè MQTT rẹ tọ́ fún ìsopọ̀ àṣeyọrí.
Àwọn Ìtọ́sọ́nà Ìsopọ̀

Láti so àwọn ẹ̀yà pọ̀, bẹ̀rẹ̀ nípa sísopọ̀ thermistor NTC náà. So ọ̀kan nínú àwọn ẹsẹ̀ thermistor náà sí ìpèsè 3.3 V lórí ESP32. Ẹsẹ̀ kejì so sí pin 36 lórí ESP32, ó sì yẹ kí ó tún so sí resistor 10 kΩ kan, tí a óò sì so èyí sí ilẹ̀. Èyí dá ìpín-ìmú-fóltì kan tí ó jẹ́ kí ESP32 kà ìdènà thermistor náà.
Nígbà tí ó tẹ̀ síwájú, so LED náà. Ẹsẹ̀ gígùn (anode) ti LED náà so sí pin 4 lórí ESP32 nípasẹ̀ resistor 220 Ω kan, nígbà tí ẹsẹ̀ kúkúrú (cathode) so sí ilẹ̀. Fún bọ́tìnnì títẹ̀ náà, so ẹ̀gbẹ́ kan sí 3.3 V àti ẹ̀gbẹ́ kejì sí pin 14 lórí ESP32. Ní àfikún, so resistor 10 kΩ kan láti pin bọ́tìnnì náà sí ilẹ̀ láti rí i dájú pé ìpòlówó LOW dúró ṣinṣin nígbà tí a kò tẹ bọ́tìnnì náà.
Fi Ìkàwé Tí A Nílò Sọ̀rọ̀
Ìkàwé PubSubClient ni a lò níbí, o lè fi í sílẹ̀ láti inú Library Manager.
Àwọn Àpẹẹrẹ Kóòdù & Ìtọ́sọ́nà
Nínú ìtòlẹ́yọ̀ náà, a bẹ̀rẹ̀ ìbánisọ̀rọ̀ serial, a ṣètò ìsopọ̀ Wi-Fi, a sì ṣètò olùpèsè MQTT. Èyí ni àpẹẹrẹ kóòdù ìtòlẹ́yọ̀:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
Apá kóòdù yìí dá ìsopọ̀ sí nẹ́tíwọọkì Wi-Fi àti ṣètò olùpèsè MQTT. Àwọn ìpòlówó pin fún bọ́tìnnì àti LED ni a tún ṣètò níbí.
Ìṣiṣẹ́ loop ń ṣàyẹ̀wò ìpòlówó bọ́tìnnì nígbà gbogbo, ó sì ń tẹ̀ ìwọ̀n-otútù jáde nígbà tí a bá tẹ ẹ́. Èyí ni àyọkà kan láti inú loop:
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);
}
}
}
Nínú loop yìí, a ṣàyẹ̀wò bí ESP32 bá ti sopọ̀ sí olùpèsè MQTT. Bí a bá tẹ bọ́tìnnì náà, ó kà otútù láti inú thermistor, ó sì tẹ̀ ẹ́ jáde sí kókó-ọ̀rọ̀ "SF/TEMP" ní gbogbo ìṣẹ́jú àáyá 5.
Ìfihàn / Ohun Tí O Lè Retí
Nígbàtí a ṣètò iṣẹ́ náà tí ó sì ń ṣiṣẹ́, títẹ bọ́tìì náà yóò tẹ̀ jáde ìwọ̀n otútù lọ́wọ́lọ́wọ́ sí olùpín MQTT. O lè ṣàkíyèsí data yìí láti ọ̀dọ̀ olùpín MQTT èyíkéyìí. Ní àfikún, o lè fi àwọn ifiranṣẹ́ ránṣẹ́ láti ṣàkóso LED; fífi "on" ránṣẹ́ yóò mú un tàn, nígbàtí "off" yóò pa á. Wò fún ìwà tí a retí nínú fídíò ní 15:30, níbi tí a ti fi àwọn ìwọ̀n otútù hàn lẹ́yìn títẹ bọ́tìì kọ̀ọ̀kan.
Àwọn Àkókò Fídíò
- 00:00 Ìbẹ̀rẹ̀
- 2:05 Ìfihàn sí iṣẹ́ náà
- 7:06 Iṣẹ́ HiveMQ Ọ̀fẹ́
- 7:56 Àlàyé nípa ìsopọ̀ oníná
- 11:11 Àlàyé kóòdù Arduino
- 18:46 Yíyan bọ́ọ̀dù ESP32 àti ibùdó COM nínú Arduino IDE
- 20:30 Ìfihàn olùpín HiveMQ Free
/*********
: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
Orisun & itọkasi
-
Iwe-ẹriESP32 Tutorial 46/55 - SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Fáìlìs📁
Ko si awọn faili ti o wa.