ESP8266 NodeMCU MQTT – публикация показаний BME680: температура, влажность, давление и газ (Arduino IDE)
Узнайте, как публиковать показания датчика BME680 (температура, влажность, давление и качество воздуха газа) через MQTT с помощью ESP8266 NodeMCU на любую платформу, поддерживающую MQTT, или любой MQTT-клиент. В качестве примера мы будем публиковать показания датчика в Node-RED Dashboard, а ESP8266 будет программироваться с использованием Arduino IDE.
Рекомендуем прочитать: Что такое MQTT и как он работает
Обзор проекта
На следующей диаграмме показан общий обзор проекта, который мы будем создавать.
ESP8266 запрашивает показания датчика BME680.
Показания температуры публикуются в топике esp/bme680/temperature;
Показания влажности публикуются в топике esp/bme680/humidity;
Показания давления публикуются в топике esp/bme680/pressure;
Показания газа публикуются в топике esp/bme680/gas;
Node-RED подписан на эти топики;
Node-RED получает показания датчиков и отображает их на шкалах (gauges) и текстовых полях;
Вы можете получать показания на любой другой платформе, поддерживающей MQTT, и обрабатывать данные по своему усмотрению.
Необходимые условия
Перед тем как продолжить работу с этим руководством, убедитесь, что вы выполнили следующие предварительные условия.
Arduino IDE
Мы будем программировать ESP8266 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP8266.
MQTT-брокер
Для использования MQTT вам нужен брокер. Мы будем использовать брокер Mosquitto, установленный на Raspberry Pi. Прочитайте Как установить брокер Mosquitto на Raspberry Pi.
Вы можете использовать любой другой MQTT-брокер, включая облачный MQTT-брокер. Мы покажем вам, как это сделать в коде далее.
Если вы не знакомы с MQTT, обязательно прочитайте наше вводное руководство: Что такое MQTT и как он работает.
Библиотеки MQTT
Для использования MQTT с ESP8266 мы будем использовать библиотеку Async MQTT Client Library.
Установка библиотеки Async MQTT Client
Нажмите здесь, чтобы скачать библиотеку Async MQTT client. У вас должен появиться .zip-файл в папке Downloads
Распакуйте .zip-файл, и у вас должна появиться папка async-mqtt-client-master
Переименуйте папку из async-mqtt-client-master в async_mqtt_client
Переместите папку async_mqtt_client в папку библиотек вашей Arduino IDE
Наконец, перезапустите Arduino IDE
В качестве альтернативы вы можете перейти в Sketch > Include Library > Add .ZIP library и выбрать только что скачанную библиотеку.
Установка библиотеки Async TCP
Для использования MQTT с ESP вам также нужна библиотека ESPAsyncTCP.
Нажмите здесь, чтобы скачать библиотеку ESPAsyncTCP. У вас должен появиться .zip-файл в папке Downloads
Распакуйте .zip-файл, и у вас должна появиться папка ESPAsyncTCP-master
Переименуйте папку из ESPAsyncTCP-master в ESPAsyncTCP
Переместите папку ESPAsyncTCP в папку библиотек вашей Arduino IDE
Наконец, перезапустите Arduino IDE
В качестве альтернативы вы можете перейти в Sketch > Include Library > Add .ZIP library и выбрать только что скачанную библиотеку.
Библиотеки датчика BME680
Для получения показаний от модуля датчика BME680 мы будем использовать библиотеку Adafruit_BME680. Вам также нужно установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотек в Arduino IDE:
Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
Введите «adafruit bme680» в поле поиска и установите библиотеку.
Для использования библиотеки BME680 вам также нужно установить Adafruit Unified Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:
Введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.
После установки библиотек перезапустите Arduino IDE.
Чтобы узнать больше о датчике BME680, прочитайте наше руководство: ESP8266 с датчиком BME680 в Arduino IDE (давление, температура, влажность).
Необходимые компоненты
Для этого руководства вам потребуются следующие компоненты:
ESP8266 (читайте Лучшие платы разработки ESP8266)
Плата Raspberry Pi (читайте Лучшие стартовые наборы Raspberry Pi)
Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
Схема подключения
Подключите BME680 к ESP8266, как показано на следующей схеме: вывод SDA подключён к GPIO 4, а вывод SCL подключён к GPIO 5.
Код
Скопируйте следующий код в вашу Arduino IDE. Чтобы он заработал, вам нужно вставить ваши сетевые учётные данные, а также данные MQTT-брокера.
/*
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-mqtt-publish-bme680-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
// Raspberry Pi Mosquitto MQTT Broker
#define MQTT_HOST IPAddress(192, 168, 1, XXX)
// For a cloud MQTT broker, type the domain name
//#define MQTT_HOST "example.com"
#define MQTT_PORT 1883
// Temperature MQTT Topics
#define MQTT_PUB_TEMP "esp/bme680/temperature"
#define MQTT_PUB_HUM "esp/bme680/humidity"
#define MQTT_PUB_PRES "esp/bme680/pressure"
#define MQTT_PUB_GAS "esp/bme680/gas"
/*#define BME_SCK 14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS 15*/
Adafruit_BME680 bme; // I2C
//Adafruit_BME680 bme(BME_CS); // hardware SPI
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
// Variables to hold sensor readings
float temperature;
float humidity;
float pressure;
float gasResistance;
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
unsigned long previousMillis = 0; // Stores last time temperature was published
const long interval = 10000; // Interval at which to publish sensor readings
void getBME680Readings(){
// Tell BME680 to begin measurement.
unsigned long endTime = bme.beginReading();
if (endTime == 0) {
Serial.println(F("Failed to begin reading :("));
return;
}
if (!bme.endReading()) {
Serial.println(F("Failed to complete reading :("));
return;
}
temperature = bme.temperature;
pressure = bme.pressure / 100.0;
humidity = bme.humidity;
gasResistance = bme.gas_resistance / 1000.0;
}
void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
void onWifiConnect(const WiFiEventStationModeGotIP& event) {
Serial.println("Connected to Wi-Fi.");
connectToMqtt();
}
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
Serial.println("Disconnected from Wi-Fi.");
mqttReconnectTimer.detach(); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
wifiReconnectTimer.once(2, connectToWifi);
}
void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
void onMqttConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
Serial.println("Disconnected from MQTT.");
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}
/*void onMqttSubscribe(uint16_t packetId, uint8_t qos) {
Serial.println("Subscribe acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
Serial.print(" qos: ");
Serial.println(qos);
}
void onMqttUnsubscribe(uint16_t packetId) {
Serial.println("Unsubscribe acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}*/
void onMqttPublish(uint16_t packetId) {
Serial.print("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}
void setup() {
Serial.begin(115200);
Serial.println();
if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
//mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
// If your broker requires authentication (username and password), set them below
//mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD");
connectToWifi();
// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms
}
void loop() {
unsigned long currentMillis = millis();
// Every X number of seconds (interval = 10 seconds)
// it publishes a new MQTT message
if (currentMillis - previousMillis >= interval) {
// Save the last time a new reading was published
previousMillis = currentMillis;
getBME680Readings();
Serial.println();
Serial.printf("Temperature = %.2f ºC \n", temperature);
Serial.printf("Humidity = %.2f % \n", humidity);
Serial.printf("Pressure = %.2f hPa \n", pressure);
Serial.printf("Gas Resistance = %.2f KOhm \n", gasResistance);
// Publish an MQTT message on topic esp/bme680/temperature
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temperature).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId: %i", MQTT_PUB_TEMP, packetIdPub1);
Serial.printf("Message: %.2f \n", temperature);
// Publish an MQTT message on topic esp/bme680/humidity
uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(humidity).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_HUM, packetIdPub2);
Serial.printf("Message: %.2f \n", humidity);
// Publish an MQTT message on topic esp/bme680/pressure
uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pressure).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_PRES, packetIdPub3);
Serial.printf("Message: %.2f \n", pressure);
// Publish an MQTT message on topic esp/bme680/gas
uint16_t packetIdPub4 = mqttClient.publish(MQTT_PUB_GAS, 1, true, String(gasResistance).c_str());
Serial.printf("Publishing on topic %s at QoS 1, packetId %i: ", MQTT_PUB_GAS, packetIdPub4);
Serial.printf("Message: %.2f \n", gasResistance);
}
}
Как работает код
Следующий раздел импортирует все необходимые библиотеки.
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <AsyncMqttClient.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
Укажите ваши сетевые учётные данные в следующих строках.
#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"
Вставьте IP-адрес Raspberry Pi, чтобы ESP8266 подключился к вашему брокеру.
#define MQTT_HOST IPAddress(192, 168, 1, 106)
Если вы используете облачный MQTT-брокер, вставьте доменное имя брокера, например:
#define MQTT_HOST "example.com"
Определите порт MQTT.
#define MQTT_PORT 1883
Температура, влажность и давление будут публиковаться в следующих топиках:
#define MQTT_PUB_TEMP "esp/bme680/temperature"
#define MQTT_PUB_HUM "esp/bme680/humidity"
#define MQTT_PUB_PRES "esp/bme680/pressure"
#define MQTT_PUB_GAS "esp/bme680/gas"
Инициализируйте объект Adafruit_BME680 с именем bme.
Adafruit_BME680 bme;
Переменные temperature, humidity, pressure и gasResistance будут хранить все показания датчика BME680.
float temperature;
float humidity;
float pressure;
float gasResistance;
Создайте объект AsyncMqttClient с именем mqttClient для управления MQTT-клиентом и таймеры для переподключения к MQTT-брокеру и роутеру при разрыве соединения.
AsyncMqttClient mqttClient;
Ticker mqttReconnectTimer;
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
Затем создайте вспомогательные переменные таймера для публикации показаний каждые 10 секунд. Вы можете изменить время задержки в переменной interval.
unsigned long previousMillis = 0;
const long interval = 10000;
Функции MQTT: подключение к Wi-Fi, подключение к MQTT и события Wi-Fi
Мы не добавляли комментарии к функциям, определённым в следующем разделе кода. Эти функции поставляются с библиотекой Async Mqtt Client. Названия функций говорят сами за себя.
Например, функция connectToWifi() подключает ESP8266 к вашему роутеру:
void connectToWifi() {
Serial.println("Connecting to Wi-Fi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
Функция connectToMqtt() подключает ESP8266 к вашему MQTT-брокеру:
void connectToMqtt() {
Serial.println("Connecting to MQTT...");
mqttClient.connect();
}
Функции onWifiConnect() и onWifiDisconnect() отвечают за обработку событий Wi-Fi. Например, после успешного подключения к роутеру и MQTT-брокеру выводится IP-адрес ESP8266. С другой стороны, если соединение потеряно, запускается таймер и предпринимается попытка переподключения.
void onWifiConnect(const WiFiEventStationModeGotIP& event) {
Serial.println("Connected to Wi-Fi.");
connectToMqtt();
}
void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
Serial.println("Disconnected from Wi-Fi.");
mqttReconnectTimer.detach();
wifiReconnectTimer.once(2, connectToWifi);
}
Функция onMqttConnect() запускается после установления сессии с брокером.
void onMqttConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session present: ");
Serial.println(sessionPresent);
}
Функции MQTT: отключение и публикация
Если ESP8266 теряет соединение с MQTT-брокером, вызывается функция onMqttDisconnect, которая выводит соответствующее сообщение в монитор порта.
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
Serial.println("Disconnected from MQTT.");
if (WiFi.isConnected()) {
mqttReconnectTimer.once(2, connectToMqtt);
}
}
Когда вы публикуете сообщение в MQTT-топик, вызывается функция onMqttPublish(). Она выводит идентификатор пакета в монитор порта.
void onMqttPublish(uint16_t packetId) {
Serial.println("Publish acknowledged.");
Serial.print(" packetId: ");
Serial.println(packetId);
}
По сути, все эти функции, которые мы только что упомянули, являются функциями обратного вызова (callback). Поэтому они выполняются асинхронно.
setup()
Теперь перейдём к setup(). Инициализируйте датчик BME680.
if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}
Следующие две строки назначают обратные вызовы, которые обработают подключение или отключение ESP от Wi-Fi.
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
Наконец, назначьте все функции обратного вызова. Это означает, что эти функции будут выполняться автоматически при необходимости. Например, когда ESP8266 подключается к брокеру, автоматически вызывается функция onMqttConnect() и так далее.
mqttClient.onConnect(onMqttConnect);
mqttClient.onDisconnect(onMqttDisconnect);
//mqttClient.onSubscribe(onMqttSubscribe);
//mqttClient.onUnsubscribe(onMqttUnsubscribe);
mqttClient.onPublish(onMqttPublish);
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
Аутентификация брокера
Если ваш брокер требует аутентификации, раскомментируйте следующую строку и вставьте ваши учётные данные (имя пользователя и пароль).
mqttClient.setCredentials("REPlACE_WITH_YOUR_USER", "REPLACE_WITH_YOUR_PASSWORD");
Подключитесь к Wi-Fi.
connectToWifi();
Наконец, настройте следующие параметры (передискретизация, фильтр и нагреватель газа) для датчика.
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150);
loop()
В loop() вы создаёте таймер, который позволяет получать новые показания с датчика BME680 и публиковать их в соответствующий топик каждые 10 секунд.
unsigned long currentMillis = millis();
// Every X number of seconds (interval = 10 seconds)
// it publishes a new MQTT message
if (currentMillis - previousMillis >= interval) {
// Save the last time a new reading was published
previousMillis = currentMillis;
getBME680Readings();
Serial.println();
Serial.printf("Temperature = %.2f ºC \n", temperature);
Serial.printf("Humidity = %.2f % \n", humidity);
Serial.printf("Pressure = %.2f hPa \n", pressure);
Serial.printf("Gas Resistance = %.2f KOhm \n", gasResistance);
Узнайте больше о получении показаний с датчика BME680: ESP8266 с датчиком BME680: руководство по температуре, влажности и давлению.
Публикация в топики
Для публикации показаний в соответствующие MQTT-топики используйте следующие строки:
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temperature).c_str());
uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(humidity).c_str());
uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pressure).c_str());
uint16_t packetIdPub4 = mqttClient.publish(MQTT_PUB_GAS, 1, true, String(gasResistance).c_str());
По сути, используйте метод publish() объекта mqttClient для публикации данных в топик. Метод publish() принимает следующие аргументы по порядку:
MQTT-топик (const char*)
QoS (uint8_t): качество обслуживания – может быть 0, 1 или 2
флаг сохранения (bool): retain flag
полезная нагрузка (const char*) – в данном случае полезной нагрузкой являются показания датчика
QoS (quality of service – качество обслуживания) – это способ гарантировать доставку сообщения. Он может быть одного из следующих уровней:
0: сообщение будет доставлено один раз или не будет доставлено вовсе. Подтверждение сообщения не предусмотрено. Дублирование сообщений невозможно;
1: сообщение будет доставлено как минимум один раз, но может быть доставлено более одного раза;
2: сообщение всегда доставляется ровно один раз;
Загрузка кода
Включите Raspberry Pi с запущенным MQTT-брокером Mosquitto и загрузите код в ESP8266.
Откройте монитор порта на скорости 115200 бод, и вы увидите, что ESP8266 начинает публиковать сообщения в топиках, которые мы определили ранее.
Подготовка Node-RED Dashboard
ESP8266 публикует показания датчиков каждые 10 секунд в четыре MQTT-топика. Теперь вы можете использовать любую панель управления, поддерживающую MQTT, или любое другое устройство с поддержкой MQTT для подписки на эти топики и получения показаний.
В качестве примера мы создадим простой поток (flow) в Node-RED для подписки на эти топики и отображения показаний на шкалах (gauges).
Если у вас не установлен Node-RED, следуйте этим руководствам:
Когда Node-RED запущен на вашем Raspberry Pi, перейдите по IP-адресу Raspberry Pi с портом :1880.
http://raspberry-pi-ip-address:1880
Должен открыться интерфейс Node-RED. Перетащите четыре узла MQTT in, два узла gauge и два узла text field на рабочую область.
Нажмите на узел MQTT и отредактируйте его свойства.
Поле Server указывает на MQTT-брокер. В нашем случае MQTT-брокером является Raspberry Pi, поэтому установлено значение localhost:1883. Если вы используете облачный MQTT-брокер, вам следует изменить это поле.
Введите топик, на который хотите подписаться, и QoS. Данный узел MQTT подписан на топик esp/bme680/temperature.
Нажмите на другие узлы MQTT in и отредактируйте их свойства с тем же сервером, но для других топиков: esp/bme680/humidity, esp/bme680/pressure и esp/bme680/gas.
Нажмите на узлы gauge и отредактируйте их свойства для каждого показания. Следующий узел настроен для показаний температуры. Отредактируйте другие узлы диаграмм для показаний влажности.
Соедините ваши узлы, как показано ниже:
Наконец, разверните ваш поток (нажмите кнопку в правом верхнем углу).
В качестве альтернативы вы можете перейти в Menu > Import и скопировать следующий код в Clipboard для создания вашего потока Node-RED.
[{"id":"3b7f947c.9759ec","type":"mqtt in","z":"254c9c97.f85b34","name":"","topic":"esp/bme680/temperature","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":470,"y":2640,"wires":[["b87b21c3.96672"]]},{"id":"b87b21c3.96672","type":"ui_gauge","z":"254c9c97.f85b34","name":"","group":"37de8fe8.46846","order":2,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"ºC","format":"{{value}}","min":0,"max":"40","colors":["#00b500","#f7df09","#ca3838"],"seg1":"","seg2":"","x":690,"y":2640,"wires":[]},{"id":"f92248f4.545778","type":"mqtt in","z":"254c9c97.f85b34","name":"","topic":"esp/bme680/humidity","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":460,"y":2700,"wires":[["4114a401.5ac69c"]]},{"id":"4114a401.5ac69c","type":"ui_gauge","z":"254c9c97.f85b34","name":"","group":"37de8fe8.46846","order":2,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"%","format":"{{value}}","min":"30","max":"100","colors":["#53a4e6","#1d78a9","#4e38c9"],"seg1":"","seg2":"","x":680,"y":2700,"wires":[]},{"id":"ad51f895.2c2848","type":"mqtt in","z":"254c9c97.f85b34","name":"","topic":"esp/bme680/pressure","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":460,"y":2760,"wires":[["3a95123b.66405e"]]},{"id":"c074e688.198b78","type":"mqtt in","z":"254c9c97.f85b34","name":"","topic":"esp/bme680/gas","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":440,"y":2820,"wires":[["d3539c06.00a17"]]},{"id":"3a95123b.66405e","type":"ui_text","z":"254c9c97.f85b34","group":"37de8fe8.46846","order":2,"width":0,"height":0,"name":"","label":"Pressure","format":"{{msg.payload}} hPa","layout":"row-spread","x":680,"y":2760,"wires":[]},{"id":"d3539c06.00a17","type":"ui_text","z":"254c9c97.f85b34","group":"37de8fe8.46846","order":3,"width":0,"height":0,"name":"","label":"Gas","format":"{{msg.payload}} KOhm","layout":"row-spread","x":670,"y":2820,"wires":[]},{"id":"8db3fac0.99dd48","type":"mqtt-broker","z":"","name":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"37de8fe8.46846","type":"ui_group","z":"","name":"BME680","tab":"53b8c8f9.cfbe48","order":1,"disp":true,"width":"6","collapse":false},{"id":"53b8c8f9.cfbe48","type":"ui_tab","z":"","name":"Home","icon":"dashboard","order":5,"disabled":false,"hidden":false}]
Демонстрация
Перейдите по IP-адресу вашего Raspberry Pi, добавив :1880/ui.
http://raspberry-pi-ip-address:1880/ui
Вы должны получить доступ к текущим показаниям датчика BME680 на Dashboard. Вы можете использовать другие типы узлов для отображения показаний различными способами.
Вот и всё! Ваша плата ESP публикует показания температуры, влажности, давления и сопротивления газа с BME680 в Node-RED через MQTT.
Заключение
MQTT – это отличный протокол связи для обмена небольшими объёмами данных между устройствами. В этом руководстве вы узнали, как публиковать показания температуры, влажности, давления и сопротивления газа с датчика окружающей среды BME680 с помощью ESP8266 в различные MQTT-топики. Затем вы можете использовать любое устройство или платформу домашней автоматизации для подписки на эти топики и получения показаний.
Вместо датчика BME680 вы можете использовать любой другой датчик, например, датчик температуры DS18B20, датчик температуры и влажности DHT22 или датчик температуры, влажности и давления BME280:
Мы надеемся, что это руководство было для вас полезным. Если вы хотите узнать больше о ESP8266, ознакомьтесь с нашими ресурсами:
Спасибо за чтение.