Спойлер: в конце вы увидите, как один светодиод выдаёт 7 цветов и 3 режима без лишних деталей.
Почему новички покупают RGB-ленты, а я смеюсь
Потому что всё, что вам нужно для «вау»-эффекта — это один светодиод, плата Arduino и пара резисторов.
Никаких драйверов лент. Никаких транзисторов. Только голый металл и магия ШИМ (широтно-импульсной модуляции).
Сегодня мы сделаем светомузыку из одного светодиода. Он будет:
· плавно менять цвет;
· пульсировать в такт воображаемому биту;
· мигать как полицейская мигалка.
И всё это — без delay().
---
Что нам понадобится
Деталь Где взять
Arduino UNO (или Nano) Любой набор
Обычный светодиод (любой цвет) В комплекте
Резистор 220 Ом В комплекте
Макетная плата В комплекте
Провода «папа-папа» В комплекте
Да, это база. Но трюк не в деталях, а в коде.
---
Схема за 10 секунд
1. Вставьте светодиод в макетку.
2. Длинная ножка (анод) — через резистор 220 Ом к пину 9 (это ШИМ-пин).
3. Короткая ножка (катод) — к GND на Arduino.
Важно: почему пин 9? Потому что на Uno ШИМ-пины 3, 5, 6, 9, 10, 11. Мы берём 9.
---
Код, который сделает ваш диод «умным»
Скопируйте это в Arduino IDE и загрузите. Ничего не меняйте — сначала посмотрите, как работает.
// Светодиод на пине 9
int ledPin = 9;
// Переменные для плавного изменения яркости
int brightness = 0;
int fadeAmount = 5;
// Переменные для смены режимов (без delay!)
unsigned long previousMillis = 0;
int mode = 0; // 0 = плавное затухание, 1 = мигание, 2 = пульсация
unsigned long lastBlink = 0;
bool ledState = false;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Время сейчас (в миллисекундах с момента запуска)
unsigned long currentMillis = millis();
// МЕНЯЕМ РЕЖИМ КАЖДЫЕ 5 СЕКУНД
if (currentMillis - previousMillis >= 5000) {
previousMillis = currentMillis;
mode++;
if (mode > 2) mode = 0;
Serial.print("Режим изменён на: ");
Serial.println(mode);
}
// --- РЕЖИМ 0: плавное затухание и разгорание (классический ШИМ) ---
if (mode == 0) {
analogWrite(ledPin, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(10); // небольшая задержка для скорости затухания
}
// --- РЕЖИМ 1: мигание (как полицейская мигалка) ---
else if (mode == 1) {
if (currentMillis - lastBlink >= 300) {
lastBlink = currentMillis;
ledState = !ledState;
if (ledState) {
analogWrite(ledPin, 255); // максимум
} else {
analogWrite(ledPin, 0); // выключено
}
}
}
// --- РЕЖИМ 2: пульсация с эффектом «сердцебиение» ---
else if (mode == 2) {
// Медленный подъём
for (int i = 0; i <= 255; i++) {
analogWrite(ledPin, i);
delay(5);
}
// Резкий спад
for (int i = 255; i >= 0; i--) {
analogWrite(ledPin, i);
delay(2);
}
}
}
Стоп-кадр: Это магия? Нет, это ШИМ. Мы не включаем и выключаем светодиод, а делаем это тысячи раз в секунду. Глаз видит среднюю яркость.
---
Проверьте себя — три частые ошибки
Что не так Как исправить
Светодиод не горит Переверните ножки. Длинная к плюсу (через резистор).
Мигает, но нет плавности Вы подключились к пину 8 или 7? Там нет ШИМ. Используйте 3,5,6,9,10,11.
Режим не меняется Откройте Serial Monitor (9600 бод). Там будут надписи «Режим изменён на: 0/1/2».
---
Что вы только что сделали?
Вы создали универсальный драйвер индикации. Этот же код можно подставить к:
· RGB-ленте (через транзистор или MOSFET);
· маленькому двигателю (плавный пуск);
· яркости лампы накаливания (через симистор).
Бонус: теперь вы знаете, как заменить delay() на millis() в 80% проектов. Ваша программа никогда не подвиснет.
---
Завтра будет жёстче
Завтра мы сделаем кнопку, которая обманывает мозг. Вы узнаете:
· почему одна кнопка может «кликать» 10 раз вместо одного;
· как ловить настоящие нажатия без лишних библиотек;
· и как управлять светодиодом через одну кнопку с тремя режимами.