ESP32 MQTT – Публикация показаний температуры, влажности, давления и газа с BME680 (Arduino IDE)

Узнайте, как публиковать показания датчика BME680 (температура, влажность, давление и качество воздуха/газ) по протоколу MQTT с помощью ESP32 на любую платформу, поддерживающую MQTT, или любой MQTT-клиент. В качестве примера мы будем публиковать показания датчика в Node-RED Dashboard, а ESP32 будет запрограммирован с использованием Arduino IDE.

ESP32 MQTT Publish BME680 Temperature Humidity Pressure and Gas Readings Arduino IDE

Рекомендуемое чтение: What is MQTT and How It Works

Обзор проекта

На следующей диаграмме показан общий обзор проекта, который мы создадим.

ESP32 Project Overview MQTT Publish BME680 Temperature Humidity Pressure Gas Readings
  • ESP32 запрашивает показания с датчика BME680.

  • Показания температуры публикуются в топике esp/bme680/temperature;

  • Показания влажности публикуются в топике esp/bme680/humidity;

  • Показания давления публикуются в топике esp/bme680/pressure;

  • Показания газа публикуются в топике esp/bme680/gas;

  • Node-RED подписан на эти топики;

  • Node-RED получает показания датчиков и отображает их на шкалах и текстовых полях;

  • Вы можете получать показания на любой другой платформе, поддерживающей MQTT, и обрабатывать их по своему усмотрению.

Предварительные требования

Перед тем как приступить к этому руководству, убедитесь, что вы выполнили следующие предварительные условия.

Arduino IDE

Мы будем программировать ESP32 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32.

MQTT Брокер

Installing Mosquitto MQTT broker Raspberry Pi

Для использования MQTT вам нужен брокер. Мы будем использовать Mosquitto broker, установленный на Raspberry Pi. Прочитайте How to Install Mosquitto Broker on Raspberry Pi.

Вы можете использовать любой другой MQTT-брокер, включая облачный MQTT-брокер. Мы покажем, как это сделать в коде далее.

Если вы не знакомы с MQTT, обязательно прочитайте наше вводное руководство: What is MQTT and How It Works.

Библиотеки MQTT

Для использования MQTT с ESP32 мы будем использовать Async MQTT Client Library.

Установка библиотеки Async MQTT Client

  1. Нажмите здесь, чтобы скачать библиотеку Async MQTT client. У вас должен появиться .zip-файл в папке Downloads

  2. Распакуйте .zip-файл, и у вас должна появиться папка async-mqtt-client-master

  3. Переименуйте папку из async-mqtt-client-master в async_mqtt_client

  4. Переместите папку async_mqtt_client в папку библиотек вашей Arduino IDE

  5. Наконец, перезапустите Arduino IDE

Альтернативно, вы можете перейти в Sketch > Include Library > Add .ZIP library и выбрать только что скачанную библиотеку.

Установка библиотеки Async TCP

Для использования MQTT с ESP вам также нужна Async TCP library.

  1. Нажмите здесь, чтобы скачать библиотеку Async TCP client. У вас должен появиться .zip-файл в папке Downloads

  2. Распакуйте .zip-файл, и у вас должна появиться папка AsyncTCP-master

  3. Переименуйте папку из AsyncTCP-master в AsyncTCP

  4. Переместите папку AsyncTCP в папку библиотек вашей Arduino IDE

  5. Наконец, перезапустите Arduino IDE

Альтернативно, вы можете перейти в Sketch > Include Library > Add .ZIP library и выбрать только что скачанную библиотеку.

Библиотеки датчика BME680

Для получения показаний с модуля датчика BME680 мы будем использовать библиотеку Adafruit_BME680. Вам также нужно установить библиотеку Adafruit_Sensor. Выполните следующие шаги для установки библиотек в Arduino IDE:

  1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться Менеджер библиотек.

  2. Введите «adafruit bme680» в поле поиска и установите библиотеку.

Install BME680 Adafruit Library Arduino IDE Library Manager

Для использования библиотеки BME680 вам также нужно установить Adafruit Unified Sensor. Выполните следующие шаги для установки библиотеки в Arduino IDE:

  1. Введите «Adafruit Unified Sensor» в поле поиска. Прокрутите вниз, чтобы найти библиотеку, и установите её.

Installing Adafruit Unified Sensor Driver library

