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 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

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

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

Raspberry Pi 4 Model B 4b

 

 

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

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

 

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

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

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

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

*