Menu
CoddyTech

Светофор на 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 мс.

challenge icon

Задание

Средне

Перепишите управление временем без 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);
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проекты

Потренируйтесь самостоятельно: Песочница Arduino