در این پست قصد داریم نحوه کنترل خروجی های ESP8266 و نمایش داده های سنسور از ESP8266 در Node-RED را به شما نشان دهیم. نرم افزار Node-RED بر روی Raspberry Pi اجرا می شود و ارتباط بین ESP8266 و نرم افزار Node-RED با پروتکل ارتباطی MQTT انجام می شود.
شکل زیر نمای کلی از کارهایی که در این آموزش انجام می دهیم را نشان می دهد.

نحوه کار پروژه
این ویدیو روی یوتیوب اپلود شده در صورت نیاز از تحریم شکن استفاده نمایید.
داشبورد Node-RED
قبل از هر چیز شما باید داشبورد Node-RED را در Raspberry Pi خود نصب کنید.
پروتکل MQTT
در این آموزش قصد داریم بین Raspberry Pi توسط نرم افزار Node-RED و ESP8266 با استفاده از پروتکل MQTT ارتباط برقرار کنیم.
MQTT مخفف MQ Telemetry Transport است و یک سیستم انتشار و اشتراک (Publish and Subscribe) سبک است که می توانید پیام ها را به عنوان client منتشر و دریافت کنید. این یک پروتکل پیام رسانی ساده است که برای دستگاه های محدود و با پهنای باند کم طراحی شده است. بنابراین، این راه حل عالی برای برنامه های کاربردی اینترنت اشیا است.
نصب بروکر Mosquitto
در MQTT، بروکر مسئول اصلی دریافت همه پیامها، فیلتر کردن پیامها، تصمیمگیری در مورد علاقهمند به آن و سپس انتشار پیام برای همه کلاینت های مشترک است.
چندین بروکر وجود دارد که می توانید از آنها استفاده کنید. در این آموزش قصد داریم از Mosquitto Broker استفاده کنیم که باید روی Raspberry Pi نصب شود.

تست
برای اینکه ببینید آیا بروکر Mosquitto با موفقیت نصب شده است، دستور زیر را اجرا کنید:
pi@raspberry:~ $ mosquitto -v
این نسخه Mosquitto را که در حال حاضر در Raspberry Pi شما در حال اجرا است، برمی گرداند. باید 1.4 یا بالاتر باشد.

توجه: دستور Mosquitto نسخه Mosquitto را که در حال حاضر نصب شده است برمی گرداند، اما همچنین سعی می کند دوباره Mosquitto را مقداردهی اولیه کند. از آنجایی که Mosquitto قبلاً در حال اجرا بوده است، یک پیام خطا رخ می دهد. در صورت مشاهده پیام نگران نباشید که Mosquitto به درستی نصب و اجرا می شود.
برقراری ارتباط MQTT با Node-RED
در این بخش می خواهیم با استفاده از گره های Node-RED یک ارتباط MQTT برقرار کنیم.
Dashboard Layout
اولین قدم ایجاد dashboard layout است. در این مثال، دکمه ای برای کنترل خروجی ESP8266 خواهیم داشت. یک نمودار و یک گیج برای نمایش دما و رطوبت از سنسور DHT11.
در گوشه سمت راست بالای پنجره Node-RED، زبانه Layout را در زیر تب داشبورد انتخاب کنید. یک برگه به نام Room ایجاد کنید و در داخل تب Room دو گروه Lamp و Sensor مانند شکل زیر ایجاد کنید.

Creating the Flow
گره های زیر را درگ کنید- شکل زیر :

- سوئیچ – این خروجی ESP8266 را کنترل می کند
- گره خروجی mqtt – بر اساس وضعیت سوئیچ، پیامی را به ESP8266 منتشر می کند
- گره های ورودی 2x mqtt – این گره ها مشترک موضوعات دما و رطوبت می شوند تا داده های حسگر را از ESP دریافت کنند.
- نمودار – قرائت سنسور دما را نمایش می دهد
- گیج – قرائت سنسور رطوبت را نمایش می دهد
Node-RED و بروکر MQTT باید متصل شوند. برای اتصال بروکر MQTT به Node-REd، روی گره خروجی MQTT دوبار کلیک کنید. یک پنجره جدید ظاهر می شود – همانطور که در شکل زیر نشان داده شده است.

