Прерывания 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; }