1. Общее описание программы
Данная программа реализует контроллер светодиодов с пятью различными режимами работы, управляемыми через потенциометр. Программа демонстрирует:
- Применение структур управления (switch-case)
- Управление несколькими светодиодами
- Чтение аналогового сигнала с потенциометра
- Реализацию различных алгоритмов работы светодиодов
- Использование функций для организации кода
2. Исследованные функции
Функция | Описание |
---|---|
allBlink() | Все светодиоды мигают одновременно с интервалом 300 мс. |
oneByOne() | Светодиоды загораются по очереди (волна). |
byColor() | Режим для RGB-ленты: поочередное включение цветов (красный → зеленый → синий). |
randomBlink() | Случайное мигание светодиодов (эффект “свечи”). |
runningLight() | “Бегущий огонь” — плавное перемещение света между светодиодами. |
3. Описание работы
Программа использует потенциометр для выбора режима (0–4). В зависимости от положения ручки потенциометра активируется один из пяти эффектов.
Как это работает?
- Потенциометр передает значение на аналоговый вход
A0
(0–1023). - Значение преобразуется в номер режима (0–4) через
map()
. - В зависимости от выбранного режима включается соответствующая функция.
4. Использованные компоненты
Компонент | Количество | Назначение |
---|---|---|
Arduino Uno | 1 | Управление светодиодами. |
Светодиоды | 5 | Создание световых эффектов. |
Резисторы 220 Ом | 5 | Ограничение тока через светодиоды. |
Потенциометр 10 кОм | 1 | Выбор режима работы. |
Соединительные провода | Несколько | Подключение компонентов. |
5. Схема подключения (Tinkercad)

