Страница 1 из 1

Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 16:40
MarkT
Для умного холодильника в качестве исполнительного элемента выбрал Arduino NANO.
Для того, чтобы понять, как он работает, включается, программируется, вместе со своими детьми выбрал кейс "СВЕТОФОР"
Это 3 светодиода, которые по нажатию кнопки эмулируют работу настоящего светофора для пешеходного перехода по нажатию кнопки.
Логика:
Для этого нам понадобится цикл с условиями:
- по дефолту зеленый горит, остальные нет (машины едут)
- по нажатию на кнопку красный моргает в течении 5 секунд
- желтый - 3 секунды
- красный. Сделаем 10 секунд. (пешеходы переходят)
- желтый - 3 секунд
- зеленый
- ожидаем нажатие кнопки но не ранее чем через 20 секунд. Т.е. сразу пешеход нажать кнопку не может.
Цикл повторяется.
Поехал покупать светодиоды, провода и т.д.

Re: Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 19:18
MarkT
Купил светодиоды разных цветов светофора, сопротивления 220 Ом, кнопки, соединительные провода, термоусадочные трубки.

Re: Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 21:22
MarkT
После просмотра в окно и посмотрев как работает настоящий светофор и нескольких корректировок кода было сделано следующее:

Данный проект реализует мини‑светофор на базе Arduino Nano, управляющийся одной кнопкой. Светофор состоит из трёх светодиодов: красного, жёлтого и зелёного. По умолчанию зелёный светодиод горит постоянно, сигнализируя, что «движение разрешено».

При нажатии на кнопку запускается цикл смены сигналов:
  • Зелёный светодиод моргает 3 раза — это «предупреждающий сигнал», что через короткое время разрешённый свет изменится.
  • Затем загорается жёлтый светодиод на 1 секунду — мягкий переход к запрещающему сигналу.
  • После этого включается красный светодиод на 7 секунд — основной режим «стоп».
  • Затем красный и жёлтый горят вместе ещё 1 секунду, имитируя подготовку к возврату к разрешающему сигналу.
  • После этого красный и жёлтый одновременно гаснут, и снова зелёный загорается и горит, пока не будет нажата кнопка снова
Таким образом, кнопка имитирует внешнюю команду на переключение светофора: после нажатия светофор проходит полный цикл смены сигналов и снова возвращается в разрешённый режим, ожидая следующего нажатия.

Re: Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 21:27
MarkT
Подготовка железа - 25 минут:
  • Светодиоды припаяны последовательно с резисторами на 220 ом. Место пайки защищено термоусадочными трубками. - 13 минут
  • Кнопка сделана таким же образом - 3 минуты
  • Гребенка - 4 минуты
  • Подключение к плате ардуино и проверка - 5 мину

Re: Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 21:30
MarkT
Скетч реализует управление трёхцветным светофором (красный, жёлтый, зелёный) с одной кнопкой. Логика работы такая: зелёный свет горит постоянно, а по нажатию кнопки запускается один цикл «предупреждение → стоп → снова движение».

Исходный код:

Код: Выделить всё

// Пины светодиодов светофора
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().

Код: Выделить всё

pinMode(BUTTON_PIN, INPUT_PULLUP);

Кнопка настроена как вход с внутренней подтяжкой к плюсу (режим 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 сначала небольшая задержка:

Код: Выделить всё

delay(100);
Это простейшая защита от дребезга контактов и от повторного срабатывания на один физический клик — за 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() для формирования таймингов светофора.

При желании этот же алгоритм легко расширяется до пешеходного светофора, добавления пищалки, второго направления движения и т.д.

Re: Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 21:52
MarkT
Видео на выходе:

Re: Arduino NANO. Знакомство. Кейс "светофор"

Добавлено: 29 апр 2026, 22:14
MarkT
На весь кейс — от подготовки железа до рабочего светофора — ушло примерно около часа, включая установку драйверов, настройку Arduino IDE, подбор COM‑порта и заливку скетча в Arduino Nano.

За это время дети успели:
  • познакомиться с базовыми навыками работы с электроникой: пайка, лужение контактов, надевание термоусадочных трубок, аккуратная сборка простой схемы на светодиодах и кнопке;
  • увидеть полный цикл «железо → прошивка»: настройка среды Arduino IDE, выбор платы и порта, установка драйвера CH340, заливка своего кода в контроллер и наблюдение за тем, как программа управляет светодиодами;
  • понять на практике, как кнопка запускает заранее придуманный алгоритм (мигание зелёного, переход через жёлтый к красному и обратно к зелёному).
Получился быстрый и наглядный проект: ребёнок видит, что несколько строк кода реально «двигают железо» и меняют поведение светофора.

Планы дальше:
  • на следующем занятии хотим придумать новый кейс на базе Arduino — возможно, усложнить светофор, добавив отдельные красный и зелёный сигналы для пешеходов и простой звуковой сигнал (пьезо‑пищалка) для имитации звукового светофора;
  • дать детям возможность самим предложить логику: сколько раз мигает, как долго горят сигналы, когда звучит сигнал — чтобы они ощущали себя авторами, а не просто исполнителями.