Menu
CoddyTech

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);
challenge icon

Задание

Легко

Кнопка подключена к контакту 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);
}
quiz iconПроверьте себя

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

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

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