Свет по таймеру
Часть раздела Отсчёт времени без delay путешествия по Arduino на Coddy. Урок 6 из 18.
Лестничный свет включается, когда ты нажимаешь кнопку, и немного позже гаснет сам. Нажми ещё раз, пока он горит, и отсчёт времени начнётся заново.
Для этого нужны две вещи: момент последнего нажатия и состояние света — включён он или нет. Сохраняй момент в переменной unsigned long, когда кнопка нажата:
if (digitalRead(buttonPin) == LOW) {
pressedAt = millis(); // начать (или начать заново) отсчёт времени
lightOn = true;
digitalWrite(ledPin, HIGH);
}Затем на каждой итерации цикла проверяй, сколько времени прошло:
if (lightOn && millis() - pressedAt >= onTime) {
lightOn = false;
digitalWrite(ledPin, LOW);
}Обе части никогда не ждут, поэтому нажатие будет замечено в любой момент, даже когда свет уже включён. Если после нажатия использовать delay(2000), второе нажатие во время ожидания будет пропущено.
Задание
ЛегкоСоздай освещение для лестницы:
- при нажатии сразу загорается LED на контакте 13
- через 2 секунды после нажатия свет выключается сам
- нажатие, пока свет включён, запускает отсчёт 2 секунд заново
Нажми Run, нажми кнопку несколько раз, затем Check.
Попробуйте сами
const int ledPin = 13;
const int buttonPin = 2;
const unsigned long onTime = 2000; // как долго светодиод остаётся включённым
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// когда кнопка нажата: включить светодиод и запомнить время
// когда с того момента пройдёт onTime: выключить светодиод
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Отсчёт времени без delay
1millis()
Часы на millis()Время в unsigned longМигание без задержкиДва светодиода, две скоростиМигание и переключение кнопкойСвет по таймеру4Точное измерение времени
Измерение с помощью micros()Когда millis() переполняетсяСекундомер с кнопкойПотренируйтесь самостоятельно: Песочница Arduino