Світлофор на ESP32: три світлодіоди і послідовність станів
Класичний навчальний проєкт: червоний, жовтий і зелений світлодіоди з резисторами та цикл світлофора з миготінням зеленого. Вчимося виносити повторюваний код у функцію і планувати послідовність станів.
Про проєкт
Світлофор — ідеальна вправа на кілька виходів одночасно: три світлодіоди, чітка послідовність станів і таймінги. Заразом навчимося не повторювати три 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 (лише входи).