У меня такой вопрос созрел, можно ли аппаратным способом убрать дребезг кнопок? К примеру через кнопку пускаем 5v. Подтяжка к земле и добавить конденсатор. Что скажете? Уберет он скачки? И как правильно его подключать, какой тип и какой номинал?
У меня такой вопрос созрел, можно ли аппаратным способом убрать дребезг кнопок? К примеру через кнопку пускаем 5v. Подтяжка к земле и добавить конденсатор. Что скажете? Уберет он скачки? И как правильно его подключать, какой тип и какой номинал?
Любой конденсатор на кнопке это потребитель электроэнергии. И чем больше емкость и чаще нажатие кнопки , тем больше потребление. Для любительской схемотехники это ерунда, но для промышленной это сокращение времени работы на аккумуляторе.
Я на акамуляторах пока ничего не собирал еще, и как понимаю на блоке питания это применимо? Наверное глупый вопрос но а если конденсатор установить так... Разорвать дорожку перед самым пином ардуинки и туда его припоять? Так не лучше будет? Или лучше все таки ставить в параллель подтягивающего резистора к земле? И да я помню что кондеры долго не живут, по этому стараюсь избегать их...
поэкспериментировав с разными схемами, пришёл к выводу -- RC цепочка не всегда полезна. В некоторых случаях количество ложных срабатываний, наоборот, возрастало. Но решение оказалось ещё проще -- нужно убрать резистор, а конденсотор "вешать" параллельно кнопке. В большинстве случаев хватало конденсатора 100 nF (из набора Матрёшка).
И да я помню что кондеры долго не живут, по этому стараюсь избегать их...
Это вы радикальненько. Что вы понимаете под "долго не живут"? У меня в загашниках имеются слюдяные, годов 60 -70, все вполне живые. Что будете делать с емкостями, которые разведены в чипах? Короче отбросьте кондерофобии и используйте по мере надобности.
Дело в том что до библиотек я не дошёл. Я только начал изучение ардуино.
У меня такой вопрос созрел, можно ли аппаратным способом убрать дребезг кнопок? К примеру через кнопку пускаем 5v. Подтяжка к земле и добавить конденсатор. Что скажете? Уберет он скачки? И как правильно его подключать, какой тип и какой номинал?
Ну и конденсатор на землю воткните. Номинал зависит от потребного быстродействия , подбирайте, я бы начал с 0.1 мкф
Ну и конденсатор на землю воткните. Номинал зависит от потребного быстродействия , подбирайте, я бы начал с 0.1 мкф
а, почему на землю?
а, не и на землю, и на питание?
Я на акамуляторах пока ничего не собирал еще, и как понимаю на блоке питания это применимо? Наверное глупый вопрос но а если конденсатор установить так... Разорвать дорожку перед самым пином ардуинки и туда его припоять? Так не лучше будет? Или лучше все таки ставить в параллель подтягивающего резистора к земле? И да я помню что кондеры долго не живут, по этому стараюсь избегать их...
http://forum.amperka.ru/threads/%D0%94%D1%80%D0%B5%D0%B1%D0%B5%D0%B7%D0%B3-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8.6607/
Но я за программное подавление дребезга
Цитата от туда:UPD:
поэкспериментировав с разными схемами, пришёл к выводу -- RC цепочка не всегда полезна. В некоторых случаях количество ложных срабатываний, наоборот, возрастало. Но решение оказалось ещё проще -- нужно убрать резистор, а конденсотор "вешать" параллельно кнопке. В большинстве случаев хватало конденсатора 100 nF (из набора Матрёшка).
Это вы радикальненько. Что вы понимаете под "долго не живут"? У меня в загашниках имеются слюдяные, годов 60 -70, все вполне живые. Что будете делать с емкостями, которые разведены в чипах? Короче отбросьте кондерофобии и используйте по мере надобности.
С дребезгом на на аналоговом входе я борюсь так
/* AnalogBounce.ino #1 кнопка1 -> A0 (Analog_pin) 0 нажата /1 нет */ // #1 const int Analog_pin = 0; // вывод кнопки int Analog_new,Analog;// значение на кнопке без дребезга (новое и старое) const int delta = 5; bool bounce = 0; // антидребезговый флаг void setup() { Serial.begin(9600); // #1 Analog_new = analogRead(Analog_pin); } void loop() { // #1 static uint32_t past_1 = 0 ; Analog_new = analogRead(Analog_pin); if (!bounce && (Analog+delta < Analog_new || Analog-delta > Analog_new)) { // если прошел фронт изм на выводн bounce = 1; // выставить флаг past_1 = millis(); // сделать временую засветку } else if ( bounce &&( millis() - past_1) >= 40 ) { // если прошло антидребезговое время bounce = 0; // то снять фл Analog = Analog_new; // прочитать реальное значение на выводе Serial.println(Analog);// сюда можно воткнуть обработчик события } }Как можно в вашем коде сделать проверку на длительное нажатие кнопки?
mrzevs.Обязательно на аналоговом входе? Или лучше на цифровом.
/**/ unsigned long mill;// переменная для millis() typedef void (*pDo)() ;// тип -функция обработчик //------Cl_BtnLong---------------------- // класс кнопка class Cl_BtnLong { protected: const byte pin; pDo Do1, Do2; //обработчик короткий,длиный bool bounce = 0; bool btn = 1, oldBtn; unsigned long past; const uint32_t time = 500 ; bool flag = 0; uint32_t past_flag = 0 ; public: /*конструктор*/ Cl_BtnLong(byte pin_, pDo Do1_, pDo Do2_) : pin(pin_), Do1(Do1_), Do2(Do2_) {} /*инициализация-вставить в setup()*/ void init() { pinMode(pin, INPUT_PULLUP); } /*работа-вставить в loop()*/ void run() { bool newBtn = digitalRead(pin); if (!bounce && newBtn != btn) { bounce = 1; past = mill; } if (bounce && mill - past >= 10) { bounce = 0 ; oldBtn = btn; btn = newBtn; if (!btn && oldBtn) { flag = 1; past_flag = mill; } if (!oldBtn && btn && flag && mill - past_flag < time ) { flag = 0; Do1();// короткое нажатие } } if (flag && mill - past_flag >= time ) { flag = 0; Do2();//длиное нажатие } } }; //-----Компоновка---------------------- void DoBtn1() { Serial.println("Do_Btn1"); } void DoBtn2() { Serial.println("DoLong_Btn1"); } Cl_BtnLong Btn1(/*пин*/2,/*обработчик короткого*/DoBtn1,/*обработчик длиного*/DoBtn2); //-----main---------------------- void setup() { Serial.begin(9600); Btn1.init(); } void loop() { mill = millis(); Btn1.run(); } /*Скетч использует 2242 байт (7%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 231 байт (11%) динамической памяти, оставляя 1817 байт для локальных переменных. Максимум: 2048 байт. */ПС: Понимаю . У меня просто очередной раз поменялся подход к стилю программы.
Нужен именно на аналоговом. У меня модуль с аналоговыми кнопками с резисторами. Пока ардуино только осваиваю.)
тогда надо прикручивать к этому скетчу еще и долгое удержание. Но это на практике не надо.
#11
ПС: не думаю что моя тема будет очень понятна начинающим.
Спасибо, поизучаю. С программирование знаком, хоть и давно не занимался.