روی گزینه Add new mqtt-broker کلیک کنید.
در قسمت سرور localhost را تایپ کنید

تمام تنظیمات دیگر به طور پیش فرض به درستی پیکربندی شده اند.
دکمه Add را فشار دهید و گره خروجی MQTT به طور خودکار به بروکر شما متصل می شود.
تمام خصوصیات گره های دیگر را همانطور که در شکل های زیر نشان داده شده است ویرایش کنید:
سوئیچ – سوئیچ وقتی روشن است یک پیام on ارسال می کند. و در صورت خاموش بودن یک پیام off ارسال می کند. این گره در تاپیک اتاق/لامپ publish خواهد شد. سپس ESP شما در این موضوع subscribe می شود تا پیام های آن را دریافت کند.

گره خروجی mqtt. این گره به mosquitto broker متصل است و در تاپیک اتاق/لامپ publish می شود.

گره ورودی mqtt. این گره در تاپیک اتاق/دما برای دریافت داده های سنسور دما از ESP8266 subscribe شده است. ESP8266 دما را در این topic منتشر خواهد کرد.

چارت. نمودار مقادیر دریافت شده در تاپیک اتاق/دما را نمایش می دهد.

گره ورودی mqtt. این گره برای دریافت اطلاعات سنسور رطوبت از ESP8266 در تاپیک اتاق/رطوبت subscribe است. ESP8266 رطوبت را در همین topic منتشر خواهد کرد.

gauge. مقادیر دریافت شده در تاپیک اتاق/رطوبت را نمایش می دهد.

گره های خود را همانطور که در شکل زیر نشان داده شده است سیم کشی کنید.

