Светофор на millis()
Часть раздела Проекты путешествия по Arduino на Coddy. Урок 2 из 24.
Во время каждой delay(3000) плата больше ничего не делает, поэтому она не сможет заметить кнопку перехода, которую мы добавим на следующем шаге. Вместо этого для отсчёта времени используется millis().
Светофор — это конечный автомат: он всегда находится в одном из состояний (зелёный, жёлтый или красный) и переходит к следующему, когда пробудет в текущем состоянии достаточно долго. enum задаёт имена состояний, одна переменная хранит текущее состояние, а другая — время его начала:
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;Первое состояние — зелёный, поэтому включи зелёный свет в setup(). При каждом проходе loop() оператор switch проверяет, достаточно ли долго длится текущее состояние, и только после этого переходит к следующему и переключает сигналы светофора:
case GREEN:
if (millis() - lightStart >= 3000) {
light = YELLOW;
lightStart = millis();
showLight(yellowPin);
}
break;Ничего не ждёт, поэтому loop() может выполнять другие задачи. Убедись в этом с помощью индикатора состояния: пусть встроенный светодиод платы, контакт 13, мигает каждые 500 мс.
Задание
СреднеПерепишите управление временем без delay():
- удерживайте зелёный свет включённым 3000 мс, жёлтый — 1000 мс, красный — 3000 мс
- используйте
enumдля трёх состояний,switchиmillis() - включите зелёный свет в
setup()и вызывайтеshowLight()только при смене состояния - постоянно мигайте светодиодом на выводе 13 с интервалом 500 мс (500 мс включён, 500 мс выключен)
Нажмите Run, затем Check.
Попробуйте сами
// Автомобильные огни
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Включить один огонь и выключить два других.
void showLight(int pin) {
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
digitalWrite(pin, HIGH);
}
void setup() {
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop() {
showLight(greenPin);
delay(3000);
showLight(yellowPin);
delay(1000);
showLight(redPin);
delay(3000);
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
Потренируйтесь самостоятельно: Песочница Arduino