Это старая версия документа!


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

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

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

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

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

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

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

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

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

  • switchState - переменная для хранения текущего уровня считанного сигнала с пина.
  • oldSwitchState - будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие.
  • lightsOn будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку.

/* Считываем сосотояние кнопки и проверяем факт нажатия:

  1. button_value = Button.value()
  2. if old_button_value != button_value and button_value == 1:

*/ выражение switchState = digitalRead(BUTTON); записывает в переменную switchState текущий уровень сигнала на пине кнопки, далее идет проверка события «была ли нажата кнопка». в первом условии оператора if сравниваются значения переменных Выражение old_button_value != button_value проверяет факт того, что новое состояние кнопки не равно предыдущему. Оператор != — оператор неравенства. Выражение button_value == 1 проверяет текущее состояние кнопки. Это выражение истинно, когда кнопка нажата. А между этими двумя выражениями мы применили логический оператор and. Он переводится как И, возвращает истину когда оба выражения (слева и справа от него) истины. Если хотя бы одно из них не выполняется, то и все выражение целиком ложно.

Иными словами проверяем условие того, что состояние кнопки изменилось И, что новым состоянием кнопки является нажатое состояние. Это выражение позволяет выявить факт нажатия на кнопку.

После регистрации факта нажатии на кнопку нам нужно изменить состояние светодиода на противоположное. Если он был включен — выключаем. Если выключен — включаем.

Напоследок обновляем старое состояние состояние кнопки.

  1. old_button_value = button_value

Дополнительные задания

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