Как подключить?
- Светодиоды → пины
2, 4, 6, 8, 13
(через резисторы). - Потенциометр → средний вывод на
A0
, крайние на5V
иGND
.
6. Программа
// Пины для светодиодов
const int leds[] = {2, 4, 6, 8, 13};
const int numLeds = 5;
const int potPin = A0; // Потенциометр
void setup() {
// Настройка всех светодиодов
for(int i = 0; i < numLeds; i++) {
pinMode(leds[i], OUTPUT);
}
}
void loop() {
// Выбор режима потенциометром (0-4)
int mode = map(analogRead(potPin), 0, 1023, 0, 5);
// Выполнение текущего режима
switch(mode) {
case 0: allBlink(); break; // Все мигают
case 1: oneByOne(); break; // По очереди
case 2: byColor(); break; // По цветам
case 3: randomBlink(); break; // Случайные
case 4: runningLight(); break;// Бегущий огонь
}
delay(100); // Небольшая задержка
}
// 1. Все мигают одновременно
void allBlink() {
for(int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], HIGH);
}
delay(300);
for(int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], LOW);
}
delay(300);
}
// 2. Поочередное мигание
void oneByOne() {
static int current = 0;
digitalWrite(leds[current], LOW);
current = (current + 1) % numLeds;
digitalWrite(leds[current], HIGH);
delay(200);
}
// 3. По цветам
void byColor() {
static int color = 0;
allOff();
digitalWrite(leds[color % 3], HIGH);
color = (color + 1) % 3;
delay(400);
}
// 4. Случайные светодиоды
void randomBlink() {
allOff();
digitalWrite(leds[random(numLeds)], HIGH);
delay(200);
}
// 5. Бегущий огонь
void runningLight() {
static int pos = 0;
static bool forward = true;
allOff();
digitalWrite(leds[pos], HIGH);
if(forward) {
pos++;
if(pos >= numLeds-1) forward = false;
} else {
pos--;
if(pos <= 0) forward = true;
}
delay(150);
}
// Вспомогательная функция - выключить все
void allOff() {
for(int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], LOW);
}
}
Код представлен выше. Основные особенности:
- Использует
map()
для преобразования значений потенциометра. - Каждый режим работает в своем временном интервале (
delay
). - Режимы переключаются плавно.
Детальное описание констант и подключений
Определение пинов и констант
const int leds[] = {2, 4, 6, 8, 13}; // Массив пинов для подключения светодиодов
const int numLeds = 5; // Количество светодиодов
const int potPin = A0; // Аналоговый пин для подключения потенциометра
Пояснения:
- Светодиоды подключены к цифровым пинам 2, 4, 6, 8 и 13
- Потенциометр подключен к аналоговому входу A0
- Количество светодиодов хранится в отдельной константе для удобства изменения
Функция setup() – инициализация
void setup() {
// Настройка всех светодиодов как выходы
for(int i = 0; i < numLeds; i++) {
pinMode(leds[i], OUTPUT);
}
}
Особенности:
- Используется цикл для настройки всех светодиодов
- Все пины из массива leds настраиваются как OUTPUT
- Отсутствует Serial.begin(), так как вывод в монитор порта не используется
Основной цикл программы (loop())
Чтение потенциометра и выбор режима
void loop() {
// Преобразование значения потенциометра (0-1023) в номер режима (0-4)
int mode = map(analogRead(potPin), 0, 1023, 0, 5);
// Выбор и выполнение текущего режима
switch(mode) {
case 0: allBlink(); break; // Режим 0 - все мигают
case 1: oneByOne(); break; // Режим 1 - по очереди
case 2: byColor(); break; // Режим 2 - по цветам
case 3: randomBlink(); break; // Режим 3 - случайные
case 4: runningLight(); break;// Режим 4 - бегущий огонь
}
delay(100); // Задержка для стабилизации
}
Логика работы:
- Чтение значения с потенциометра (0-1023)
- Преобразование в номер режима (0-4) с помощью функции map()
- Выбор режима через switch-case
- Небольшая задержка для стабилизации работы
Описание режимов работы
Режим 0: allBlink() – все мигают одновременно
void allBlink() {
// Включение всех светодиодов
for(int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], HIGH);
}
delay(300);
// Выключение всех светодиодов
for(int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], LOW);
}
delay(300);
}
Характеристики:
- Все светодиоды мигают синхронно
- Период мигания: 600 мс (300 мс вкл, 300 мс выкл)
- Простая реализация с двумя циклами
Режим 1: oneByOne() – поочередное мигание
void oneByOne() {
static int current = 0; // Статическая переменная для хранения текущего светодиода
digitalWrite(leds[current], LOW); // Гасим текущий
current = (current + 1) % numLeds; // Переход к следующему (с зацикливанием)
digitalWrite(leds[current], HIGH); // Зажигаем следующий
delay(200);
}
Особенности:
- Используется статическая переменная для сохранения состояния между вызовами
- Каждый раз включается только один светодиод
- Время свечения каждого светодиода: 200 мс
- Автоматический переход к первому светодиоду после последнего
Режим 2: byColor() – по цветам
void byColor() {
static int color = 0; // Статическая переменная для хранения текущего цвета
allOff(); // Выключаем все светодиоды
digitalWrite(leds[color % 3], HIGH); // Включаем текущий цвет
color = (color + 1) % 3; // Переход к следующему цвету
delay(400);
}
Примечания:
- Режим предполагает, что первые 3 светодиода – разные цвета
- Циклическое переключение между тремя цветами
- Время отображения каждого цвета: 400 мс
- Используется функция allOff() для выключения всех светодиодов
Режим 3: randomBlink() – случайные светодиоды
void randomBlink() {
allOff(); // Выключаем все светодиоды
digitalWrite(leds[random(numLeds)], HIGH); // Включаем случайный светодиод
delay(200);
}
Особенности:
- Каждый раз включается один случайный светодиод
- Используется функция random() для генерации случайного числа
- Время свечения: 200 мс
- Простая, но эффектная реализация
Режим 4: runningLight() – бегущий огонь
void runningLight() {
static int pos = 0; // Текущая позиция
static bool forward = true; // Направление движения
allOff(); // Выключаем все светодиоды
digitalWrite(leds[pos], HIGH); // Включаем текущий светодиод
// Изменение позиции с проверкой границ
if(forward) {
pos++;
if(pos >= numLeds-1) forward = false; // Меняем направление
} else {
pos--;
if(pos <= 0) forward = true; // Меняем направление
}
delay(150);
}
Характеристики:
- Светодиоды зажигаются последовательно в двух направлениях
- Используется две статические переменные для хранения состояния
- Плавное движение “туда-обратно”
- Время на каждый шаг: 150 мс
Вспомогательная функция allOff()
void allOff() {
for(int i = 0; i < numLeds; i++) {
digitalWrite(leds[i], LOW);
}
}
Назначение:
- Гасит все светодиоды
- Используется в нескольких режимах для очистки перед изменением состояния
- Упрощает код и избегает дублирования
7. Видео работы
8. Применение в реальной жизни
Где можно использовать такую гирлянду?
- Декор – новогодние украшения, подсветка интерьера.
- Сигнализация – визуальное оповещение (например, в умном доме).
- Реклама – динамическая световая вывеска.
- Автомобильный тюнинг – стильная подсветка салона.
9. Возможные улучшения и модификации
- Добавление новых режимов:
- Режим “дыхания” с ШИМ
- Сложные световые эффекты
- Регулировка скорости:
- Второй потенциометр для управления скоростью эффектов
- Индикация текущего режима:
- Добавление светодиода или дисплея для отображения номера режима
- Кнопочное управление:
- Возможность переключения режимов кнопкой
- Цветовые схемы:
- Использование RGB-светодиодов для более сложных эффектов
- Сетевые функции:
- Управление по Bluetooth или Wi-Fi
10. Вывод
Данная программа демонстрирует:
- Гибкую систему управления несколькими светодиодами
- Различные алгоритмы световых эффектов
- Простое аналоговое управление режимами
- Хорошую структурированность кода
Для физической реализации потребуется:
- Плата Arduino
- 5 светодиодов
- Потенциометр
- Резисторы
- Монтажная плата и провода
Программа может быть использована как основа для создания световых инсталляций, декоративной подсветки или учебных демонстраций.