آموزش ESP32 46/55 - نظارت بر دما از راه دور با استفاده از HiveMQ MQTT | کیت ESP32 سنفاندر
در این آموزش، ما یک سیستم نظارت بر دما از راه دور با استفاده از ESP32 و پروتکل MQTT ایجاد خواهیم کرد. این پروژه به ما این امکان را میدهد که دادههای دما را به یک کارگزار MQTT منتشر کنیم و یک LED را بهطور از راه دور با استفاده از یک رابط وب کنترل کنیم. با فشار دادن یک دکمه، میتوانیم قرائتهای دما را به ابری ارسال کنیم و همچنین میتوانیم دستورات روشن یا خاموش کردن LED را دریافت کنیم.
ESP32 یک میکروکنترلر قدرتمند است که دارای Wi-Fi و Bluetooth داخلی است و آن را برای برنامههای اینترنت اشیاء (IoT) ایدهآل میسازد. در این تنظیمات، ما از یک ترمیستور NTC برای اندازهگیری دما، یک دکمه فشار برای شروع خوانشها و یک LED برای نشاندادن وضعیت استفاده خواهیم کرد. دادهها به HiveMQ، یک کارگزار MQTT محبوب، ارسال میشود، جایی که میتوان بهصورت از راه دور به آن دسترسی پیدا کرد (در ویدئو در ۰۰:۴۵).
توضیح سختافزار
برای این پروژه، ما از اجزای زیر استفاده خواهیم کرد:
- میکروکنترولر ESP32:این بورد به عنوان واحد پردازش مرکزی عمل میکند و اتصالات Wi-Fi و ارتباطات MQTT را مدیریت میکند.
- ترمیستور NTC:این حساس(حس کننده) دما بر اساس دما مقاومت خود را تغییر میدهد. این حساس(حس کننده) یک سیگنال آنالوگ ارائه میدهد که ESP32 میتواند آن را بخواند تا دمای فعلی را تعیین کند.
- ال ای دی:این دیود ساطعکننده نور برای نشان دادن وضعیت بر اساس دستورات دریافتی از طریق MQTT استفاده خواهد شد.
- دکمه را فشار دهید:این دکمه باعث میشود ESP32 دما را خوانده و آن را به کارگزار MQTT منتشر کند.
جزئیات برگه اطلاعات
| تولید کننده | سان فاندور |
|---|---|
| شماره قطعه | ESP32 |
| ولتاژ منطقی/ورودی و خروجی | 3.3 ولت |
| ولتاژ تأمین | ۵ ولت (از طریق USB) |
| جریان خروجی (به ازای هر کانال) | 12 میلیآمپر حداکثر |
| راهنمایی فرکانس PWM | تا ۴۰ کیلوهرتز |
| آستانههای منطقی ورودی | ۰.۳ ولت (پایین)، ۲.۴ ولت (بالا) |
| محدودیتهای حرارتی | -40 تا 85 درجه سانتیگراد |
| بسته | ESP32-WROOM-32 |
- تنظیم سطوح ولتاژ مناسب برای جلوگیری از آسیب.
- از مقاومتهای Pull-up برای دکمه فشار استفاده کنید تا خوانشهای پایداری داشته باشید.
- خازنهای جداکننده میتوانند به تثبیت منبع تغذیه کمک کنند.
- در مورد سیمکشی ترمیستور احتیاط کنید تا از اشتباه در قرائتها جلوگیری شود.
- جزئیات کارگزار MQTT خود را برای اتصال موفق بررسی کنید.
دستورالعملهای سیمکشی