برنامه Node-RED شما آماده است. روی دکمه Deploy در گوشه سمت راست بالا کلیک کنید.
برای دیدن ظاهر داشبورد خود به http://your-pi-ip-address/ui بروید.
آماده سازی آردوینو IDE
ما ESP8266 را با استفاده از Arduino IDE برنامه ریزی می کنیم. برای آپلود کد در ESP8266 خود با استفاده از Arduino IDE، باید بردهای ESP8266 (نصب بردهای ESP8266 در آردوینو IDE (ویندوز – مک – لینوکس)) را نصب کنید. همچنین باید دو کتابخانه اضافی نصب کنید تا همه چیز برای ESP8266 خود آماده باشد.
نصب کتابخانه PubSubClient
کتابخانه PubSubClient یک کلاینت برای انجام publish/subscribe ساده با سروری که از MQTT پشتیبانی میکند، فراهم میکند (اساساً به ESP8266 شما اجازه میدهد با Node-RED صحبت کند).
- برای دانلود کتابخانه PubSubClient اینجا را کلیک کنید. شما باید یک پوشه .zip در پوشه Downloads خود داشته باشید
- پوشه .zip را از حالت فشرده خارج کنید و باید پوشه pubsubclient-master را دریافت کنید.
- نام پوشه خود را از pubsubclient-master به pubsubclient تغییر دهید
- پوشه pubsubclient را به پوشه کتابخانه های نصب Arduino IDE خود منتقل کنید
- سپس، Arduino IDE خود را دوباره باز کنید
این کتابخانه با تعدادی مثال نیز همراه است. به File > Examples > PubSubClient در نرم افزار Arduino IDE مراجعه کنید.
نصب کتابخانه سنسور DHT
کتابخانه سنسور DHT کار شما را برای استفاده از هر سنسور DHT برای خواندن دما و رطوبت با بردهای ESP8266 یا آردوینو را ساده تر می کند.
- برای دانلود کتابخانه سنسور DHT اینجا را کلیک کنید. شما باید یک پوشه .zip در پوشه Downloads خود داشته باشید
- پوشه .zip را از حالت فشرده خارج کنید و باید پوشه DHT-sensor-library-master را دریافت کنید.
- نام پوشه خود را از DHT-sensor-library-master به DHT تغییر دهید.
- پوشه DHT را به پوشه کتابخانه های نصب Arduino IDE خود منتقل کنید.
- سپس، Arduino IDE خود را دوباره باز کنید.
این کتابخانه با تعدادی مثال نیز همراه است. به File > Examples > DHT در نرم افزار Arduino IDE مراجعه کنید.
برای اطلاعات بیشتر در مورد سنسور DHT11 میتوانید مقاله:
“8 سنسور دما به همراه مشخصات و مقایسه آنها (DHT11,DHT22,LM3x,BMP180,TMP36,LM75,BME280,DS18B20)”
را مطالعه نمایید
انتخاب برد مناسب در Arduino IDE
همچنین باید برد مناسب را در Arduino IDE انتخاب کنید:
- به منو Tools بروید و NodeMCU 1.0 (ESP-12E Module) را انتخاب کنید.
- شماره پورت ESP خود را در قسمت Tools > Port انتخاب کنید.
آپلود کد
اکنون می توانید کد زیر را در ESP8266 خود آپلود کنید. این کد پیام های دما و رطوبت سنسور DHT11 را در مورد تاپیک های اتاق/دما و اتاق/رطوبت از طریق پروتکل MQTT منتشر می کند.
ESP در تاپیک اتاق/لامپ مشترک است تا پیام های منتشر شده در مورد آن موضوع توسط برنامه Node-RED را دریافت کند تا لامپ روشن یا خاموش شود.
داخل کد به خوبی در مورد جایی که باید تغییرات ایجاد کنید توضیح داده شده است. شما باید کد را با SSID، رمز عبور و آدرس IP RPi خود ویرایش کنید.
این کد همچنین با سایر سنسورهای DHT سازگار است – فقط کافی است برای انتخاب سنسور خود، خطوط مناسب کد را uncomment یا comment کنید.
/*****
All the resources for this project:
Home
*****/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// Uncomment one of the lines bellow for whatever DHT sensor type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
// Change the credentials below, so your ESP8266 connects to your router
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Change the variable to your Raspberry Pi IP address, so it connects to your MQTT broker
const char* mqtt_server = "REPLACE_WITH_YOUR_RPI_IP_ADDRESS";
// Initializes the espClient. You should change the espClient name if you have multiple ESPs running in your home automation system
WiFiClient espClient;
PubSubClient client(espClient);
// DHT Sensor - GPIO 5 = D1 on ESP-12E NodeMCU board
const int DHTPin = 5;
// Lamp - LED - GPIO 4 = D2 on ESP-12E NodeMCU board
const int lamp = 4;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);
// Timers auxiliar variables
long now = millis();
long lastMeasure = 0;
// Don't change the function below. This functions connects your ESP8266 to your router
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.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
// This functions is executed when some device publishes a message to a topic that your ESP8266 is subscribed to
// Change the function below to add logic to your program, so when a device publishes a message to a topic that
// your ESP8266 is subscribed you can actually do something
void callback(String 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();
// Feel free to add more if statements to control more GPIOs with MQTT
// If a message is received on the topic room/lamp, you check if the message is either on or off. Turns the lamp GPIO according to the message
if(topic=="room/lamp"){
Serial.print("Changing Room lamp to ");
if(messageTemp == "on"){
digitalWrite(lamp, HIGH);
Serial.print("On");
}
else if(messageTemp == "off"){
digitalWrite(lamp, LOW);
Serial.print("Off");
}
}
Serial.println();
}
// This functions reconnects your ESP8266 to your MQTT broker
// Change the function below if you want to subscribe to more topics with your ESP8266
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
/*
YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS
To change the ESP device ID, you will have to give a new name to the ESP8266.
Here's how it looks:
if (client.connect("ESP8266Client")) {
You can do it like this:
if (client.connect("ESP1_Office")) {
Then, for the other ESP:
if (client.connect("ESP2_Garage")) {
That should solve your MQTT multiple connections problem
*/
if (client.connect("ESP8266Client")) {
Serial.println("connected");
// Subscribe or resubscribe to a topic
// You can subscribe to more topics (to control more LEDs in this example)
client.subscribe("room/lamp");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// The setup function sets your ESP GPIOs to Outputs, starts the serial communication at a baud rate of 115200
// Sets your mqtt broker and sets the callback function
// The callback function is what receives messages and actually controls the LEDs
void setup() {
pinMode(lamp, OUTPUT);
dht.begin();
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
// For this project, you don't need to change anything in the loop function. Basically it ensures that you ESP is connected to your broker
void loop() {
if (!client.connected()) {
reconnect();
}
if(!client.loop())
client.connect("ESP8266Client");
now = millis();
// Publishes new temperature and humidity every 30 seconds
if (now - lastMeasure > 30000) {
lastMeasure = now;
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Computes temperature values in Celsius
float hic = dht.computeHeatIndex(t, h, false);
static char temperatureTemp[7];
dtostrf(hic, 6, 2, temperatureTemp);
// Uncomment to compute temperature values in Fahrenheit
// float hif = dht.computeHeatIndex(f, h);
// static char temperatureTemp[7];
// dtostrf(hif, 6, 2, temperatureTemp);
static char humidityTemp[7];
dtostrf(h, 6, 2, humidityTemp);
// Publishes Temperature and Humidity values
client.publish("room/temperature", temperatureTemp);
client.publish("room/humidity", humidityTemp);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t Heat index: ");
Serial.print(hic);
Serial.println(" *C ");
// Serial.print(hif);
// Serial.println(" *F");
}
}
پس از آپلود کد، و با اجرای Raspberry Pi برنامه Node-RED و بروکر Mosquitto، می توانید مانیتور سریال Arduino IDE را با نرخ باود 115200 باز کنید و ببینید چه اتفاقی می افتد.
این کار برای بررسی اینکه آیا ESP اتصال موفقیت آمیزی به روتر شما و بروکر Mosquitto برقرار کرده است لازم است. همچنین می توانید پیام هایی را که ESP دریافت و منتشر می کند را مشاهده کنید.

ساخت مدار
بخش های زیر به شما قطعات و شماتیک های مورد نیاز برای ساخت مدار این پروژه را نشان می دهد.
قطعات مورد نیاز
- Raspberry Pi
- ESP8266 (ESP-12E nodemcu)
- DHT11 temperature and humidity sensor
- Breadboard
- 330 Ω resistor
- LED
- 4700 Ω resistor
شماتیک
در اینجا شماتیک های مدار این پروژه آمده است.

نتیجه نهایی
تبریک می گویم! پروژه شما اکنون تکمیل شده است.
برای کنترل ESP با برنامه Node-RED به http://your-pi-ip-address/ui بروید. شما می توانید در هر مرورگری در همان شبکه ای که Pi خود را در آن قرار داده اید به برنامه خود دسترسی داشته باشید.
برنامه باید چیزی شبیه به شکل زیر باشد.

جمع بندی
در این آموزش، مفاهیم اولیه ای را به شما نشان داده ایم که به شما امکان می دهد با استفاده از Node-RED و پروتکل ارتباطی MQTT، خروجی ها و سنسورها را در ESP خود مانیتور و کنترل کنید. شما می توانید این مراحل اولیه را برای ساخت پروژه های پیشرفته تر ادامه دهید.
امیدواریم این آموزش برای شما مفید بوده باشد.
منبع: https://randomnerdtutorials.com/esp8266-and-node-red-with-mqtt