Переключение при каждом нажатии
Часть раздела Входные сигналы путешествия по Arduino на Coddy. Урок 4 из 22.
До сих пор светодиод повторял поведение кнопки: горел, пока кнопку удерживали, и гас, когда её отпускали. Выключатель лампы работает иначе: нажми один раз, чтобы включить, нажми ещё раз, чтобы выключить. Это называется переключением.
Чтобы переключать состояние, скетч должен заметить момент, когда кнопка нажимается: сейчас она нажата, а при предыдущем выполнении loop() она не была нажата. Этот момент называется фронтом. Храни последнее значение в переменной перед setup(), как счётчик:
int lastReading = HIGH;
void loop() {
int reading = digitalRead(2);
if (reading == LOW && lastReading == HIGH) {
// кнопка была нажата
}
lastReading = reading;
}Если удерживать кнопку, значение остаётся LOW, поэтому фронт возникает один раз при каждом нажатии, как бы долго ты ни удерживал кнопку.
Чтобы инвертировать bool, используй !, что означает «не»: ledOn = !ledOn; превращает true в false и наоборот.
Задание
СреднеКнопка подключена к выводу 2 (INPUT_PULLUP), а светодиод — к выводу 13. При каждом нажатии переключайте состояние светодиода:
- когда кнопку нажимают (
LOWсейчас,HIGHв прошлый раз), переключитеledOn - сохраните показание в
lastReadingв концеloop() - включите или выключите светодиод в соответствии со значением
ledOn
Нажмите Запустить, нажмите кнопку несколько раз, затем нажмите Проверить.
Попробуйте сами
const int buttonPin = 2;
const int ledPin = 13;
bool ledOn = false;
int lastReading = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
int reading = digitalRead(buttonPin);
// переключи ledOn при нажатии кнопки
// запомни это показание для следующего раза
// включи или выключи светодиод в соответствии с ledOn
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Входные сигналы
Потренируйтесь самостоятельно: Песочница Arduino