Различия

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

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

Следующая версия
Предыдущая версия
products:aruno:exp5 [2020/05/24 11:25] – создано alexnikproducts:aruno:exp5 [2020/08/27 16:16] (текущий) alexnik
Строка 5: Строка 5:
 Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части
  
-{{ :products:esp-iot:exp3.4.png?direct |}}+{{ :products:ardu:exp3.4.png?nolink |}}
 //Рисунок 1. Электрическая принципиальная схема эксперимента// //Рисунок 1. Электрическая принципиальная схема эксперимента//
- 
-На рисунке изображен токоограничительный резистор последовательно со светодиодом. При сборке схемы мы не будем устанавливать его сами так как он уже установлен на плате конструктора. 
  
 Соберем эту схему: Соберем эту схему:
-{{ :products:esp-iot:exp3.png?direct&600 |}}+{{ :products:ardu:exp03.png?direct&600 |}}
 //Рисунок 2. Монтажная схема эксперимента// //Рисунок 2. Монтажная схема эксперимента//
  
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file python Exp5.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<file cpp Exp5[enable_line_numbers="2", start_line_numbers_at="1"]> 
-from machine import Pin +// инициализация констант
-_init() +
-  +
-ButtonPin = 16 +
-LedPin = 0 +
-old_button_value = 0 +
-LedState = 0 +
-  +
-Button = Pin(ButtonPin, Pin.IN) +
-Led = Pin(LedPin, Pin.OUT) +
-  +
-while True: +
-    button_value = Button.value() +
-    if old_button_value != button_value and button_value == 1: +
-        if LedState: +
-            Led.off() +
-            LedState = 0 +
-        else: +
-            Led.on() +
-            LedState = 1 +
-     +
-    old_button_value = button_value +
-</file> +
- +
-Создадим две переменные:  +
-  * ''old_button_value'' будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие. +
-  * ''LedState'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку. +
- +
-Считываем сосотояние кнопки и проверяем факт нажатия: +
-<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> +
- +
-Выражение ''old_button_value != button_value'' проверяет факт того, что новое состояние кнопки не равно предыдущему. Оператор ''!='' — оператор неравенства. Выражение ''button_value == 1'' проверяет текущее состояние кнопки. Это выражение истинно, когда кнопка нажата. А между этими двумя выражениями мы применили логический оператор ''and''. Он переводится как И, возвращает истину когда оба выражения (слева и справа от него) истины. Если хотя бы одно из них не выполняется, то и все выражение целиком ложно.  +
- +
-Иными словами проверяем условие того, что состояние кнопки изменилось И, что новым состоянием кнопки является нажатое состояние. Это выражение позволяет выявить факт нажатия на кнопку.  +
- +
-После регистрации факта нажатии на кнопку нам нужно изменить состояние светодиода на противоположное. Если он был включен — выключаем. Если выключен — включаем. +
- +
-Напоследок обновляем старое состояние состояние кнопки.  +
-<code python [enable_line_numbers="2", start_line_numbers_at="22"]> +
-old_button_value = button_value +
-</code>+
  
 +#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); // гасим светодиод
 +     }
 +  }
 +</file>
  
-==== Дополнительные задания ====+в начале программы определим две **константы** ''LED'' и ''BUTTON'' для хранения номеров пинов к которым подключены кнопка и светодиод.\\ 
 +далее для реализации задуманного нам понадобятся переменные: 
 +  * ''switchState'' - переменная для хранения текущего уровня считанного сигнала с пина. 
 +  * ''oldSwitchState'' - будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие. 
 +  * ''lightsOn'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку.
  
-<WRAP center round tip 60%> +выражение ''switchState = digitalRead(BUTTON);'' записывает в переменную **switchState** текущий уровень сигнала на пине кнопкидалее идет проверка события "была ли нажата кнопка"
-Модифицируй программу так, чтобы светодиод зажигался или выключался только после двух нажатий. Подсказкапотребуется переменная для хранения количества нажатий. +в строке 18 оператором **if** сравниваются переменные **switchState** и **oldSwitchState** в которые записан текущий сигнал и сигнал считанный и записанный ранее. 
-</WRAP>+Оператор ''!='' — оператор неравенства. 
 +Если значение переменной **switchState** не равно значению переменной **oldSwitchState** (была нажата кнопка), то мы перезаписываем старое значение на новое и переходим к проверке того, какой именно поступает текущий сигнал. Если сигнал соответствует **HIGH**, то значение переменной **lightsOn** необходимо изменить на противоположное, поскольку была нажата кнопка.\\ 
 +Обратите внимание, что эта проверка происходит только если выполняется условие предыдущей проверки.\\ 
 +третий оператор **if** проверяет значение переменной ''lightsOn'', если значение равно **true** то выполняется выражение ''digitalWrite(LED, HIGH);'', светодиод загорается, и будет гореть до тех пор пока не будет нажата кнопка, после этого значение переменной измениться на **false**, и выполнится выражение ''digitalWrite(LED, LOW);'', и светодиод погаснет.\\
  
 +Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.\\
 +Данную проблему и ее решение рассмотрим в следующем эксперименте.