Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:aruno:exp5 [2020/05/24 14:52] – [Программный код эксперимента] alexnikproducts:aruno:exp5 [2020/08/27 16:16] (текущий) alexnik
Строка 16: Строка 16:
 <file cpp Exp5[enable_line_numbers="2", start_line_numbers_at="1"]> <file cpp Exp5[enable_line_numbers="2", start_line_numbers_at="1"]>
 // инициализация констант // инициализация констант
 +
 #define LED 2 //определение константы LED с номером пина 2 #define LED 2 //определение константы LED с номером пина 2
 #define BUTTON 12 //определение константы BUTTON с номером пина 12 #define BUTTON 12 //определение константы BUTTON с номером пина 12
  
 // инициализация переменных // инициализация переменных
-int switchState = 0; // текущий уровень сигнала пина кнопки +int switchState = 0; // актуальный статус кнопки 
-int oldSwitchState = 0; // уровень сигнала последней проверки пина кнопки +int oldSwitchState = 0; // статус последней проверки кнопки 
-int lightsOn = 0; // статус светодиода on = или off = 0+boolean lightsOn = false; // статус светодиода on = true или off = false
  
 void setup() {  void setup() { 
- pinMode(BUTTON, INPUT); +  pinMode(BUTTON, INPUT); 
- pinMode(LED, OUTPUT);  +  pinMode(LED, OUTPUT);  
-}+ }
  
 void loop() { void loop() {
Строка 35: Строка 36:
       if (switchState == HIGH) {       if (switchState == HIGH) {
         lightsOn = !lightsOn;         lightsOn = !lightsOn;
-      +       
-    +     
-    if(lightsOn) {+   if(lightsOn) {
       digitalWrite(LED, HIGH); // зажигаем светодиод       digitalWrite(LED, HIGH); // зажигаем светодиод
-    +     
     else {     else {
       digitalWrite(LED, LOW); // гасим светодиод       digitalWrite(LED, LOW); // гасим светодиод
-    +     
- }+  }
 </file> </file>
  
Строка 51: Строка 52:
   * ''oldSwitchState'' - будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие.   * ''oldSwitchState'' - будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие.
   * ''lightsOn'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку.   * ''lightsOn'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку.
-/* +
-Считываем сосотояние кнопки и проверяем факт нажатия: +
-<code python [enable_line_numbers="2", start_line_numbers_at="13"]> +
-    button_value = Button.value() +
-    if old_button_value != button_value and button_value == 1: +
-</code> +
-*/+
 выражение ''switchState = digitalRead(BUTTON);'' записывает в переменную **switchState** текущий уровень сигнала на пине кнопки, далее идет проверка события "была ли нажата кнопка". выражение ''switchState = digitalRead(BUTTON);'' записывает в переменную **switchState** текущий уровень сигнала на пине кнопки, далее идет проверка события "была ли нажата кнопка".
-в первом условии оператора **if** сравниваются значения переменных  +в строке 18 оператором **if** сравниваются переменные **switchState** и **oldSwitchState** в которые записан текущий сигнал и сигнал считанный и записанный ранее. 
-Выражение ''old_button_value != button_value'' проверяет факт того, что новое состояние кнопки не равно предыдущему. Оператор ''!='' — оператор неравенства. Выражение ''button_value == 1'' проверяет текущее состояние кнопки. Это выражение истинно, когда кнопка нажата. А между этими двумя выражениями мы применили логический оператор ''and''. Он переводится как И, возвращает истину когда оба выражения (слева и справа от него) истины. Если хотя бы одно из них не выполняется, то и все выражение целиком ложно.  +Оператор ''!='' — оператор неравенства. 
- +Если значение переменной **switchState** не равно значению переменной **oldSwitchState** (была нажата кнопка), то мы перезаписываем старое значение на новое и переходим к проверке того, какой именно поступает текущий сигнал. Если сигнал соответствует **HIGH**, то значение переменной **lightsOn** необходимо изменить на противоположноепоскольку была нажата кнопка.\\ 
-Иными словами проверяем условие того, что состояние кнопки изменилось И, что новым состоянием кнопки является нажатое состояние. Это выражение позволяет выявить факт нажатия на кнопку.  +Обратите внимание, что эта проверка происходит только если выполняется условие предыдущей проверки.\\ 
- +третий оператор **if** проверяет значение переменной ''lightsOn'', если значение равно **true** то выполняется выражение ''digitalWrite(LED, HIGH);'', светодиод загораетсяи будет гореть до тех пор пока не будет нажата кнопкапосле этого значение переменной измениться на **false**, и выполнится выражение ''digitalWrite(LED, LOW);'', и светодиод погаснет.\\
-После регистрации факта нажатии на кнопку нам нужно изменить состояние светодиода на противоположное. Если он был включен — выключаем. Если выключен — включаем+
- +
-Напоследок обновляем старое состояние состояние кнопки.  +
-<code python [enable_line_numbers="2", start_line_numbers_at="22"]> +
-old_button_value = button_value +
-</code> +
- +
- +
- +
- +
- +
-==== Дополнительные задания ==== +
- +
-<WRAP center round tip 60%> +
-Модифицируй программу такчтобы светодиод зажигался или выключался только после двух нажатий. Подсказка: потребуется переменная для хранения количества нажатий. +
-</WRAP>+
  
 +Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.\\
 +Данную проблему и ее решение рассмотрим в следующем эксперименте.