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