Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Удаленная работа
Помощь проекту

Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков.

 
Опции темы
Непрочитано 03.03.2020, 12:20  
TechMike
Вид на жительство
 
Регистрация: 02.11.2008
Сообщений: 316
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
TechMike на пути к лучшему
По умолчанию Алгоритм устранения "дребезкга" радиовыключателя

Доброго дня.

Собрал радиовыключатель для люстры 220в на RX-433+mega328 все отлично работает, но есть неудобство с использовании: когда нажимаешь и держишь выключатель, но лампочка включается и выключается циклически. Удалось снизить период мигания лампочки введя задержку в обработку кода кнопки, но полностью победить не удалось.

Идеально должно включать или выключать лампу при отпускании радиокнопки, независимо сколько она держится нажатой.

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

Предложите не сложный алгоритм, как можно добиться около идеального результата. Памяти и ресурсов у mega328 еще предостаточно.

Сейчас код выгляди так:

Код:
void loop() {
    
    now = millis();                               // обновляем значение в каждом цикле, для контроля времени между нажатой и отжатой кнопкой

    if (mySwitch.available()) {                   // если получили какую-либо посылку от радиомодуля
        rcValue = mySwitch.getReceivedValue();    // конвертируем в число в десятичной системе, если !0, то поднят флаг
        mySwitch.resetAvailable();                // сбрасываем флаг доступности посылки от радиомодуля
        key_pressed_flag = 1;                     // поднимаем флаг, что кнопка вжатая
        #if DEBUG_SERIAL
            Serial.println("Кнопка нажата");
        #endif
        delay(100);                               // без задержки не коректно работает сброс досутпности в библиотеке
    }else{  
            if (now - lastMsg ‹ 0 ) lastMsg = 0;  // при переполнении millis() сработает и сбросит lastMsg, который будет обчень большим. @ можно проверить только через 50 дней работы            
            if (now - lastMsg › KEY_BUG)  {       // антидребезг RF кнопки
                    lastMsg = now;
                    key_pressed_flag = 0;         // опускаем флаг, кнопка не нажата
                    #if DEBUG_SERIAL
                        Serial.println("Кнопка отпущена");
                    #endif
            }
    }

    // если кнопка отпущена и время выполнения программы больше задержки лага и у нас есть какая-то посылка
    if( !key_pressed_flag && rcValue )   {
        #if DEBUG_RAW      // вывод сырых данных из RF модуля, вне зависимости забиндена кнопка или нет и кнопка это или просто помеха                        
            if( rcValue )   {
                Serial.print("RF = ");
                Serial.println(rcValue);
            }
        #endif

        for ( i=0; i‹10; i++ ) {    // перебираем известные ключи и сравниваем с полученной посылкой
         // обработка отпущеной кнопки 
        }
        rcValue = 0;    // если полученный код нам не известен, то обнуляем, что бы снова безполезно не входить в цикл
    }

    uartParce();
 
}
Реклама:
TechMike вне форума  
Непрочитано 03.03.2020, 14:07  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 1,047
Сказал спасибо: 90
Сказали Спасибо 96 раз(а) в 76 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Использовать секвенсор состояний. Например, когда принято решение о включении лампы, то переключаем секвенсор в состояние включено и запускаем таймер от "дурака". Т.е. если лампа включена, то выключить её можно не раньше определённого периода (например, 1 сек или другое значение). Когда сигнал идёт от пульта, тот же таймер запускаем на несколько меньшее значение (полсекунды или менее), а секвенсор находится в состоянии, например, "принимаю сигнал перед включением". С выключением всё зеркально.
parovoZZ вне форума  
Непрочитано 03.03.2020, 21:29  
TechMike
Вид на жительство
 
Регистрация: 02.11.2008
Сообщений: 316
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
TechMike на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от parovoZZ Посмотреть сообщение
Использовать секвенсор состояний. Например, когда принято решение о включении лампы, то переключаем секвенсор в состояние включено и запускаем таймер от "дурака". Т.е. если лампа включена, то выключить её можно не раньше определённого периода (например, 1 сек или другое значение). Когда сигнал идёт от пульта, тот же таймер запускаем на несколько меньшее значение (полсекунды или менее), а секвенсор находится в состоянии, например, "принимаю сигнал перед включением". С выключением всё зеркально.
Такое я делал на задержках, когда после изменения состояние лампы вводилась задержка в 1-2 секунды и только после этого можно было менять состояние лампы.
Это помогало от быстрого циклического переключения при зажатой радиокнопке, но далеко от идеала.

Хотелось бы что-то более удобное.
TechMike вне форума  
Непрочитано 03.03.2020, 22:11  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 1,047
Сказал спасибо: 90
Сказали Спасибо 96 раз(а) в 76 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от TechMike Посмотреть сообщение
Хотелось бы что-то более удобное.
Тогда модулировать несущую информацией о нажатой кнопке. По-другому никак.
parovoZZ вне форума  
Непрочитано 04.03.2020, 10:55  
TechMike
Вид на жительство
 
