Содержание

Эксперимент 5. Эмуляция кнопки с фиксацией

Попробуем имитировать кнопку с фиксацией. После первого нажатия на кнопку светодиод зажигается, а гаснет после второго нажатия. Для этой цели можно применять кнопку с механической фиксацией положения включено- выключено, но мы реализуем ее программными средствами. Просто при обработке нажатия на кнопку будем учитывать ее предыдущее состояние и запоминать его.

Схема эксперимента

Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части

Рисунок 1. Электрическая принципиальная схема эксперимента

Соберем эту схему: Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Exp5
  1. // инициализация констант
  2.  
  3. #define LED 2 //определение константы LED с номером пина 2
  4. #define BUTTON 12 //определение константы BUTTON с номером пина 12
  5.  
  6. // инициализация переменных
  7. int switchState = 0; // актуальный статус кнопки
  8. int oldSwitchState = 0; // статус последней проверки кнопки
  9. boolean lightsOn = false; // статус светодиода on = true или off = false
  10.  
  11. void setup() {
  12. pinMode(BUTTON, INPUT);
  13. pinMode(LED, OUTPUT);
  14. }
  15.  
  16. void loop() {
  17. switchState = digitalRead(BUTTON);
  18. if (switchState != oldSwitchState) {
  19. oldSwitchState = switchState;
  20. if (switchState == HIGH) {
  21. lightsOn = !lightsOn;
  22. }
  23. }
  24. if(lightsOn) {
  25. digitalWrite(LED, HIGH); // зажигаем светодиод
  26. }
  27. else {
  28. digitalWrite(LED, LOW); // гасим светодиод
  29. }
  30. }

в начале программы определим две константы LED и BUTTON для хранения номеров пинов к которым подключены кнопка и светодиод.
далее для реализации задуманного нам понадобятся переменные:

выражение switchState = digitalRead(BUTTON); записывает в переменную switchState текущий уровень сигнала на пине кнопки, далее идет проверка события «была ли нажата кнопка». в строке 18 оператором if сравниваются переменные switchState и oldSwitchState в которые записан текущий сигнал и сигнал считанный и записанный ранее. Оператор != — оператор неравенства. Если значение переменной switchState не равно значению переменной oldSwitchState (была нажата кнопка), то мы перезаписываем старое значение на новое и переходим к проверке того, какой именно поступает текущий сигнал. Если сигнал соответствует HIGH, то значение переменной lightsOn необходимо изменить на противоположное, поскольку была нажата кнопка.
Обратите внимание, что эта проверка происходит только если выполняется условие предыдущей проверки.
третий оператор if проверяет значение переменной lightsOn, если значение равно true то выполняется выражение digitalWrite(LED, HIGH);, светодиод загорается, и будет гореть до тех пор пока не будет нажата кнопка, после этого значение переменной измениться на false, и выполнится выражение digitalWrite(LED, LOW);, и светодиод погаснет.

Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.
Данную проблему и ее решение рассмотрим в следующем эксперименте.