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