Menu
CoddyTech

Нажатие, которое пропускает цикл

Часть раздела Отсчёт времени без 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.

challenge icon

Задание

Легко

Этот сигнал тревоги проверяет кнопку только раз в 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);
  }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Отсчёт времени без delay

Потренируйтесь самостоятельно: Песочница Arduino