← До всіх проєктів
Основи Початковий

Світлофор на ESP32: три світлодіоди і послідовність станів

Класичний навчальний проєкт: червоний, жовтий і зелений світлодіоди з резисторами та цикл світлофора з миготінням зеленого. Вчимося виносити повторюваний код у функцію і планувати послідовність станів.

Складність
Початковий
Час
30 min
Категорія
Основи
Оновлено

Про проєкт

Світлофор — ідеальна вправа на кілька виходів одночасно: три світлодіоди, чітка послідовність станів і таймінги. Заразом навчимося не повторювати три digitalWrite() у кожному рядку.

Що знадобиться

  • ESP32 DevKit
  • Світлодіоди: червоний, жовтий, зелений
  • 3 резистори 220 Ом
  • Макетна плата й перемички

Схема

Колір GPIO Коло
Червоний GPIO25 GPIO → 220 Ом → анод; катод → GND
Жовтий GPIO26 те саме
Зелений GPIO27 те саме

Кожному світлодіоду — свій резистор. Один спільний резистор на всі катоди — погана ідея: яскравість залежатиме від кількості ввімкнених світлодіодів, а червоний (з нижчою напругою) «перетягуватиме» струм.

Послідовність

Цикл, як на українських світлофорах:

Крок Червоний Жовтий Зелений Тривалість
Стоп ● 3 с
Приготуватися ● ● 1 с
Рух ● 3 с
Зелений блимає ◐ ×3 ~2 с
Увага ● 1 с

Кожен стан — це три значення «увімкнено/вимкнено», тож задаємо їх однією функцією set(r, y, g).

Код

// Світлофор: червоний, жовтий, зелений на GPIO25, 26, 27
const int RED = 25, YELLOW = 26, GREEN = 27;

// один стан світлофора — одна функція замість трьох digitalWrite
void set(bool r, bool y, bool g) {
  digitalWrite(RED, r);
  digitalWrite(YELLOW, y);
  digitalWrite(GREEN, g);
}

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(YELLOW, OUTPUT);
  pinMode(GREEN, OUTPUT);
}

void loop() {
  set(1, 0, 0); delay(3000);   // стоп
  set(1, 1, 0); delay(1000);   // приготуватися
  set(0, 0, 1); delay(3000);   // рух
  for (int i = 0; i < 3; i++) { set(0, 0, 0); delay(300); set(0, 0, 1); delay(300); }   // зелений блимає
  set(0, 1, 0); delay(1000);   // увага
}

Як розвинути

  • Пішохідна кнопка. Зараз delay() блокує все, тож кнопка не спрацює посеред циклу. Перепишіть світлофор як скінченний автомат: змінна state, час входу в стан stateSince = millis(). У loop() перевіряйте, чи час переходити далі, і паралельно опитуйте кнопку.
  • Нічний режим. Жовтий блимає, коли фоторезистор бачить темряву.
  • Перехрестя. Другий комплект світлодіодів працює в протифазі до першого.

Корисно знати

GPIO25–27 — зручні виходи: вони не беруть участі в завантаженні ESP32 і не зайняті флеш-пам'яттю. Для виходів уникайте GPIO6–11 (флеш) і GPIO34–39 (лише входи).