← Миксер | Оглавление | Светильник с кнопочным управлением →
В этом эксперименте мы делаем из тактовой кнопки триггер, борясь с «дребезгом».
#define BUTTON_PIN 3 #define LED_PIN 13 boolean buttonWasUp = true; // была ли кнопка отпущена? boolean ledEnabled = false; // включен ли свет? void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // определить момент «клика» несколько сложнее, чем факт того, // что кнопка сейчас просто нажата. Для определения клика мы // сначала понимаем, отпущена ли кнопка прямо сейчас... boolean buttonIsUp = digitalRead(BUTTON_PIN); // ...если «кнопка была отпущена и (&&) не отпущена сейчас»... if (buttonWasUp && !buttonIsUp) { // ...может это «клик», а может и ложный сигнал (дребезг), // возникающий в момент замыкания/размыкания пластин кнопки, // поэтому даём кнопке полностью «успокоиться»... delay(10); // ...и считываем сигнал снова buttonIsUp = digitalRead(BUTTON_PIN); if (!buttonIsUp) { // если она всё ещё нажата... // ...это клик! Переворачиваем сигнал светодиода ledEnabled = !ledEnabled; digitalWrite(LED_PIN, ledEnabled); } } // запоминаем последнее состояние кнопки для новой итерации buttonWasUp = buttonIsUp; }
INPUT_PULLUP
, при нажатии на кнопку на данном входе мы будем получать 0. Поэтому мы получим значение true
(«истина») в булевой переменной buttonIsUp
(«кнопка отпущена»), когда кнопка отпущена.&&
(«и») возвращает значение «истина» только в случае истинности обоих его операндов. Взглянем на так называемую таблицу истинности для выражения buttonWasUp && !buttonIsUp
(«кнопка была отпущена и кнопка не отпущена»): buttonWasUp | buttonIsUp | !buttonIsUp | buttonWasUp && !buttonIsUp |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 0 |
Здесь рассмотрены все возможные сочетания предыдущего и текущего состояний кнопки и мы видим, что наш условный оператор if
сработает только в случае, когда кнопка нажата только что: предыдущее состояние 1 («была отпущена»), а текущее 0 («не отпущена»).
digitalWrite
не конкретное значение HIGH
или LOW
, а просто булеву переменную ledEnabled
. В зависимости от того, какое значение было для нее вычислено, светодиод будет зажигаться или гаситься.buttonWasUp = buttonIsUp
сохраняет текущее состояние кнопки в переменную предыдущего состояния, ведь на следующей итерации loop
текущее состояние уже станет историей.&&
возвращает значение «истина»?digitalWrite
?← Миксер | Оглавление | Светильник с кнопочным управлением →