Прерывания и дребезг кнопки Arduino

Прерывания Arduino — функция прерывания

Стандартная функция внешнего прерывания Arduino
attachInterrupt(intrrupt_pin, function, mode)
Значения аргуменотов функции прерывания
intrrupt_pin – для Arduino Nano 0 – для пина D2, 1 – для пина D3
function — функция, которая не принимает и не возвращает значения;
mode — режимы обработки:
RISING – срабатывает один раз при изменении сигнала с LOW на HIGH;
FALLING – срабатывает один раз при изменении сигнала с HIGH на LOW;
LOW – срабатывает при низком уровне сигнала, 0 или LOW;
CHANGE – срабатывает при изменении сигнала с HIGH на LOW или в обратном порядке, то есть при смене сигнала.

Таймеры Arduino Nano

Timer0 — применяются millis (), micros (), delay () D5 и D6
Timer1 — применяются для Servo D9 и D10
Timer2 — применяется Tone и ШИМ D11 и D13

Скетч прерывания Arduino и использованием кнопки

volatile int counter = 0; 
volatile boolean isFlag = false; 

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); 
  attachInterrupt(0, noise, FALLING);
}

volatile uint32_t noise_time;
void noise() {
  counter++; 
  isFlag = true;
  // 150 понижаем дребезг кнопки, digitalRead - узнаем состояние порта D2
  if (millis() - noise_time >= 120 && digitalRead(2))
  {
    noise_time = millis();
  }
//   if (millis() - 100 > noise_time && digitalRead(2))
//  {
//    noise_time = millis();
//  }
}

void loop() {
  if (isFlag) {
    isFlag = false;    
    Serial.println("Прерывание");
    Serial.println(counter);
  } 
    delay(2000);              
}

Устранение дребезга кнопки Arduino

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

резисторы и конденсатор убрать дребезги кнопки схема

Скетч для программного удаления дребезга кнопки Arduino

int pin = 2; 
int counter=0;
bool isflag       = LOW;
bool state_button_last = LOW;

void setup() {
   Serial.begin(9600);
  pinMode(pin, INPUT);
}

bool noise() {
  // HIGH означает что кнопка нажата
  bool state_button = digitalRead(pin);
  if (state_button != state_button_last) {                  
    delay(10);                                  
    state_button = digitalRead(pin);           
  }
  return state_button;
}

void loop() {
  int state_button_now = noise();              
  if (state_button_last == LOW && state_button_now == HIGH) { 
    isflag = !isflag;                              
    counter++;
    Serial.println(counter);                
  }
  state_button_last = state_button_now;                   
}
1588

Leave a Reply

Ваш адрес email не будет опубликован.