Регистрация: 02.11.2008
Сообщений: 316
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
TechMike на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от parovoZZ Посмотреть сообщение
Тогда модулировать несущую информацией о нажатой кнопке. По-другому никак.
Можно пример или на пальцах как это реализовывают?
TechMike вне форума  
Непрочитано 04.03.2020, 12:15  
gbdj
Вид на жительство
 
Регистрация: 11.11.2010
Сообщений: 458
Сказал спасибо: 20
Сказали Спасибо 78 раз(а) в 68 сообщении(ях)
gbdj на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от TechMike Посмотреть сообщение
Такое я делал на задержках, когда после изменения состояние лампы вводилась задержка в 1-2 секунды и только после этого можно было менять состояние лампы.
Это помогало от быстрого циклического переключения при зажатой радиокнопке, но далеко от идеала.

Хотелось бы что-то более удобное.
Считать надо с предыдущего изменеия состояния кнопки, а не один раз.
gbdj вне форума  
Непрочитано 04.03.2020, 12:54  
Yuri222
Почётный гражданин KAZUS.RU
 
Регистрация: 08.02.2005
Сообщений: 3,680
Сказал спасибо: 650
Сказали Спасибо 1,116 раз(а) в 817 сообщении(ях)
Yuri222 на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от TechMike Посмотреть сообщение
Хотелось бы что-то более
Получили с пульта сигнал "кнопка нажата". Пока кнопка нажата - пульт постоянно долбит этот сигнал. Выполнить команду, связанную с нажатием кнопки, и ожидать пропадания сигнала "кнопка нажата" в течение какого-то (антидребезгового) интервала времени. Это значит - кнопка нажата один раз - хоть ее жали секунду, хоть сколько угодно долго.
Теперь (после интервала, когда не было сигнала о нажатии кнопки) если придет снова сигнал "кнопка нажата" - это уже будет гарантированно следующее нажатие кнопки.
Yuri222 вне форума  
Непрочитано 04.03.2020, 14:30  
parovoZZ
Почётный гражданин KAZUS.RU
 
Регистрация: 15.11.2010
Сообщений: 1,047
Сказал спасибо: 90
Сказали Спасибо 96 раз(а) в 76 сообщении(ях)
parovoZZ на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от TechMike Посмотреть сообщение
Можно пример или на пальцах как это реализовывают?
Я делал так - нажата кнопка - ушёл пакет о том, какая кнопка и что она нажата. Отжали кнопку - опять пакет о том, что все кнопки отжаты. Но в таком случае необходимо рассылать несколько пакетов, чтобы гарантировать их доставку до приемника. Ну или использовать обратную связь.
parovoZZ вне форума  
Непрочитано 04.03.2020, 16:52  
TechMike
Вид на жительство
 
Регистрация: 02.11.2008
Сообщений: 316
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
TechMike на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от parovoZZ Посмотреть сообщение
Я делал так - нажата кнопка - ушёл пакет о том, какая кнопка и что она нажата. Отжали кнопку - опять пакет о том, что все кнопки отжаты. Но в таком случае необходимо рассылать несколько пакетов, чтобы гарантировать их доставку до приемника. Ну или использовать обратную связь.
Обратной связи нет и не на уровне железа не предусмотрено, иначе было бы проще.
TechMike вне форума  
Непрочитано 04.03.2020, 16:53  
TechMike
Вид на жительство
 
Регистрация: 02.11.2008
Сообщений: 316
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
TechMike на пути к лучшему
По умолчанию Re: Алгоритм устранения "дребезкга" радиовыключателя

Сообщение от Yuri222 Посмотреть сообщение
Получили с пульта сигнал "кнопка нажата". Пока кнопка нажата - пульт постоянно долбит этот сигнал. Выполнить команду, связанную с нажатием кнопки, и ожидать пропадания сигнала "кнопка нажата" в течение какого-то (антидребезгового) интервала времени. Это значит - кнопка нажата один раз - хоть ее жали секунду, хоть сколько угодно долго.
Теперь (после интервала, когда не было сигнала о нажатии кнопки) если придет снова сигнал "кнопка нажата" - это уже будет гарантированно следующее нажатие кнопки.
Логично и удобнее менять состояние лампы по отпусканию кнопки. Пусть ее хоть пол дня держат нажатой. Но на приемнике при этом сигнал о нажатой кнопке будет приходить не постоянно, а с некоторыми перерывами, которые по времени я не смог оценить и победить.

Последний раз редактировалось TechMike; 04.03.2020 в 17:14.
TechMike вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм преобразования CVSD (ADM) в PCM csm7 Цифровые сигнальные процессоры 0 04.02.2012 15:17
Алгоритм частотомера artyomugr Микроконтроллеры, АЦП, память и т.д 26 11.05.2011 15:42
Код Грея, алгоритм ассемблер? picavr Микроконтроллеры, АЦП, память и т.д 8 27.03.2009 04:39
Нужен алгоритм СRC с результатом 7бит AndryG Микроконтроллеры, АЦП, память и т.д 4 05.06.2007 18:51
Алгоритм билдер для ПИК контроллеров. Gladkih Микроконтроллеры, АЦП, память и т.д 9 24.02.2007 18:41


Часовой пояс GMT +4, время: 01:13.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot