Скетч реализует управление трёхцветным светофором (красный, жёлтый, зелёный) с одной кнопкой. Логика работы такая: зелёный свет горит постоянно, а по нажатию кнопки запускается один цикл «предупреждение → стоп → снова движение».
Исходный код:
Код: Выделить всё
// Пины светодиодов светофора
const int RED_PIN = 9;
const int YELLOW_PIN = 10;
const int GREEN_PIN = 11;
// Пин кнопки
const int BUTTON_PIN = 2;
void setup() {
// Светодиоды как выходы
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
// Кнопка: вход с внутренней подтяжкой к 5V
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Сначала зелёный горит, ждём кнопку
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
}
void loop() {
// Проверяем, нажали ли кнопку
if (digitalRead(BUTTON_PIN) == LOW) {
// Подождать, пока отпустят кнопку, чтобы один щелчок не сработал несколькo раз
delay(100);
// 1. Зелёный мигает 3 раза
for (int i = 0; i < 3; i++) {
digitalWrite(GREEN_PIN, HIGH);
delay(1000); // 1 секунда включён
digitalWrite(GREEN_PIN, LOW);
delay(1000); // 1 секунда выключен
}
// 2. Жёлтый 1 секунда (зелёный и красный выключены)
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(1000);
// 3. Красный 7 секунд (жёлтый и зелёный выключены)
digitalWrite(RED_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
delay(7000);
// 4. Красный и жёлтый ОДНОВРЕМЕННО 1 секунду
digitalWrite(RED_PIN, HIGH);
digitalWrite(YELLOW_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(1000);
// 5. Оба гаснут, загорается зелёный
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
// Цикл завершён, снова ждём следующего нажатия кнопки
}
// Если кнопку не нажали — ничего не делаем, зелёный просто горит
}
1. Объявление пинов
В начале задаём номера пинов, к которым подключены светодиоды и кнопка:
Код: Выделить всё
const int RED_PIN = 9;
const int YELLOW_PIN = 10;
const int GREEN_PIN = 11;
const int BUTTON_PIN = 2;
Так код становится читабельным: вместо «магических чисел» 9/10/11/2 дальше используются понятные имена RED_PIN, YELLOW_PIN и т.д.
2. Настройка входов/выходов в setup()
Функция setup() выполняется один раз после включения платы или перезагрузки:
Код: Выделить всё
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
Этими строками переводим пины со светодиодами в режим выходов — Arduino будет подавать на них HIGH (5 В) или LOW (0 В) через digitalWrite().
Кнопка настроена как вход с внутренней подтяжкой к плюсу (режим INPUT_PULLUP). Это значит, что:
без нажатия на кнопку на пине будет логическая 1 (HIGH),
при нажатии кнопка замыкает пин на GND, и Arduino видит логический 0 (LOW).
Дальше задаём начальное состояние светофора:
Код: Выделить всё
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
Красный и жёлтый выключены, зелёный включён — светофор в режиме «проезд разрешён».
3. Основной цикл loop(): ожидание нажатия
Функция loop() крутится бесконечно. В начале мы просто проверяем, нажата ли кнопка:
Код: Выделить всё
if (digitalRead(BUTTON_PIN) == LOW) {
...
}
Поскольку используется INPUT_PULLUP, состояние LOW означает, что кнопку нажали (контакт замкнулся на землю). Пока кнопка не нажата, условие ложно, тело if не выполняется, и зелёный продолжает гореть.
Внутри if сначала небольшая задержка:
Это простейшая защита от дребезга контактов и от повторного срабатывания на один физический клик — за 100 мс кнопка успевает «отпружинить».
4. Шаг 1: зелёный мигает 3 раза
Код: Выделить всё
for (int i = 0; i < 3; i++) {
digitalWrite(GREEN_PIN, HIGH);
delay(1000); // 1 секунда включён
digitalWrite(GREEN_PIN, LOW);
delay(1000); // 1 секунда выключен
}
Обычный цикл for: переменная i последовательно принимает значения 0, 1, 2 — итого три повторения. На каждой итерации:
включаем зелёный, ждём 1 секунду,
выключаем зелёный, ждём 1 секунду.
В результате зелёный моргает 3 раза с периодом 2 секунды (1 сек горит, 1 сек не горит).
5. Шаг 2: жёлтый на 1 секунду
Код: Выделить всё
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(1000);
Выключаем красный и зелёный, включаем жёлтый на 1 секунду — это короткий «предупреждающий» сигнал перед красным.
6. Шаг 3: красный на 7 секунд
Код: Выделить всё
digitalWrite(RED_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
delay(7000);
Затем на 1 секунду включаем одновременно красный и жёлтый, зелёный выключен. Это типичное состояние реальных светофоров перед включением зелёного — «готовься к движению».
8. Шаг 5: возвращаемся к зелёному
Код: Выделить всё
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);
Красный и жёлтый выключаем, включаем зелёный. На этом цикл переключения завершён, и программа выходит из if. Дальше loop() снова крутится, проверяя кнопку, но состояние светодиодов не меняется, пока пользователь снова не нажмёт кнопку.
Так получается простой, но наглядный пример:
чтение кнопки в режиме INPUT_PULLUP,
управление тремя светодиодами через digitalWrite(),
использование for‑цикла и delay() для формирования таймингов светофора.
При желании этот же алгоритм легко расширяется до пешеходного светофора, добавления пищалки, второго направления движения и т.д.