برای سیمکشی اجزا، ابتدا شروع به اتصال ترمیستور NTC کنید. یک پایه ترمیستور را به منبع 3.3 ولت روی ESP32 متصل کنید. پایه دیگر به پایه 36 روی ESP32 متصل میشود و باید به یک مقاومت 10 کΩ نیز متصل شود که بعداً به زمین متصل میشود. این یک تقسیمکننده ولتاژ ایجاد میکند که به ESP32 اجازه میدهد مقاومت ترمیستور را بخواند.
سپس LED را متصل کنید. پایه بلندتر (آند) LED به پایه ۴ بر روی ESP32 از طریق یک مقاومت ۲۲۰ Ω متصل میشود، در حالی که پایه کوتاهتر (کاتد) به زمین متصل میشود. برای دکمه فشار، یک سمت را به ۳.۳ ولت و سمت دیگر را به پایه ۱۴ بر روی ESP32 متصل کنید. علاوه بر این، یک مقاومت ۱۰ کΩ از پایه دکمه به زمین متصل کنید تا وضعیت LOW پایداری را زمانی که دکمه فشردنی نیست، تضمین کند.
کتابخانه مورد نیاز را نصب کنید
متن:PubSubClientکتابخانه در اینجا استفاده میشود، میتوانید آن را از نصب کنیدمدیر کتابخانه.
نمونههای شِفر (کود) و راهنمایی
در راهاندازی، ارتباط سریال را راهاندازی میکنیم، اتصال 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 متصل است یا خیر. اگر دکمه فشار داده شود، دما را از ترمیستور خوانده و هر ۵ ثانیه آن را به موضوع "SF/TEMP" منتشر میکند.
نمایشگاه / چه انتظاری باید داشته باشید
زمانی که پروژه راهاندازی و بهکار افتاد، فشردن دکمه دمای کنونی را به کارگزار MQTT ارسال خواهد کرد. شما میتوانید این دادهها را از هر کلاینت MQTT نظارت کنید. علاوه بر این، میتوانید پیامهایی برای کنترل LED ارسال کنید؛ ارسال "روشن" آن را روشن میکند، در حالی که "خاموش" آن را خاموش میکند. برای مشاهده رفتار مورد انتظار به ویدیو در ساعت 15:30 توجه کنید، جایی که قرائتهای دما پس از هر فشردن دکمه نمایش داده میشود.
زمانبندی ویدیو
- ۰۰:۰۰ شروع
- ۲:۰۵ مقدمهای بر پروژه
- 7:06 خدمات رایگان HiveMQ
- ۷:۵۶ توضیحات سیمکشی
- 11:11 توضیح شِفر (کود) آردوینو
- انتخاب بورد ESP32 و پورت COM در Arduino IDE در ساعت ۱۸:۴۶
- ۲۰:۳۰ نمایش HiveMQ Free broker
/*
* :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>
// متغیرهای بعدی را با ترکیب SSID/Password خود جایگزین کنید.
const char* ssid = "SSID";
const char* password = "PASSWORD";
// آدرس سرور MQTT خود را وارد کنید، به عنوان مثال:
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
const int ledPin = 4;
const int buttonPin = 14;
// هنگامی که به WIFI متصل میشوید، فقط پایههای ۳۶ ۳۹ ۳۴ ۳۵ ۲ ۳ میتوانند برای خواندن آنالوگ استفاده شوند.
// تعریف ثوابت
const int thermistorPin = 36; // پایه متصل به ترمیستور
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // مقدار مقاومت (10k)
const float beta = 3950; // مقدار بتا (مقدار معمولی)
const float nominalTemperature = 25; // دمای اسمی برای محاسبه ضریب دما
const float nominalResistance = 10000; // مقدار مقاومت در دمای اسمی
void setup() {
Serial.begin(115200);
// تنظیمات پیشفرض
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void setup_wifi() {
delay(10);
// ما با اتصال به یک شبکه WiFi شروع میکنیم.
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();
// اگر پیامی در موضوع "SF/LED" دریافت شود، بررسی میکنید که آیا پیام "روشن" یا "خاموش" است.
// وضعیت خروجی را بر اساس پیام تغییر میدهد
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() {
// تا زمانی که دوباره متصل نشویم، حلقه بزنید
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// تلاش برای اتصال
if (client.connect(unique_identifier)) {
Serial.println("connected");
// اشتراک گذاری
client.subscribe("SF/LED");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// ۵ ثانیه قبل از تلاش دوباره صبر کنید
delay(5000);
}
}
}
float thermistor() {
int adcValue = analogRead(thermistorPin); // خواندن مقدار ADC
float voltage = (adcValue * referenceVoltage) / 4095.0; // محاسبه ولتاژ
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // مقاومت ترمیستور را با پیکربندی بهروز محاسبه کنید
// دمای موردنظر را با استفاده از معادله پارامتر بتا محاسبه کنید.
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
float tempC = tempK - 273.15; // دمای Celsius را بگیرید
float tempF = 1.8 * tempC + 32.0; // دما را به فارنهایت بگیرید
// دما را چاپ کن
Serial.print("Temp: ");
Serial.println(tempC);
delay(200); // منتظر 200 میلیثانیه باشید
return tempC;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// اگر دکمه فشار داده شود، دما را به عنوان موضوع "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
منابع و مراجع
-
مستنداتآموزش ESP32 ۴۶/۵۵- صفحه مستندات SunFounder برای ارتباط IoT با MQTTdocs.sunfounder.com
فایلها📁
هیچ فایلی موجود نیست.