Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков. |
03.03.2020, 12:20
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Алгоритм устранения "дребезкга" радиовыключателя
Доброго дня.
Собрал радиовыключатель для люстры 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();
} |
|
|
|
|
03.03.2020, 14:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Использовать секвенсор состояний. Например, когда принято решение о включении лампы, то переключаем секвенсор в состояние включено и запускаем таймер от "дурака". Т.е. если лампа включена, то выключить её можно не раньше определённого периода (например, 1 сек или другое значение). Когда сигнал идёт от пульта, тот же таймер запускаем на несколько меньшее значение (полсекунды или менее), а секвенсор находится в состоянии, например, "принимаю сигнал перед включением". С выключением всё зеркально.
|
|
|
|
03.03.2020, 21:29
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от parovoZZ
|
Использовать секвенсор состояний. Например, когда принято решение о включении лампы, то переключаем секвенсор в состояние включено и запускаем таймер от "дурака". Т.е. если лампа включена, то выключить её можно не раньше определённого периода (например, 1 сек или другое значение). Когда сигнал идёт от пульта, тот же таймер запускаем на несколько меньшее значение (полсекунды или менее), а секвенсор находится в состоянии, например, "принимаю сигнал перед включением". С выключением всё зеркально.
|
Такое я делал на задержках, когда после изменения состояние лампы вводилась задержка в 1-2 секунды и только после этого можно было менять состояние лампы.
Это помогало от быстрого циклического переключения при зажатой радиокнопке, но далеко от идеала.
Хотелось бы что-то более удобное.
|
|
|
|
03.03.2020, 22:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от TechMike
|
Хотелось бы что-то более удобное.
|
Тогда модулировать несущую информацией о нажатой кнопке. По-другому никак.
|
|
|
|
04.03.2020, 10:55
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от parovoZZ
|
Тогда модулировать несущую информацией о нажатой кнопке. По-другому никак.
|
Можно пример или на пальцах как это реализовывают?
|
|
|
|
04.03.2020, 12:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 11.11.2010
Адрес: РФ
Сообщений: 1,051
Сказал спасибо: 136
Сказали Спасибо 209 раз(а) в 160 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от TechMike
|
Такое я делал на задержках, когда после изменения состояние лампы вводилась задержка в 1-2 секунды и только после этого можно было менять состояние лампы.
Это помогало от быстрого циклического переключения при зажатой радиокнопке, но далеко от идеала.
Хотелось бы что-то более удобное.
|
Считать надо с предыдущего изменеия состояния кнопки, а не один раз.
|
|
|
|
04.03.2020, 12:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.02.2005
Адрес: Минск, Беларусь
Сообщений: 8,046
Сказал спасибо: 2,775
Сказали Спасибо 2,726 раз(а) в 2,015 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от TechMike
|
Хотелось бы что-то более
|
Получили с пульта сигнал "кнопка нажата". Пока кнопка нажата - пульт постоянно долбит этот сигнал. Выполнить команду, связанную с нажатием кнопки, и ожидать пропадания сигнала "кнопка нажата" в течение какого-то (антидребезгового) интервала времени. Это значит - кнопка нажата один раз - хоть ее жали секунду, хоть сколько угодно долго.
Теперь (после интервала, когда не было сигнала о нажатии кнопки) если придет снова сигнал "кнопка нажата" - это уже будет гарантированно следующее нажатие кнопки.
|
|
|
|
04.03.2020, 14:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от TechMike
|
Можно пример или на пальцах как это реализовывают?
|
Я делал так - нажата кнопка - ушёл пакет о том, какая кнопка и что она нажата. Отжали кнопку - опять пакет о том, что все кнопки отжаты. Но в таком случае необходимо рассылать несколько пакетов, чтобы гарантировать их доставку до приемника. Ну или использовать обратную связь.
|
|
|
|
04.03.2020, 16:52
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от parovoZZ
|
Я делал так - нажата кнопка - ушёл пакет о том, какая кнопка и что она нажата. Отжали кнопку - опять пакет о том, что все кнопки отжаты. Но в таком случае необходимо рассылать несколько пакетов, чтобы гарантировать их доставку до приемника. Ну или использовать обратную связь.
|
Обратной связи нет и не на уровне железа не предусмотрено, иначе было бы проще.
|
|
|
|
04.03.2020, 16:53
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Алгоритм устранения "дребезкга" радиовыключателя
Сообщение от Yuri222
|
Получили с пульта сигнал "кнопка нажата". Пока кнопка нажата - пульт постоянно долбит этот сигнал. Выполнить команду, связанную с нажатием кнопки, и ожидать пропадания сигнала "кнопка нажата" в течение какого-то (антидребезгового) интервала времени. Это значит - кнопка нажата один раз - хоть ее жали секунду, хоть сколько угодно долго.
Теперь (после интервала, когда не было сигнала о нажатии кнопки) если придет снова сигнал "кнопка нажата" - это уже будет гарантированно следующее нажатие кнопки.
|
Логично и удобнее менять состояние лампы по отпусканию кнопки. Пусть ее хоть пол дня держат нажатой. Но на приемнике при этом сигнал о нажатой кнопке будет приходить не постоянно, а с некоторыми перерывами, которые по времени я не смог оценить и победить.
Последний раз редактировалось TechMike; 04.03.2020 в 17:14.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:47.
|
|