Arduino NANO. Знакомство. Кейс "светофор"
Arduino NANO. Знакомство. Кейс "светофор"
Для умного холодильника в качестве исполнительного элемента выбрал Arduino NANO.
Для того, чтобы понять, как он работает, включается, программируется, вместе со своими детьми выбрал кейс "СВЕТОФОР"
Это 3 светодиода, которые по нажатию кнопки эмулируют работу настоящего светофора для пешеходного перехода по нажатию кнопки.
Логика:
Для этого нам понадобится цикл с условиями:
- по дефолту зеленый горит, остальные нет (машины едут)
- по нажатию на кнопку красный моргает в течении 5 секунд
- желтый - 3 секунды
- красный. Сделаем 10 секунд. (пешеходы переходят)
- желтый - 3 секунд
- зеленый
- ожидаем нажатие кнопки но не ранее чем через 20 секунд. Т.е. сразу пешеход нажать кнопку не может.
Цикл повторяется.
Поехал покупать светодиоды, провода и т.д.
Для того, чтобы понять, как он работает, включается, программируется, вместе со своими детьми выбрал кейс "СВЕТОФОР"
Это 3 светодиода, которые по нажатию кнопки эмулируют работу настоящего светофора для пешеходного перехода по нажатию кнопки.
Логика:
Для этого нам понадобится цикл с условиями:
- по дефолту зеленый горит, остальные нет (машины едут)
- по нажатию на кнопку красный моргает в течении 5 секунд
- желтый - 3 секунды
- красный. Сделаем 10 секунд. (пешеходы переходят)
- желтый - 3 секунд
- зеленый
- ожидаем нажатие кнопки но не ранее чем через 20 секунд. Т.е. сразу пешеход нажать кнопку не может.
Цикл повторяется.
Поехал покупать светодиоды, провода и т.д.
Re: Arduino NANO. Знакомство. Кейс "светофор"
Купил светодиоды разных цветов светофора, сопротивления 220 Ом, кнопки, соединительные провода, термоусадочные трубки.
Re: Arduino NANO. Знакомство. Кейс "светофор"
После просмотра в окно и посмотрев как работает настоящий светофор и нескольких корректировок кода было сделано следующее:
Данный проект реализует мини‑светофор на базе Arduino Nano, управляющийся одной кнопкой. Светофор состоит из трёх светодиодов: красного, жёлтого и зелёного. По умолчанию зелёный светодиод горит постоянно, сигнализируя, что «движение разрешено».
При нажатии на кнопку запускается цикл смены сигналов:
Данный проект реализует мини‑светофор на базе Arduino Nano, управляющийся одной кнопкой. Светофор состоит из трёх светодиодов: красного, жёлтого и зелёного. По умолчанию зелёный светодиод горит постоянно, сигнализируя, что «движение разрешено».
При нажатии на кнопку запускается цикл смены сигналов:
- Зелёный светодиод моргает 3 раза — это «предупреждающий сигнал», что через короткое время разрешённый свет изменится.
- Затем загорается жёлтый светодиод на 1 секунду — мягкий переход к запрещающему сигналу.
- После этого включается красный светодиод на 7 секунд — основной режим «стоп».
- Затем красный и жёлтый горят вместе ещё 1 секунду, имитируя подготовку к возврату к разрешающему сигналу.
- После этого красный и жёлтый одновременно гаснут, и снова зелёный загорается и горит, пока не будет нажата кнопка снова
Re: Arduino NANO. Знакомство. Кейс "светофор"
Подготовка железа - 25 минут:
- Светодиоды припаяны последовательно с резисторами на 220 ом. Место пайки защищено термоусадочными трубками. - 13 минут
- Кнопка сделана таким же образом - 3 минуты
- Гребенка - 4 минуты
- Подключение к плате ардуино и проверка - 5 мину
Re: Arduino NANO. Знакомство. Кейс "светофор"
Скетч реализует управление трёхцветным светофором (красный, жёлтый, зелёный) с одной кнопкой. Логика работы такая: зелёный свет горит постоянно, а по нажатию кнопки запускается один цикл «предупреждение → стоп → снова движение».
Исходный код:
1. Объявление пинов
В начале задаём номера пинов, к которым подключены светодиоды и кнопка:
Так код становится читабельным: вместо «магических чисел» 9/10/11/2 дальше используются понятные имена RED_PIN, YELLOW_PIN и т.д.
2. Настройка входов/выходов в setup()
Функция setup() выполняется один раз после включения платы или перезагрузки:
Этими строками переводим пины со светодиодами в режим выходов — Arduino будет подавать на них HIGH (5 В) или LOW (0 В) через digitalWrite().
Кнопка настроена как вход с внутренней подтяжкой к плюсу (режим INPUT_PULLUP). Это значит, что:
без нажатия на кнопку на пине будет логическая 1 (HIGH),
при нажатии кнопка замыкает пин на GND, и Arduino видит логический 0 (LOW).
Дальше задаём начальное состояние светофора:
Красный и жёлтый выключены, зелёный включён — светофор в режиме «проезд разрешён».
3. Основной цикл loop(): ожидание нажатия
Функция loop() крутится бесконечно. В начале мы просто проверяем, нажата ли кнопка:
Поскольку используется INPUT_PULLUP, состояние LOW означает, что кнопку нажали (контакт замкнулся на землю). Пока кнопка не нажата, условие ложно, тело if не выполняется, и зелёный продолжает гореть.
Внутри if сначала небольшая задержка:
Это простейшая защита от дребезга контактов и от повторного срабатывания на один физический клик — за 100 мс кнопка успевает «отпружинить».
4. Шаг 1: зелёный мигает 3 раза
Обычный цикл for: переменная i последовательно принимает значения 0, 1, 2 — итого три повторения. На каждой итерации:
включаем зелёный, ждём 1 секунду,
выключаем зелёный, ждём 1 секунду.
В результате зелёный моргает 3 раза с периодом 2 секунды (1 сек горит, 1 сек не горит).
5. Шаг 2: жёлтый на 1 секунду
Выключаем красный и зелёный, включаем жёлтый на 1 секунду — это короткий «предупреждающий» сигнал перед красным.
6. Шаг 3: красный на 7 секунд
Затем на 1 секунду включаем одновременно красный и жёлтый, зелёный выключен. Это типичное состояние реальных светофоров перед включением зелёного — «готовься к движению».
8. Шаг 5: возвращаемся к зелёному
Красный и жёлтый выключаем, включаем зелёный. На этом цикл переключения завершён, и программа выходит из if. Дальше loop() снова крутится, проверяя кнопку, но состояние светодиодов не меняется, пока пользователь снова не нажмёт кнопку.
Так получается простой, но наглядный пример:
чтение кнопки в режиме INPUT_PULLUP,
управление тремя светодиодами через digitalWrite(),
использование for‑цикла и delay() для формирования таймингов светофора.
При желании этот же алгоритм легко расширяется до пешеходного светофора, добавления пищалки, второго направления движения и т.д.
Исходный код:
Код: Выделить всё
// Пины светодиодов светофора
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);
// Цикл завершён, снова ждём следующего нажатия кнопки
}
// Если кнопку не нажали — ничего не делаем, зелёный просто горит
}В начале задаём номера пинов, к которым подключены светодиоды и кнопка:
Код: Выделить всё
const int RED_PIN = 9;
const int YELLOW_PIN = 10;
const int GREEN_PIN = 11;
const int BUTTON_PIN = 2;2. Настройка входов/выходов в setup()
Функция setup() выполняется один раз после включения платы или перезагрузки:
Код: Выделить всё
pinMode(RED_PIN, OUTPUT);
pinMode(YELLOW_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);Код: Выделить всё
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) {
...
}Внутри if сначала небольшая задержка:
Код: Выделить всё
delay(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 секунда выключен
}включаем зелёный, ждём 1 секунду,
выключаем зелёный, ждём 1 секунду.
В результате зелёный моргает 3 раза с периодом 2 секунды (1 сек горит, 1 сек не горит).
5. Шаг 2: жёлтый на 1 секунду
Код: Выделить всё
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, HIGH);
digitalWrite(GREEN_PIN, LOW);
delay(1000);6. Шаг 3: красный на 7 секунд
Код: Выделить всё
digitalWrite(RED_PIN, HIGH);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, LOW);
delay(7000);8. Шаг 5: возвращаемся к зелёному
Код: Выделить всё
digitalWrite(RED_PIN, LOW);
digitalWrite(YELLOW_PIN, LOW);
digitalWrite(GREEN_PIN, HIGH);Красный и жёлтый выключаем, включаем зелёный. На этом цикл переключения завершён, и программа выходит из if. Дальше loop() снова крутится, проверяя кнопку, но состояние светодиодов не меняется, пока пользователь снова не нажмёт кнопку.
Так получается простой, но наглядный пример:
чтение кнопки в режиме INPUT_PULLUP,
управление тремя светодиодами через digitalWrite(),
использование for‑цикла и delay() для формирования таймингов светофора.
При желании этот же алгоритм легко расширяется до пешеходного светофора, добавления пищалки, второго направления движения и т.д.
Re: Arduino NANO. Знакомство. Кейс "светофор"
Видео на выходе:
- Вложения
-
14482545642068 (1).mp4- (6.01 МБ) 14 скачиваний
Re: Arduino NANO. Знакомство. Кейс "светофор"
На весь кейс — от подготовки железа до рабочего светофора — ушло примерно около часа, включая установку драйверов, настройку Arduino IDE, подбор COM‑порта и заливку скетча в Arduino Nano.
За это время дети успели:
Планы дальше:
За это время дети успели:
- познакомиться с базовыми навыками работы с электроникой: пайка, лужение контактов, надевание термоусадочных трубок, аккуратная сборка простой схемы на светодиодах и кнопке;
- увидеть полный цикл «железо → прошивка»: настройка среды Arduino IDE, выбор платы и порта, установка драйвера CH340, заливка своего кода в контроллер и наблюдение за тем, как программа управляет светодиодами;
- понять на практике, как кнопка запускает заранее придуманный алгоритм (мигание зелёного, переход через жёлтый к красному и обратно к зелёному).
Планы дальше:
- на следующем занятии хотим придумать новый кейс на базе Arduino — возможно, усложнить светофор, добавив отдельные красный и зелёный сигналы для пешеходов и простой звуковой сигнал (пьезо‑пищалка) для имитации звукового светофора;
- дать детям возможность самим предложить логику: сколько раз мигает, как долго горят сигналы, когда звучит сигнал — чтобы они ощущали себя авторами, а не просто исполнителями.