Попробуем имитировать кнопку с фиксацией. После первого нажатия на кнопку светодиод зажигается, а гаснет после второго нажатия. Для этой цели можно применять кнопку с механической фиксацией положения включено- выключено, но мы реализуем ее программными средствами. Просто при обработке нажатия на кнопку будем учитывать ее предыдущее состояние и запоминать его.
Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части
Рисунок 1. Электрическая принципиальная схема эксперимента
// инициализация констант #define LED 2 //определение константы LED с номером пина 2 #define BUTTON 12 //определение константы BUTTON с номером пина 12 // инициализация переменных int switchState = 0; // актуальный статус кнопки int oldSwitchState = 0; // статус последней проверки кнопки boolean lightsOn = false; // статус светодиода on = true или off = false void setup() { pinMode(BUTTON, INPUT); pinMode(LED, OUTPUT); } void loop() { switchState = digitalRead(BUTTON); if (switchState != oldSwitchState) { oldSwitchState = switchState; if (switchState == HIGH) { lightsOn = !lightsOn; } } if(lightsOn) { digitalWrite(LED, HIGH); // зажигаем светодиод } else { digitalWrite(LED, LOW); // гасим светодиод } }
в начале программы определим две константы LED
и BUTTON
для хранения номеров пинов к которым подключены кнопка и светодиод.
далее для реализации задуманного нам понадобятся переменные:
switchState
- переменная для хранения текущего уровня считанного сигнала с пина.oldSwitchState
- будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие.lightsOn
будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку.
выражение switchState = digitalRead(BUTTON);
записывает в переменную switchState текущий уровень сигнала на пине кнопки, далее идет проверка события «была ли нажата кнопка».
в строке 18 оператором if сравниваются переменные switchState и oldSwitchState в которые записан текущий сигнал и сигнал считанный и записанный ранее.
Оператор !=
— оператор неравенства.
Если значение переменной switchState не равно значению переменной oldSwitchState (была нажата кнопка), то мы перезаписываем старое значение на новое и переходим к проверке того, какой именно поступает текущий сигнал. Если сигнал соответствует HIGH, то значение переменной lightsOn необходимо изменить на противоположное, поскольку была нажата кнопка.
Обратите внимание, что эта проверка происходит только если выполняется условие предыдущей проверки.
третий оператор if проверяет значение переменной lightsOn
, если значение равно true то выполняется выражение digitalWrite(LED, HIGH);
, светодиод загорается, и будет гореть до тех пор пока не будет нажата кнопка, после этого значение переменной измениться на false, и выполнится выражение digitalWrite(LED, LOW);
, и светодиод погаснет.
Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.
Данную проблему и ее решение рассмотрим в следующем эксперименте.