FALLING, RISING и CHANGE
Часть раздела Отсчёт времени без delay путешествия по Arduino на Coddy. Урок 13 из 18.
У Uno есть два вывода, которые могут вызвать прерывание: вывод 2 и вывод 3. Кнопку, для которой нужно прерывание, необходимо подключить к одному из них. Внутри микросхемы это прерывания 0 и 1, поэтому пусть digitalPinToInterrupt() преобразует номер вывода в номер прерывания. Вызов attachInterrupt(3, ...) запрашивает прерывание 3, которого у Uno нет, поэтому ничего не происходит.
Последняя часть attachInterrupt() указывает, на какое изменение реагировать:
FALLING: вывод переключается сHIGHнаLOW(при подтяжке вверх — нажатие)RISING: вывод переключается сLOWнаHIGH(отпускание)CHANGE: любое из этих изменений
При CHANGE ISR запускается и при нажатии, и при отпускании. Он считывает состояние вывода, чтобы определить, какое из событий произошло:
void onChange() {
if (digitalRead(buttonPin) == LOW) {
// кнопку нажали
} else {
// кнопку отпустили
}
}
attachInterrupt(digitalPinToInterrupt(buttonPin), onChange, CHANGE);Задание
ЛегкоКнопка подключена к контакту 3, а loop() занят медленной задачей. Сделай так, чтобы светодиод на контакте 13 мгновенно реагировал на кнопку:
- в
onChange()считай состояние кнопки:LOWзажигает светодиод,HIGHвыключает его - привяжи
onChange()к контакту кнопки с помощьюCHANGE
Нажми Run, удерживай и отпусти кнопку, затем нажми Check.
Попробуйте сами
const int ledPin = 13;
const int buttonPin = 3;
// Выполняется каждый раз, когда меняется состояние вывода кнопки.
void onChange() {
// включи светодиод, когда кнопка нажата, и выключи, когда она отпущена
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// здесь привяжи onChange() к выводу кнопки
}
void loop() {
// медленная задача: оставь её без изменений
Serial.println("working");
delay(2000);
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Отсчёт времени без delay
1millis()
Часы на millis()Время в unsigned longМигание без задержкиДва светодиода, две скоростиМигание и переключение кнопкойСвет по таймеру4Точное измерение времени
Измерение с помощью micros()Когда millis() переполняетсяСекундомер с кнопкой3Прерывания
Нажатие, которое пропускает циклFALLING, RISING и CHANGEОбщий доступ с volatileПодсчёт нажатий с помощью прерыванияПотренируйтесь самостоятельно: Песочница Arduino