После установки библиотек перезапустите Arduino IDE.

Чтобы узнать больше о датчике BME680, прочитайте наше руководство: ESP32 with BME680 Sensor using Arduino IDE (Pressure, Temperature, Humidity).

Необходимые компоненты

ESP32 Board BME680 Gas sensor circuit wiring diagram schematics

Для этого руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Схема подключения

Подключите BME680 к ESP32, как показано на следующей схеме: вывод SDA подключён к GPIO 21, а вывод SCL подключён к GPIO 22.

ESP32 BME680 Wiring Diagram I2C

Код

Скопируйте следующий код в вашу Arduino IDE. Чтобы он заработал, вам нужно вставить ваши сетевые учётные данные, а также данные MQTT-брокера.

/*
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete project details at https://RandomNerdTutorials.com/esp32-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 <WiFi.h>
extern "C" {
  #include "freertos/FreeRTOS.h"
  #include "freertos/timers.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;
TimerHandle_t mqttReconnectTimer;
TimerHandle_t 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 connectToMqtt() {
  Serial.println("Connecting to MQTT...");
  mqttClient.connect();
}

void WiFiEvent(WiFiEvent_t event) {
  Serial.printf("[WiFi-event] event: %d\n", event);
  switch(event) {
    case ARDUINO_EVENT_WIFI_STA_GOT_IP:
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      connectToMqtt();
      break;
    case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
      Serial.println("WiFi lost connection");
      xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
      xTimerStart(wifiReconnectTimer, 0);
      break;
  }
}

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()) {
    xTimerStart(mqttReconnectTimer, 0);
  }
}

/*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);
  }

  mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
  wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));

  WiFi.onEvent(WiFiEvent);

  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 <WiFi.h>
extern "C" {
  #include "freertos/FreeRTOS.h"
  #include "freertos/timers.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, чтобы ESP32 подключился к вашему брокеру.

#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;
TimerHandle_t mqttReconnectTimer;
TimerHandle_t wifiReconnectTimer;

Затем создайте вспомогательные переменные таймера для публикации показаний каждые 10 секунд. Вы можете изменить время задержки в переменной interval.

unsigned long previousMillis = 0;
const long interval = 10000;

Функции MQTT: подключение к Wi-Fi, подключение к MQTT и события Wi-Fi

Мы не добавляли комментарии к функциям, определённым в следующем разделе кода. Эти функции поставляются с библиотекой Async Mqtt Client. Названия функций говорят сами за себя.

Например, функция connectToWifi() подключает ваш ESP32 к роутеру:

void connectToWifi() {
  Serial.println("Connecting to Wi-Fi...");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}

Функция connectToMqtt() подключает ваш ESP32 к MQTT-брокеру:

void connectToMqtt() {
  Serial.println("Connecting to MQTT...");
  mqttClient.connect();
}

Функция WiFiEvent() отвечает за обработку событий Wi-Fi. Например, после успешного подключения к роутеру и MQTT-брокеру она выводит IP-адрес ESP32. С другой стороны, если соединение потеряно, она запускает таймер и пытается переподключиться.

void WiFiEvent(WiFiEvent_t event) {
  Serial.printf("[WiFi-event] event: %d\n", event);
  switch(event) {
    case ARDUINO_EVENT_WIFI_STA_GOT_IP:
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
      connectToMqtt();
      break;
    case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
      Serial.println("WiFi lost connection");
      xTimerStop(mqttReconnectTimer, 0);
      xTimerStart(wifiReconnectTimer, 0);
      break;
  }
}

Функция onMqttConnect() запускается после установления сессии с брокером.

void onMqttConnect(bool sessionPresent) {
  Serial.println("Connected to MQTT.");
  Serial.print("Session present: ");
  Serial.println(sessionPresent);
}

Функции MQTT: отключение и публикация

Если ESP32 теряет соединение с MQTT-брокером, вызывается функция onMqttDisconnect, которая выводит сообщение в Serial Monitor.

void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
  Serial.println("Disconnected from MQTT.");
  if (WiFi.isConnected()) {
    xTimerStart(mqttReconnectTimer, 0);
  }
}

Когда вы публикуете сообщение в MQTT-топик, вызывается функция onMqttPublish(). Она выводит идентификатор пакета в Serial Monitor.

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);
}

Следующие две строки создают таймеры, которые позволяют MQTT-брокеру и Wi-Fi-соединению переподключиться в случае потери соединения.

mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));

Следующая строка назначает callback-функцию, чтобы при подключении ESP32 к Wi-Fi выполнялась функция WiFiEvent() для вывода описанных ранее деталей.

WiFi.onEvent(WiFiEvent);

Наконец, назначьте все callback-функции. Это означает, что эти функции будут вызываться автоматически при необходимости. Например, когда ESP32 подключается к брокеру, автоматически вызывается функция 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: ESP32 with BME680 Temperature, Humidity and Pressure Sensor Guide.

Публикация в топики

Для публикации показаний в соответствующие 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

  • флаг retain (bool): флаг сохранения

  • payload (const char*) – в данном случае payload соответствует показанию датчика

QoS (quality of service) – это способ гарантировать доставку сообщения. Он может быть одного из следующих уровней:

  • 0: сообщение будет доставлено один раз или не доставлено вообще. Сообщение не подтверждается. Нет возможности дублирования сообщений;

  • 1: сообщение будет доставлено как минимум один раз, но может быть доставлено более одного раза;

  • 2: сообщение всегда доставляется ровно один раз;

  • Узнать больше о MQTT QoS.

Загрузка кода

С включённым Raspberry Pi и запущенным MQTT-брокером Mosquitto загрузите код в ESP32.

Откройте Serial Monitor на скорости 115200 бод, и вы увидите, что ESP32 начинает публиковать сообщения в топиках, которые мы определили ранее.

ESP32 ESP8266 Arduino IDE Serial Monitor BME680 Temperature Humidity Pressure Gas Air Quality

Настройка Node-RED Dashboard

ESP32 публикует показания датчиков каждые 10 секунд в четырёх MQTT-топиках. Теперь вы можете использовать любую панель управления, поддерживающую MQTT, или любое другое устройство с поддержкой MQTT для подписки на эти топики и получения показаний.

В качестве примера мы создадим простой поток с использованием Node-RED для подписки на эти топики и отображения показаний на шкалах.

Если у вас не установлен Node-RED, следуйте этим руководствам:

Запустив Node-RED на Raspberry Pi, перейдите по IP-адресу вашего Raspberry Pi, добавив :1880.

http://raspberry-pi-ip-address:1880

Должен открыться интерфейс Node-RED. Перетащите четыре узла MQTT in, два узла gauge и два узла text field в поток.

Drag nodes ESP32 ESP8266 Node-RED BME680

Нажмите на узел MQTT и отредактируйте его свойства.

Edit mqtt in node ESP32 ESP8266 Node-RED BME680

Поле 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 и отредактируйте их свойства для каждого показания. Следующий узел настроен для показаний температуры. Отредактируйте другие узлы chart для показаний влажности.

Edit gauge node ESP32 ESP8266 Node-RED BME680

Соедините ваши узлы, как показано ниже:

Node connected ESP32 ESP8266 Node-RED BME680

Наконец, разверните поток (нажмите кнопку в правом верхнем углу).

Deploy Node-RED button

Альтернативно, вы можете перейти в 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. Вы можете использовать другие типы узлов dashboard для отображения показаний другими способами.

ESP32 ESP8266 Node-RED BME680 Temperature Humidity Pressure Gas Air Quality

Вот и всё! Ваша плата ESP32 публикует показания температуры, влажности, давления и сопротивления газа с BME680 в Node-RED через MQTT.

Заключение

MQTT – это отличный протокол связи для обмена небольшими объёмами данных между устройствами. В этом руководстве вы узнали, как публиковать показания температуры, влажности, давления и сопротивления газа с датчика окружающей среды BME680 с помощью ESP32 в различные MQTT-топики. Затем вы можете использовать любое устройство или платформу домашней автоматизации для подписки на эти топики и получения показаний.

Вместо датчика BME680 вы можете использовать любой другой датчик, например DS18B20 (датчик температуры), DHT22 (датчик температуры и влажности) или BME280 (датчик температуры, влажности и давления):

Мы надеемся, что это руководство было полезным. Если вы хотите узнать больше об ESP32, ознакомьтесь с нашими ресурсами:

Спасибо за прочтение.


Источник: Rui Santos & Sara Santos – Random Nerd Tutorials