Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
products:laboratory_iot_с:exp5 [2024/11/12 17:20] – [Программный код эксперимента] labuser30products:laboratory_iot_с:exp5 [Дата неизвестна] (текущий) – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1
Строка 1: Строка 1:
-===== Эксперимент 5. Эмуляция кнопки с фиксацией ===== 
- 
-Попробуем имитировать кнопку с фиксацией. После первого нажатия на кнопку светодиод зажигается, а гаснет после второго нажатия. Для этой цели можно применять кнопку с механической фиксацией положения включено- выключено, но мы реализуем ее программными средствами. Просто при обработке нажатия на кнопку будем учитывать ее предыдущее состояние и запоминать его. 
-==== Схема эксперимента ==== 
-Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части 
- 
-{{ :products:esp-iot:exp3.4.png?nolink |}} 
-//Рисунок 1. Электрическая принципиальная схема эксперимента// 
- 
-На рисунке изображен токоограничительный резистор последовательно со светодиодом. При сборке схемы мы не будем устанавливать его сами так как он уже установлен на плате конструктора. 
- 
-Соберем эту схему: 
-{{ :products:esp-iot:exp3.png?direct&600 |}} 
-//Рисунок 2. Монтажная схема эксперимента// 
- 
-==== Программный код эксперимента ==== 
- 
-<file arduino Exp5.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-#define BUTTON_PIN 16 
-#define LED_PIN 0 
- 
-bool button_state = LOW; 
-bool button_old_state = LOW; 
-bool led_state = LOW;  
- 
-void setup() { 
-  pinMode(LED_PIN, OUTPUT); 
-  pinMode(BUTTON_PIN, INPUT); 
-} 
- 
-void loop() { 
-  button_state = digitalRead(BUTTON_PIN); 
-  if (button_old_state != button_state and button_state == 1) { 
-    if (led_state) { 
-      digitalWrite(LED_PIN, LOW); 
-      led_state = LOW; 
-    } else { 
-      digitalWrite(LED_PIN, HIGH); 
-      led_state = HIGH; 
-    } 
-  } 
-  button_old_state = button_state; 
-} 
-</file> 
- 
-Создадим две новые переменные:  
-  * ''button_old_state'' будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие. 
-  * ''led_state'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку. 
- 
-Считываем состояние кнопки и проверяем факт нажатия: 
-<code arduino [enable_line_numbers="2", start_line_numbers_at="14"]> 
-  button_state = digitalRead(BUTTON_PIN); 
-  if (button_old_state != button_state and button_state == 1) 
-</code> 
- 
-Выражение ''button_old_state != button_state'' проверяет факт того, что новое состояние кнопки не равно предыдущему. Оператор ''!='' — оператор неравенства. Выражение ''button_value == 1'' проверяет текущее состояние кнопки. Это выражение истинно, когда кнопка нажата. А между этими двумя выражениями мы применили логический оператор ''and''. Он переводится как И, возвращает истину когда оба выражения (слева и справа от него) истины. Если хотя бы одно из них не выполняется, то и все выражение целиком ложно.  
- 
-Иными словами проверяем условие того, что состояние кнопки изменилось И, что новым состоянием кнопки является нажатое состояние. Это выражение позволяет выявить факт нажатия на кнопку.  
- 
-После регистрации факта нажатии на кнопку нам нужно изменить состояние светодиода на противоположное. Если он был включен — выключаем. Если выключен — включаем. 
- 
-Напоследок обновляем старое состояние состояние кнопки.  
-<code arduino [enable_line_numbers="2", start_line_numbers_at="24"]> 
-  button_old_state = button_state; 
-</code> 
- 
- 
- 
- 
- 
-==== Дополнительные задания ==== 
- 
-<WRAP center round tip 60%> 
-Модифицируй программу так, чтобы светодиод зажигался или выключался только после двух нажатий. Подсказка: потребуется переменная для хранения количества нажатий. 
-</WRAP>