прерывание через attachInterrupt криво работает

verhmax
Offline
Зарегистрирован: 21.12.2014

добрый день форумчане, сделал прерывание через attachInterrupt

повесил на кнопку по схеме

код

const int buttonPin = 2;
volatile int buttonState = 0;
volatile int program=1;
attachInterrupt(0, blink, CHANGE);
void loop(){
blink();
}

void blink(){
   buttonState = digitalRead(buttonPin); 
  if (buttonState == HIGH) {  
     if(program==2) {program=1;delay(10);}
     else{program++;delay(10);}
  }
  else {}

    switch (program) {
    case 1: blink_one_led(); break;
    case 2: white(); break;
    }
}

проблема заключается в:

при нажатии на кнопку все работает корректно, но иногда я только дотрагиваюсь к кнопке, или к корпусу кнопки, не нажимая, и функция прерывания срабатывает. бывает и такое, что срабатывает сразу 2-3 раза, и тем самым перескакивает много режимов. что можно сделать с кнопкой, чтоб она срабатывала именно от нажатия, а не от наводок?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

А зачем вы читаете состояние кнопки? Если прерывание инициировано - значит кнопка уже нажата.

Да и deley() внутри прерывания - чревато...

Да и вызов других функций из прерывания чреват...

А уж все вместе...

Я уже молчу про вызов обработчика прерывания в loop().