ESP82xx + mqtt универсальный клиент

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

ESP82xx + mqtt универсальный клиент

Сообщение ledmax » Вс мар 04, 2018 1:26 am

Всем Привет.
Хочу поделиться своим трудами :)
Была задача создать универсальную платформу на базе ардуино для работы с мажордом по протоколу MQTT.
Идея в том, что бы в зависимости от потребностей менять только основную программу (например выключатель, датчик температуры, контроллер термостата итд..) а всю остальную работу по отправке и приёму значений выполнят стандартный код.
С первого взгляда эта идея покажется не новой, но есть пару фишек, с которыми получилось добиться той самой универсальности и удобства.
В принцип работы кода я вдаваться не буду (могу сделать это по необходимости), но опишу главные возможности
При настройки нам надо указать
ip
gateway
SELF_NAME[] = "esp82xx_mqtt";
ssid[]
pass[]

И названия переменных в файле valuename.h например declare_member(MainPumpON) delimiter

Теперь у нас есть переменная в формате int MainPumpON

values[MainPumpON] = 33; так присваиваем значение или читаем
Serial.print(values[MainPumpON]); вернёт 33

MainPumpON - порядковый номер переменной в valuename.h
Serial.print(MainPumpON); вернёт 6

valuename_strs; - массив названий переменых
Serial.print(valuename_strs[6]); вернёт MainPumpON

values - массив значений переменных
Serial.print(values[6]); вернёт 33

Теперь небольшой пример:

Где то в коде назначили

Код: Выделить всё

values[MainPumpON] = 33;
и вызвали функцию отправки mqtt:

Код: Выделить всё

mqtt_singleSend(MainPumpON); 
в мажордом получили

Код: Выделить всё

/esp82xx_mqtt/COIL/MainPumpON  33
В настройках модуля на мажордом указали, что для записи этой переменной отправляем

Код: Выделить всё

/esp82xx_mqtt/SET/MainPumpON  100
Ардуина подписана на все темы esp82xx_mqtt/SET и при получение сообщения парсит массив переменных и назначает найденной полученное значение, в данном случаи 100.

В файле valuename.h переменные для удобства разделены маркерами TEMP; FLOAT; COIL; MARKER;
Например при вызове

Код: Выделить всё

mqtt_singleSend(HeatTempError);
посылка будет

Код: Выделить всё

/esp82xx_mqtt/MARKER/HeatTempError
при вызове отправки переменных которые записаны до разделителя FLOAT , они будут поделены на 100 и отправлены в виде дроби.

Переменные которые записаны до разделителя TEMP могут быть использованы только для датчиков ds18b20.
Для работы с ними есть отдельный модуль. Всё что вам нужно - это записать адреса датчиков (из порта) и вписать им названия в файл valuename.h. Модуль стабильно работал с 40 датчиками и не имеет значения какой длины провод (можно подключать датчики параллельно).

Ещё есть встроенный веб сервер, но я пользуюсь только для перепрошивки по воздуху

Код: Выделить всё

192.168.1.1/setup.htm
При создании этого модуля, позаимствовал концепцию и принцип работы с таймерами и циклами у АМС - надеюсь никто не обидеться )

В чём удобство этого решения? При создании нужной вам программы вы оперируете реальными названиями, что очень удобно для понимания и не надо чесать репу как распарсить или передать переменную. у меня этот код работает во всех устройствах - от выключателей sonoff до довольно сложных контроллеров управления ТН или котлом.

В общем если кого-то заинтересует данный девайс, то готов ответить на вопросы.
Вложения
esp82xx_mqtt_clean.rar
(159.25 КБ) 124 скачивания
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: ESP82xx + mqtt универсальный клиент

Сообщение serghei » Вс мар 04, 2018 11:06 am

Отличная тема! В тему MQTT сильно не влезал , но по поводу ESP уже есть определённые хотелки.
И перво-наперво. При старте ESP создает точку доступа. Подключаюсь к ней , вижу свою домашнюю сеть , ввожу пароль и через две минуты я уже в сети.
Таким же образом хотелось бы выбрать и те данные , которые надо передать в МД.
Похоже , все это реализовано в прошивке WiFi-Iot , но меня напрягает такая неизвестность.
Код посмотрю попозже , пока в командировке (((
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: ESP82xx + mqtt универсальный клиент

Сообщение ledmax » Вс мар 04, 2018 11:24 am

Это всё можно организовать без особых хлопот, только это не сильно поможет. Основная задача контроллера - выполнять какую то логику, а логику можно поменять только в программе. При отсутствии вифи модуль создаёт свою точку, подключившись к ней вы можете прошить модуль по воздуху за 5 секунд, предварительно поменяв в программе все необходимые настройки. из необходимого можно сделать вывод серийников от датчиков в веб интерфейс, что бы не было необходимости читать порт с компа.
Ответить