Дребезг кнопки на аналоговом входе

Alexej79
Offline
Зарегистрирован: 14.03.2017

Дело в том что до библиотек я не дошёл. Я только начал изучение ардуино.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

У меня такой вопрос созрел, можно ли аппаратным способом убрать дребезг кнопок? К примеру через кнопку пускаем 5v. Подтяжка к земле и добавить конденсатор. Что скажете? Уберет он скачки? И как правильно его подключать, какой тип и какой номинал?

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ну и конденсатор на землю воткните. Номинал зависит от потребного быстродействия , подбирайте, я бы начал с 0.1 мкф

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

inspiritus пишет:

Ну и конденсатор на землю воткните. Номинал зависит от потребного быстродействия , подбирайте, я бы начал с 0.1 мкф

а, почему на землю?

а, не и на землю, и на питание?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Baks пишет:
У меня такой вопрос созрел, можно ли аппаратным способом убрать дребезг кнопок? К примеру через кнопку пускаем 5v. Подтяжка к земле и добавить конденсатор. Что скажете? Уберет он скачки? И как правильно его подключать, какой тип и какой номинал?
Любой конденсатор на кнопке это потребитель электроэнергии. И чем больше емкость и чаще нажатие кнопки , тем больше потребление.  Для любительской схемотехники это ерунда, но для промышленной это сокращение времени работы на аккумуляторе.

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

Я на акамуляторах пока ничего не собирал еще, и как понимаю на блоке питания это применимо? Наверное глупый вопрос но а если конденсатор установить так... Разорвать дорожку перед самым пином ардуинки и туда его припоять? Так не лучше будет? Или лучше все таки ставить в параллель подтягивающего резистора к земле? И да я помню что кондеры долго не живут, по этому стараюсь избегать их...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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 (из набора Матрёшка).

bwn
Offline
Зарегистрирован: 25.08.2014

Baks пишет:
И да я помню что кондеры долго не живут, по этому стараюсь избегать их...

Это вы радикальненько. Что вы понимаете под "долго не живут"? У меня в загашниках имеются слюдяные, годов 60 -70, все вполне живые. Что будете делать с емкостями, которые разведены в чипах? Короче отбросьте кондерофобии и используйте по мере надобности.

mrzevs
Offline
Зарегистрирован: 25.02.2018

qwone пишет:

С дребезгом на на аналоговом входе я борюсь так

/* 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);// сюда можно воткнуть обработчик события
  }
}

 

Как можно в вашем коде сделать проверку на длительное нажатие кнопки?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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 байт.
*/

ПС: Понимаю . У меня просто очередной раз поменялся подход к стилю программы.

mrzevs
Offline
Зарегистрирован: 25.02.2018

Нужен именно на аналоговом. У меня модуль с аналоговыми кнопками с резисторами. Пока ардуино только осваиваю.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

тогда надо прикручивать к этому скетчу еще и долгое удержание. Но это на практике не надо.

#11

ПС: не думаю что моя тема будет очень понятна начинающим.

mrzevs
Offline
Зарегистрирован: 25.02.2018

Спасибо, поизучаю. С программирование знаком, хоть и давно не занимался.