Вывод световых эффектов на RGB-светодиоде с Arduino (обучение работе с Proteus)
В данной статье рассматривается пример управления RGB-светодиодом с помощью Arduino и одной кнопки.
Проект создан специально для обучения работе с симулятором Proteus и демонстрирует, как реализовать несколько визуальных эффектов без усложнения схемы и без использования внешних библиотек.
Скетч реализует четыре различных световых режима, между которыми можно переключаться одной кнопкой. Каждый режим демонстрирует отдельный подход к управлению яркостью и цветом 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 — мигание светодиода