• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено MQTT выключатель

Michurinsk

New member
Добрый день. Очень необходим совет. Есть скетч на 2 реле, 2 кнопки и MQTT. Цель проекта проста - управлять реле с обычных кнопок и посредством MQTT. Скетч работает нормально, реле переключается обоими способами, статус реле отображается посредством MQTT. Проблема в следующем...при недоступности сервера MQTT скетч перестает реагировать на нажатия кнопок, т.е. в реальной жизни при возникновении какой-либо неполадки с сервером MQTT (или с WiFi сетью) работать обычными физическими кнопками для включения/выключения света станет невозможно и реле останется в том положении, в котором находилось до возникновения проблемы.
Подскажите как решить проблему
 
Последнее редактирование:

shuraf

Member
Ну можно предположить, что ожидается тайм-аут подключения и используется синхронный клиент.
Я в проекте espruna подсмотрел использование асинхронного и многих проблем удалось избежать.
 

Michurinsk

New member
Возможно есть связь между тем, что время между попытками подключения к серверу mqtt равно 5 секундам и тем что, время удержания кнопки, необходимое для включения реле во время недоступности сервера, также равно 5 секундам?
 
попробуйте использовать пример Reconnecting MQTT example - non-blocking из библиотеки PubSubClient.
 

Michurinsk

New member
Повесила прерывания на пины кнопок и код обработки кнопки в обработчик прерываний. Работает как положено, только пришлось отказаться от программного подавителя дребезга
 

Michurinsk

New member
Вдвойне интереснее.
Есть возможность выложить код?
Решение оказалось действительно простым:
void setup()
{
pinMode(BUTTON, INPUT);
attachInterrupt(BUTTON, switch, CHANGE);
и так далее

void switch()
{
Status = digitalRead(RELAY);
btnPress = digitalRead(BUTTON);
и так далее
 
Последнее редактирование:

shuraf

Member
При попытке поправить с телефона затерлась половина скетча
Но решение оказалось действительно простым:
void setup()
{
pinMode(BUTTON, INPUT);
attachInterrupt(BUTTON, switch, CHANGE);
и так далее

void switch()
{
Status = digitalRead(RELAY);
btnPress = digitalRead(BUTTON);
и так далее
Дребезг кнопок реализован через железо?
 
Сверху Снизу