ESP32 Урок 43. MQTT. Передаём температуру с датчика DS18B20



Продолжаем работу с протоколом MQTT.

На данном уроке мы попробуем передать (опубликовать) с помощью данного протокола осознанные данные, а именно значение температуры, снятое с датчика DS18B20.

С протоколом MQTT мы разобрались в прошлом уроке, а с датчиком DS18B20 мы также умеем работать.

В качестве брокера MQTT у нас будет также Mosquitto, установленный на плате Raspberry PI, поэтому давайте её включим

 

 

В качестве клиента у нас также будет плата с контроллером ESP32, к которой мы подключи датчик DS18B20, так же как мы делали в последних уроках по данному датчику. Логический анализатор мы подключать не будем. Подключим мы пока один датчик

 

 

А проект мы сделаем из проекта прошлого урока с именем WIFI_STA_TCP_MQTT и присвоим ему новое имя MQTT_RMT_DS18B20.

Прежде чем открыть наш новый проект в среде, скопируем в его каталог в подкаталог main файлы owb.howb.cds18b20.h и ds18b20.c из проекта урока 41 с именем RMT_DS18B20.

Откроем наш проект в Espressif IDE и в файле Kconfig.projbuild немного исправим главное меню

 

menu "TCP MQTT DS18B20 Configuration"

 

После пункта config LED_GPIO добавим пункт с настройкой ножки для датчика

 

config ONE_WIRE_GPIO

  int "ONE WIRE GPIO number"

  range 0 48

  default 4

  help

    GPIO number to ONE WIRE.

 

В файле CMakeLists.txt добавим наши модули для работы с датчиком

 

set(COMPONENT_SRCS "main.c wifi.c mqtt.c owb.c ds18b20.c")

 

Теперь у нас скорей всего соберётся проект.

Зайдём в конфигуратор и настроим адрес брокера MQTT, если он изменился, также в случае изменения настроим ножку датчика и учётные данные сети WiFi.

В файле main.h удалим подключение SPIFFS

 

#include "esp_spiffs.h"

 

и

 

#include "spiffs_config.h"

 

Подключим библиотеку для работы с датчиком температуры

 

 

В файле ds118b20.h объявим макрос максимального количества устройств

 

 

В файле main.c объявим макрос разрешающей способности датчика

 

 

В функции app_main удалим запуск клиента MQTT

 

mqtt_start();

 

Применим задержку, чтобы датчик запустился

 

 

 

Дальнейший код инициализации 1-wire для работы с датчиками взят практически полностью из проекта урока 41 за исключением непосредственно измерения температуры. Вместо этого в коде будет запуск сервера MQTT

 

 

По желанию вы можете удалить здесь некоторую часть кода, отвечающего за различную диагностику устройств на датчике. Я решил пока всё оставить, не зря же это мы писали.

Также нам надо при запуске клиента MQTT передать кое-какие параметры. Поэтому перейдём в файл mqtt.c и для начала в функции  удалим подписки на топики

 

msg_id = esp_mqtt_client_subscribe(client, "house2/room2/cmd0", 0);

ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);

msg_id = esp_mqtt_client_subscribe(client, "house2/room2/cmd1", 1);

ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);

msg_id = esp_mqtt_client_subscribe(client, "house2/room2/cmd2", 2);

ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);

 

В заголовке функции  добавим эти самые параметры

 

void mqtt_start(const OneWireBus * bus, const DS18B20_Info * ds18b20_info[MAX_DEVICES], int num_devices)

 

Не забываем проделать то же самое и с прототипом в заголовочном файле mqtt.h.

 

 

Также в данном файле подключим библиотеку для работы с датчиком

 

 

Вернёмся в функцию app_main файла main.c и при вызове функции старта клиента MQTT передадим наши параметры

 

mqtt_start(owb, devices, num_devices);

 

Вернёмся в файл mqtt.c и в функции  объявим символьный массив, а также целочисленный массив для подсчёта количества ошибок для каждого устройства

 

 

Вот эта переменная нам будет не нужна, удалим её

 

uint16_t i = 0;

 

Зафиксируем время

 

 

Удалим объявление переменной идентификатора сообщения

 

int msg_id;

 

Получим показания температуры от самого первого датчика и объявим парочку массивов

 

 

Дальнейший код в данном блоке удалим.

Получим температуру с остальных датчиков

 

 

Подсчитаем ошибки

 

 

Соберём показания в строковое значения и отобразим их в терминале

 

 

Передадим показания с разным уровнем качества обслуживания (для эксперимента, потом можно будет передавать с одинаковым)

 

 

Выйдем из цикла и в случае подключения не всех трёх датчиков передадим нулевые показания

 

 

Вместо обычной задержки

 

vTaskDelay(2000 / portTICK_PERIOD_MS);

 

будем использовать продвинутую

 

vTaskDelayUntil(&last_wake_time, 2000 / portTICK_PERIOD_MS);

 

Запустим MQTT Explorer, удалим там старые подписки и подпишемся на новые топики одной строкой сразу с максимальным уровнем QoS

 

 

Соединимся там с сервером, соберём наш код и прошьём контроллер.

Через некоторое время мы увидим, как начнут приходить наши данные клиенту 2

 

 

Подключим ещё два датчика

 

 

Перезагрузим контроллер и посмотрим результат в MQTT Explorer

 

 

 

 

 

 

Отлично, все показания поступают.

Попробуем нагреть рукой датчики и посмотреть изменения температур в графиках

 

 

 

 

Отлично! Всё передаётся, изменения фиксируются.

Итак, на данном уроке нам удалось передать по беспроводной сети показания температур с трёх датчиков с помощью протокола MQTT.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь Недорогие отладочные платы ESP32

Недорогие отладочные платы ESP32/ESP32-C3/ESP32-S3 можно купить здесь Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести здесь

Недорогую плату Raspberry PI 4B можно купить здесь Raspberry Pi 4 Model B 4b

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

ESP32 MQTT. Передаём температуру с датчика DS18B20

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 MQTT. Передаём температуру с датчика DS18B20

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 MQTT. Передаём температуру с датчика DS18B20

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*