Код нашей обычной программы исполняется инструкция за инструкцией и если мы, например, проверяем состояние датчика, мы к нему обратимся только в те моменты, когда очередь дойдет до соответствующей инструкции. Однако мы можем использовать прерывания:
по наступлении определенного события
на определенном порту ход программы будет приостанавливаться для выполнения
определенной функции, а затем программа продолжит исполняться с того места, где была приостановлена.
Arduino Uno позволяет делать прерывания на портах 2 и 3.
В setup() прописывается инструкция attachInterrupt(interrupt, action, event), где
interrupt может принимать значения INT0 или INT1 для портов 2 и 3 соответственно
action — имя функции, которая будет вызываться при наступлении события
event — событие, которое мы отслеживаем. Может принимать значение RISING (изменение от низкого уровня сигнала к высокому, от 0 к 1), FALLING (от высокого уровня к низкому, от 1 к 0),CHANGE (от 0 к 1 или от 1 к 0), LOW (при низком уровне сигнала).
Глобальные переменные, к которым мы обращаемся из функции, обрабатывающей прерывания, должны объявляться с использованием ключевого слова volatile, как в данном экспериментеvolatile int score = 0.
Внутри функции, вызываемой по прерыванию, нельзя использовать delay().
Функция abs(value) возвращает абсолютное значение value (значение по модулю). Обратите внимание, что функция может сработать некорректно, если передавать ей выражение, которое еще не вычислено, например abs(++a), лучше передавать ей просто переменную.
Функция min(val1, val2) вернет меньшее из val1 и val2.
Функция max(val1, val2) вернет большее из val1 и val2.
В данном эксперименте мы вычисляем значение, которое записывается на светодиоды, прямо вdigitalWrite()
Мы уже знакомы с логическим «и» (&&). Нередко нужен оператор «логическое «или»: ||. Он возвращает «истину», если хотя бы один из операндов имеет значение «истина». false || falseвернет false, а true || true, true || false и false || true вернут true.
Мы использовали while(true){} для того, чтобы loop() остановился после того, как кто-то выиграл: у while всегда истинное условие и он бесконечно ничего не выполняет!