| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| products:aruno:exp5 [2020/05/24 14:50] – [Программный код эксперимента] alexnik | products:aruno:exp5 [2020/08/27 16:16] (текущий) – alexnik |
|---|
| ==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== |
| |
| <file c 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 = 1 или 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() { |
| 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> |
| |
| * ''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> | |
| |
| | Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.\\ |
| | Данную проблему и ее решение рассмотрим в следующем эксперименте. |