• Фото: randomnerdtutorials.com

Узнайте, как публиковать показания датчика 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

  1. Нажмите здесь, чтобы загрузить клиентскую библиотеку Async MQTT . В папке «Загрузки» у вас должна быть папка .zip.
  2. Разархивируйте папку .zip, и вы получите папку async-mqtt-client-master.
  3. Переименуйте папку из асинхронный-mqtt-клиент-мастер в async_mqtt_client
  4. Переместите папку async_mqtt_client в папку установочных библиотек Arduino IDE.
  5. Наконец, снова откройте Arduino IDE.

Альтернативно вы можете перейти в «Скетч» > «Включить библиотеку» > «Добавить». ZIP- библиотеку и выберите только что скачанную библиотеку.

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

Чтобы использовать MQTT с ESP, вам также понадобится библиотека Async TCP .

  1. Нажмите здесь, чтобы загрузить клиентскую библиотеку Async TCP . В папке «Загрузки» у вас должна быть папка .zip.
  2. Разархивируйте папку .zip, и вы получите папку AsyncTCP-master.
  3. Переименуйте папку из AsyncTCP-мастер в AsyncTCP
  4. Переместите папку AsyncTCP в папку установочных библиотек Arduino IDE.
  5. Наконец, снова откройте 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 (давление, температура, влажность) .

Требуемые детали

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

Вы можете использовать предыдущие ссылки или перейти непосредственно на 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, перейдите по IP-адресу Raspberry Pi, а затем: 1880.

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

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

Node-RED Перетащите 6 узлов MQTT в узлах и датчиках

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

Поле Сервер относится к брокеру MQTT. В нашем случае брокером MQTT является Raspberry Pi, поэтому для него установлено значение localhost:1883. Если вы используете брокера Cloud MQTT, вам следует изменить это поле.

Введите тему, на которую вы хотите подписаться, и качество обслуживания. Этот предыдущий узел MQTT подписан на тему esp32/bme280/temperature .

Нажмите на другой MQTT в узлах и отредактируйте его свойства с тем же сервером, но для других тем: esp32/bme280/humidity и esp32/bme280/pressure .

Нажмите на узлы датчика и отредактируйте его свойства для каждого показания. Следующий узел установлен для показаний температуры. Отредактируйте другие узлы диаграммы для других показаний.

ESP32 Датчик температуры узла-красный поток

Подключите узлы, как показано ниже:

;

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

Развернуть кнопку Node-RED

Альтернативно вы можете перейти в Меню > Импорт и скопировать следующее в буфер обмена , чтобы создать поток 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, загляните на наши ресурсы:

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