1. Общее описание программы

Данная программа реализует контроллер светодиодов с пятью различными режимами работы, управляемыми через потенциометр. Программа демонстрирует:

  • Применение структур управления (switch-case)
  • Управление несколькими светодиодами
  • Чтение аналогового сигнала с потенциометра
  • Реализацию различных алгоритмов работы светодиодов
  • Использование функций для организации кода

2. Исследованные функции

ФункцияОписание
allBlink()Все светодиоды мигают одновременно с интервалом 300 мс.
oneByOne()Светодиоды загораются по очереди (волна).
byColor()Режим для RGB-ленты: поочередное включение цветов (красный → зеленый → синий).
randomBlink()Случайное мигание светодиодов (эффект “свечи”).
runningLight()“Бегущий огонь” — плавное перемещение света между светодиодами.

3. Описание работы

Программа использует потенциометр для выбора режима (0–4). В зависимости от положения ручки потенциометра активируется один из пяти эффектов.

Как это работает?

  1. Потенциометр передает значение на аналоговый вход A0 (0–1023).
  2. Значение преобразуется в номер режима (0–4) через map().
  3. В зависимости от выбранного режима включается соответствующая функция.

4. Использованные компоненты

КомпонентКоличествоНазначение
Arduino Uno1Управление светодиодами.
Светодиоды5Создание световых эффектов.
Резисторы 220 Ом5Ограничение тока через светодиоды.
Потенциометр 10 кОм1Выбор режима работы.
Соединительные проводаНесколькоПодключение компонентов.

5. Схема подключения (Tinkercad)

Как подключить?

  1. Светодиоды → пины 2, 4, 6, 8, 13 (через резисторы).
  2. Потенциометр → средний вывод на 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); // Задержка для стабилизации
}

Логика работы:

  1. Чтение значения с потенциометра (0-1023)
  2. Преобразование в номер режима (0-4) с помощью функции map()
  3. Выбор режима через switch-case
  4. Небольшая задержка для стабилизации работы

Описание режимов работы

Режим 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. Возможные улучшения и модификации

  1. Добавление новых режимов:
    • Режим “дыхания” с ШИМ
    • Сложные световые эффекты
  2. Регулировка скорости:
    • Второй потенциометр для управления скоростью эффектов
    cppCopyDownloadint speed = map(analogRead(potPin2), 0, 1023, 50, 500);
  3. Индикация текущего режима:
    • Добавление светодиода или дисплея для отображения номера режима
  4. Кнопочное управление:
    • Возможность переключения режимов кнопкой
  5. Цветовые схемы:
    • Использование RGB-светодиодов для более сложных эффектов
  6. Сетевые функции:
    • Управление по Bluetooth или Wi-Fi

10. Вывод

Данная программа демонстрирует:

  • Гибкую систему управления несколькими светодиодами
  • Различные алгоритмы световых эффектов
  • Простое аналоговое управление режимами
  • Хорошую структурированность кода

Для физической реализации потребуется:

  • Плата Arduino
  • 5 светодиодов
  • Потенциометр
  • Резисторы
  • Монтажная плата и провода

Программа может быть использована как основа для создания световых инсталляций, декоративной подсветки или учебных демонстраций.