===== Эксперимент 5. Эмуляция кнопки с фиксацией ===== Попробуем имитировать кнопку с фиксацией. После первого нажатия на кнопку светодиод зажигается, а гаснет после второго нажатия. Для этой цели можно применять кнопку с механической фиксацией положения включено- выключено, но мы реализуем ее программными средствами. Просто при обработке нажатия на кнопку будем учитывать ее предыдущее состояние и запоминать его. ==== Схема эксперимента ==== Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части {{ :products:ardu:exp3.4.png?nolink |}} //Рисунок 1. Электрическая принципиальная схема эксперимента// Соберем эту схему: {{ :products:ardu:exp03.png?direct&600 |}} //Рисунок 2. Монтажная схема эксперимента// ==== Программный код эксперимента ==== // инициализация констант #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);'', и светодиод погаснет.\\ Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.\\ Данную проблему и ее решение рассмотрим в следующем эксперименте.