Узнайте, как публиковать показания датчика BME280 (температура, влажность и давление) через MQTT с помощью ESP32 на любой платформе, поддерживающей MQTT, или любом клиенте MQTT. В качестве примера мы опубликуем показания датчиков на панели мониторинга Node-RED, а ESP32 будет запрограммирован с использованием Arduino IDE.
Рекомендуемая литература: Что такое MQTT и как он работает
Обзор проекта
На следующей диаграмме показан общий обзор проекта, который мы будем создавать.
- ESP32 запрашивает показания температуры от датчика BME280.
- Показания температуры опубликованы в теме esp32/bme280/temperature ;
- Показания влажности публикуются в теме esp32/bme280/humidity ;
- Показания давления публикуются в теме esp32/bme280/pressure ;
- Node-RED подписан на эти темы;
- Node-RED получает показания датчиков и отображает их на датчиках;
- Вы можете получать показания на любой другой платформе, поддерживающей MQTT, и обрабатывать их по своему усмотрению.
Предварительные условия
Прежде чем продолжить работу с этим руководством, обязательно проверьте следующие предварительные условия.
Ардуино IDE
Мы будем программировать ESP32 с использованием Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32.
MQTT-брокер
Чтобы использовать MQTT, вам нужен брокер. Мы будем использовать брокер Mosquitto , установленный на Raspberry Pi. Прочтите , как установить Mosquitto Broker на Raspberry Pi .
Вы можете использовать любого другого брокера MQTT, включая облачного брокера MQTT. Позже мы покажем вам, как это сделать в коде.
Если вы не знакомы с MQTT, обязательно прочтите наше вводное руководство: Что такое MQTT и как он работает .
Библиотеки MQTT
Чтобы использовать MQTT с ESP32, мы будем использовать клиентскую библиотеку Async MQTT .
Установка клиентской библиотеки Async MQTT
- Нажмите здесь, чтобы загрузить клиентскую библиотеку Async MQTT . В папке «Загрузки» у вас должна быть папка .zip.
- Разархивируйте папку .zip, и вы получите папку async-mqtt-client-master.
- Переименуйте папку из асинхронный-mqtt-клиент-мастер в async_mqtt_client
- Переместите папку async_mqtt_client в папку установочных библиотек Arduino IDE.
- Наконец, снова откройте Arduino IDE.
Альтернативно вы можете перейти в «Скетч» > «Включить библиотеку» > «Добавить». ZIP- библиотеку и выберите только что скачанную библиотеку.
Установка библиотеки Async TCP
Чтобы использовать MQTT с ESP, вам также понадобится библиотека Async TCP .
- Нажмите здесь, чтобы загрузить клиентскую библиотеку Async TCP . В папке «Загрузки» у вас должна быть папка .zip.
- Разархивируйте папку .zip, и вы получите папку AsyncTCP-master.
- Переименуйте папку из AsyncTCP-мастер в AsyncTCP
- Переместите папку AsyncTCP в папку установочных библиотек Arduino IDE.
- Наконец, снова откройте Arduino IDE.
Альтернативно вы можете перейти в «Скетч» > «Включить библиотеку» > «Добавить». ZIP- библиотеку и выберите только что скачанную библиотеку.
Библиотеки датчиков BME280
Для получения показаний сенсорного модуля BME280 мы воспользуемся библиотекой Adafruit_BME280 . Также необходимо установить библиотеку Adafruit_Sensor . Выполните следующие шаги, чтобы установить библиотеки в вашу Arduino IDE:
1. Откройте Arduino IDE и выберите «Скетч» > «Включить библиотеку» > «Управление библиотеками» . Менеджер библиотеки должен открыться.
2. Найдите « adafruit bme280 » в поле поиска и установите библиотеку.
Чтобы использовать библиотеку BME280, вам также необходимо установить Adafruit Unified Sensor . Выполните следующие шаги, чтобы установить библиотеку в вашу Arduino IDE:
3. Найдите « Adafruit Unified Sensor » в поле поиска. Прокрутите страницу вниз, чтобы найти библиотеку и установить ее.
После установки библиотек перезапустите Arduino IDE.
Чтобы узнать больше о датчике BME280, прочтите наше руководство: ESP32 с датчиком BME280 с использованием Arduino IDE (давление, температура, влажность) .
Требуемые детали
Для этого урока вам понадобятся следующие детали:
- ESP32 (читайте «Лучшие платы разработки ESP32 »)
- BME280 – BME280 с направляющей ESP32
- Плата Raspberry Pi (читайте «Лучшие стартовые наборы Raspberry Pi »)
- Карта MicroSD — 16 ГБ, класс 10
- Блок питания Raspberry Pi (5 В, 2,5 А)
- Перемычки
- Макет
Вы можете использовать предыдущие ссылки или перейти непосредственно на MakerAdvisor.com/tools , чтобы найти все детали для ваших проектов по лучшей цене!
Принципиальная схема
Подключите BME280 к ESP32, как показано на следующей принципиальной схеме, подключив вывод SDA кГПИО 21и вывод SCL, подключенный кГПИО 22.
Код
Скопируйте следующий код в вашу Arduino IDE. Чтобы все заработало, вам необходимо ввести свои сетевые учетные данные, а также данные брокера MQTT.
Как работает код
В следующем разделе импортируются все необходимые библиотеки.
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #include <WiFi.h> extern "C" { #include "freertos/FreeRTOS.h" #include "freertos/timers.h" } #include <AsyncMqttClient.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 "esp32/bme280/temperature" #define MQTT_PUB_HUM "esp32/bme280/humidity" #define MQTT_PUB_PRES "esp32/bme280/pressure"
ИнициализироватьАдафрут_BME280объект под названиемчерт возьми.
Adafruit_BME280 bme;
The температура,гулипресспеременные будут содержать значения температуры, влажности и давления, полученные от датчика BME280.
float temp; float hum; float pres;
СоздатьАсинкмкттклиентобъект под названиемmqttClientдля обработки клиента MQTT и таймеров для повторного подключения к вашему брокеру MQTT и маршрутизатору при его отключении.
AsyncMqttClient mqttClient; TimerHandle_t mqttReconnectTimer; TimerHandle_t wifiReconnectTimer;
Затем создайте несколько вспомогательных переменных таймера, чтобы публиковать показания каждые 10 секунд. Вы можете изменить время задержки наинтервалпеременная.
unsigned long previousMillis = 0; // Stores last time temperature was published const long interval = 10000; // Interval at which to publish sensor readings
Функции MQTT: подключение к Wi-Fi, подключение к MQTT и события Wi-Fi.
Мы не добавили никаких комментариев к функциям, определенным в следующем разделе кода. Эти функции входят в состав клиентской библиотеки Async Mqtt. Имена функций говорят сами за себя.
Например,подключиться к Wi-Fi ()подключает ваш ESP32 к маршрутизатору:
void connectToWifi() { Serial.println("Connecting to Wi-Fi..."); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); }
The ConnectToMqtt()подключает ваш ESP32 к вашему MQTT-брокеру:
void connectToMqtt() { Serial.println("Connecting to MQTT…"); mqttClient.connect(); }
The Wi-FiEvent()Функция отвечает за обработку событий Wi-Fi. Например, после успешного соединения с маршрутизатором и MQTT-брокером он печатает IP-адрес ESP32. С другой стороны, если соединение потеряно, он запускает таймер и пытается восстановить соединение.
void WiFiEvent(WiFiEvent_t event) { Serial.printf("[WiFi-event] event: %d\n", event); switch(event) { case SYSTEM_EVENT_STA_GOT_IP: Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); connectToMqtt(); break; case SYSTEM_EVENT_STA_DISCONNECTED: Serial.println("WiFi lost connection"); xTimerStop(mqttReconnectTimer, 0); xTimerStart(wifiReconnectTimer, 0); break; } }
The onMqttConnect()функция запускается после начала сеанса с брокером.
void onMqttConnect(bool sessionPresent) { Serial.println("Connected to MQTT."); Serial.print("Session present: "); Serial.println(sessionPresent); }
Функции MQTT: отключить и опубликовать
Если ESP32 теряет соединение с брокером MQTT, он вызываетonMqttDisconnectфункция, которая печатает это сообщение на последовательном мониторе.
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) { Serial.println("Disconnected from MQTT."); if (WiFi.isConnected()) { xTimerStart(mqttReconnectTimer, 0); } }
Когда вы публикуете сообщение в теме MQTT,onMqttPublish()функция вызывается. Он печатает идентификатор пакета в последовательном мониторе.
void onMqttPublish(uint16_t packetId) { Serial.println("Publish acknowledged."); Serial.print(" packetId: "); Serial.println(packetId); }
По сути, все функции, которые мы только что упомянули, являются функциями обратного вызова. Таким образом, они выполняются асинхронно.
настраивать()
Теперь перейдем кнастраивать(). Инициализируйте датчик BME280.
if (!bme.begin(0x76)) { Serial.println("Could not find a valid BME280 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));
Следующая строка назначает функцию обратного вызова, поэтому, когда ESP32 подключается к вашему Wi-Fi, он выполняет командуWi-FiEvent()функция для печати деталей, описанных ранее.
WiFi.onEvent(WiFiEvent);
Наконец, назначьте все функции обратного вызова. Это означает, что эти функции будут выполняться автоматически при необходимости. Например, когда 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();
петля()
впетля(), вы создаете таймер, который позволит получать новые показания датчика BME280 и публиковать их в соответствующей теме каждые 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; // New BME280 sensor readings temp = bme.readTemperature(); //temp = 1.8*bme.readTemperature() + 32; hum = bme.readHumidity(); pres = bme.readPressure()/100.0F;
Узнайте больше о получении показаний датчика BME280: ESP32 с руководством по датчикам температуры, влажности и давления BME280 .
Публикация в темах
Чтобы опубликовать показания по соответствующим темам MQTT, используйте следующие строки:
uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).c_str()); uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str()); uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pres).c_str());
В основном используйтепубликовать()метод наmqttClientобъект для публикации данных по теме. публиковать()метод принимает следующие аргументы по порядку:
- Тема MQTT (const char*)
- QoS (uint8_t): качество обслуживания – может быть 0, 1 или 2.
- сохранить флаг (bool): сохранить флаг
- полезная нагрузка (const char*) – в данном случае полезная нагрузка соответствует показанию датчика
QoS (качество обслуживания) — это способ гарантировать доставку сообщения. Это может быть один из следующих уровней:
- 0 : сообщение будет доставлено один раз или не будет доставлено вообще. Сообщение не подтверждено. Нет возможности дублирования сообщений;
- 1 : сообщение будет доставлено хотя бы один раз, но может быть доставлено более одного раза;
- 2 : сообщение всегда доставляется ровно один раз;
- Узнайте о QoS MQTT.
Загрузка кода
Включив Raspberry Pi и запустив брокер Mosquitto MQTT, загрузите код в ESP32.
Откройте Serial Monitor со скоростью 115200 бод, и вы увидите, что ESP32 начинает публиковать сообщения по темам, которые мы определили ранее.
Подготовка информационной панели Node-RED
ESP32 публикует показания температуры каждые 10 секунд в темах esp32/bme280/temperature , esp32/bme280/humidity и esp32/bme280/pressure . Теперь вы можете использовать любую панель мониторинга, поддерживающую MQTT, или любое другое устройство, поддерживающее MQTT, чтобы подписаться на эти темы и получать показания.
В качестве примера мы создадим простой поток с помощью Node-RED для подписки на эти темы и отображения показаний на датчиках.
Если у вас не установлен Node-RED, следуйте следующим руководствам:
- Начало работы с Node-RED на Raspberry Pi
- Установка и начало работы с информационной панелью Node-RED
Запустив Node-RED на Raspberry Pi, перейдите по IP-адресу Raspberry Pi, а затем: 1880.
http://raspberry-pi-ip-address:1880
Должен открыться интерфейс Node-RED. Перетащите три узла MQTT в поток и три узла датчика.
Щелкните узел MQTT и отредактируйте его свойства.
Поле Сервер относится к брокеру MQTT. В нашем случае брокером MQTT является Raspberry Pi, поэтому для него установлено значение localhost:1883. Если вы используете брокера Cloud MQTT, вам следует изменить это поле.
Введите тему, на которую вы хотите подписаться, и качество обслуживания. Этот предыдущий узел MQTT подписан на тему esp32/bme280/temperature .
Нажмите на другой MQTT в узлах и отредактируйте его свойства с тем же сервером, но для других тем: esp32/bme280/humidity и esp32/bme280/pressure .
Нажмите на узлы датчика и отредактируйте его свойства для каждого показания. Следующий узел установлен для показаний температуры. Отредактируйте другие узлы диаграммы для других показаний.
Подключите узлы, как показано ниже:
Наконец, разверните свой поток (нажмите кнопку в правом верхнем углу).
Альтернативно вы можете перейти в Меню > Импорт и скопировать следующее в буфер обмена , чтобы создать поток Node-RED.
[{"id":"5a45b8da.52b0d8","type":"mqtt in","z":"b01416d3.f69f38","name":"","topic":"esp32/bme280/temperature","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":340,"y":120,"wires":[["3042e15e.80a4ee"]]},{"id":"3042e15e.80a4ee","type":"ui_gauge","z":"b01416d3.f69f38","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":610,"y":120,"wires":[]},{"id":"8ff168f0.0c74a8","type":"mqtt in","z":"b01416d3.f69f38","name":"","topic":"esp32/bme280/humidity","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":320,"y":200,"wires":[["29251f29.6687c"]]},{"id":"29251f29.6687c","type":"ui_gauge","z":"b01416d3.f69f38","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":600,"y":200,"wires":[]},{"id":"681a1588.8506fc","type":"mqtt in","z":"b01416d3.f69f38","name":"","topic":"esp32/bme280/pressure","qos":"1","datatype":"auto","broker":"8db3fac0.99dd48","x":330,"y":280,"wires":[["41164c6.e7b3cb4"]]},{"id":"41164c6.e7b3cb4","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"37de8fe8.46846","order":2,"width":0,"height":0,"gtype":"gage","title":"Pressure","label":"hPa","format":"{{value}}","min":"900","max":"1100","colors":["#a346ff","#bd45cb","#7d007d"],"seg1":"","seg2":"","x":600,"y":280,"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":"BME280","tab":"53b8c8f9.cfbe48","order":1,"disp":true,"width":"6","collapse":false},{"id":"53b8c8f9.cfbe48","type":"ui_tab","z":"","name":"Home","icon":"dashboard","order":2,"disabled":false,"hidden":false}]
Демонстрация
Перейдите на свой IP-адрес Raspberry Pi, а затем : 1880/ui .
http://raspberry-pi-ip-address:1880/ui
Вы должны получить доступ к текущим показаниям датчика BME280 на приборной панели. Вы можете использовать другие узлы типа приборной панели для отображения показаний разными способами.
Вот и все! У вас есть плата ESP32, которая публикует показания температуры, влажности и давления BME280 в Node-RED через MQTT.
Подведение итогов
MQTT — отличный протокол связи для обмена небольшими объемами данных между устройствами. В этом руководстве вы узнали, как публиковать показания температуры, влажности и давления с датчика BME280 с помощью ESP32 в различных темах MQTT. Затем вы можете использовать любое устройство или платформу домашней автоматизации, чтобы подписаться на эти темы и получать показания.
Вместо датчика BME280 вы можете использовать любой другой датчик, например датчик температуры DS18B20 ( ESP32 MQTT — Публикация показаний температуры DS18B20 ).
Мы надеемся, что вы нашли это руководство полезным. Если вы хотите узнать больше о ESP32, загляните на наши ресурсы:
- Изучите ESP32 с помощью Arduino IDE
- Программирование на MicroPython с использованием ESP32 и ESP8266.
- Больше проектов ESP32…
Спасибо за прочтение.