Вывод световых эффектов на RGB-светодиоде с Arduino (обучение работе с Proteus)

В данной статье рассматривается пример управления RGB-светодиодом с помощью Arduino и одной кнопки.
Проект создан специально для обучения работе с симулятором Proteus и демонстрирует, как реализовать несколько визуальных эффектов без усложнения схемы и без использования внешних библиотек.

Arduino RGB светодиод и кнопка

Скетч реализует четыре различных световых режима, между которыми можно переключаться одной кнопкой. Каждый режим демонстрирует отдельный подход к управлению яркостью и цветом RGB-светодиода.

Назначение проекта

Цель проекта — показать практические приёмы работы с RGB-светодиодом:

  • управление яркостью через PWM;
  • создание плавных и динамических эффектов;
  • организация режимов работы с помощью кнопки;
  • использование millis() для таймингов;
  • структурирование кода по эффектам.

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

Используемые компоненты

  • Arduino UNO;
  • RGB-светодиод (с общим катодом);
  • Кнопка;
  • Ограничительные резисторы для светодиода;
  • Proteus 8 или 9.

Принцип работы программы

RGB-светодиод подключён к PWM-пинам Arduino, что позволяет управлять яркостью каждого канала с помощью функции analogWrite().

Кнопка подключена с использованием режима INPUT_PULLUP. Это означает, что нажатие кнопки определяется по уровню LOW.

Каждое нажатие кнопки переключает режим работы:

  • режим 0 — плавное «дыхание» красного цвета;
  • режим 1 — перелив цветов (радуга);
  • режим 2 — импульсное свечение;
  • режим 3 — мягкий стробоскоп.

При смене режима внутренние переменные сбрасываются, что обеспечивает корректное воспроизведение эффектов.

Работа с таймингами

Во всех эффектах используется функция millis(), что позволяет отказаться от длительных задержек delay() и сохранить отзывчивость кнопки.

Каждый эффект имеет собственный интервал обновления, что делает поведение светодиода плавным и визуально приятным.

Преобразование HSV → RGB

Для эффекта «радуга» используется цветовая модель HSV. Оттенок изменяется по кругу от 0 до 360 градусов, после чего преобразуется в значения RGB.

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

Arduino-скетч

// ===== ПИНЫ =====
const int R = 9;
const int G = 10;
const int B = 11;
const int BTN = 2;

// ===== КНОПКА =====
int mode = 0;
bool lastBtn = HIGH;

// ===== ТАЙМИНГ =====
unsigned long tPrev = 0;

// ===== СОСТОЯНИЯ =====
int brightness = 0;
int fade = 3;
int hue = 0;
bool strobeOn = false;

void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(BTN, INPUT_PULLUP);
}

void loop() {
  handleButton();

  switch (mode) {
    case 0: breathing(); break;
    case 1: rainbow();  break;
    case 2: pulse();    break;
    case 3: softStrobe(); break;
  }
}

// ---------- КНОПКА ----------
void handleButton() {
  bool btn = digitalRead(BTN);
  if (btn == LOW && lastBtn == HIGH) {
    mode = (mode + 1) % 4;
    resetState();
    delay(150); // debounce
  }
  lastBtn = btn;
}

void resetState() {
  brightness = 0;
  fade = 3;
  hue = 0;
  strobeOn = false;
  tPrev = millis();
}

// ---------- ЭФФЕКТЫ ----------
void breathing() {
  if (millis() - tPrev < 20) return;
  tPrev = millis();

  brightness += fade;
  if (brightness <= 0 || brightness >= 255) fade = -fade;

  analogWrite(R, brightness);
  analogWrite(G, 0);
  analogWrite(B, 0);
}

void rainbow() {
  if (millis() - tPrev < 25) return;
  tPrev = millis();

  hue = (hue + 1) % 360;
  setHSV(hue, 255, 255);
}

void pulse() {
  static int step = 0;
  if (millis() - tPrev < 30) return;
  tPrev = millis();

  int v = (step < 10) ? step * 25 : max(0, 255 - (step - 10) * 15);
  analogWrite(R, v);
  analogWrite(G, 0);
  analogWrite(B, 0);

  step++;
  if (step > 25) step = 0;
}

void softStrobe() {
  if (millis() - tPrev < 120) return;
  tPrev = millis();

  strobeOn = !strobeOn;
  int v = strobeOn ? 180 : 0;

  analogWrite(R, v);
  analogWrite(G, v);
  analogWrite(B, v);
}

// ---------- HSV → RGB ----------
void setHSV(int h, int s, int v) {
  float C = (v / 255.0) * (s / 255.0);
  float X = C * (1 - abs(fmod(h / 60.0, 2) - 1));
  float m = (v / 255.0) - C;

  float r=0,g=0,b=0;

  if      (h < 60)  { r=C; g=X; }
  else if (h <120)  { r=X; g=C; }
  else if (h <180)  { g=C; b=X; }
  else if (h <240)  { g=X; b=C; }
  else if (h <300)  { r=X; b=C; }
  else              { r=C; b=X; }

  analogWrite(R, (r+m)*255);
  analogWrite(G, (g+m)*255);
  analogWrite(B, (b+m)*255);
}

Работа проекта в Proteus

В симуляции Proteus нажатие кнопки последовательно переключает режимы работы RGB-светодиода. Каждый эффект воспроизводится плавно и без задержек, что позволяет наглядно изучить логику работы скетча.

Запуск проекта в Proteus

  • распакуйте архив с проектом;
  • откройте файл .pdsprj;
  • проверьте путь к файлу .hex в свойствах Arduino;
  • нажмите Run Simulation;
  • нажимайте кнопку и наблюдайте смену световых эффектов.

Если что-то не работает

Если возникают проблемы с запуском проекта или непонятен принцип работы, рекомендуется пройти базовый урок по Proteus.

Подробно разобран первый проект в Proteus:
Первый проект в Proteus — мигание светодиода

📁 Скачать примеры