• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);
и так далее
Дребезг кнопок реализован через железо?
 
Сверху Снизу