«Северное сияние» на Arduino

В этой статье расскажу про свой проект на Arduino — «Северное сияние».
Компоненты:
- Arduino (любая);
- RGB-светодиод;
- Резистор на 300-1000 Ом;
- Провода;
- Макетная плата по желанию.
Заключается проект в том, что цвет свечения светодиода плавно меняется. Реализовано это в скетче «просто, но сложно», потому что есть много простых функций с циклами for.
Скопировать код можно здесь:
// Пины для RGB светодиода
#define RED_PIN 3
#define GREEN_PIN 5
#define BLUE_PIN 6
// Служебные переменные
int redLight = 0;
int blueLight = 0;
int greenLight = 0;
int delTime = 1;
void setup() {
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop() {
for(int Gi = 0; Gi < 255; Gi++){ // Прибавляем зеленый (красный - жёлтый)
analogWrite(RED_PIN, 255);
analogWrite(GREEN_PIN, Gi);
analogWrite(BLUE_PIN, 0);
delay(delTime);
}
for(int Ri = 255; Ri > 0; Ri--){ // Уменьшаем красный (жёлтый - зеленый)
analogWrite(RED_PIN, Ri);
analogWrite(GREEN_PIN, 255);
analogWrite(BLUE_PIN, 0);
delay(delTime);
}
for(int Bi = 0; Bi < 255; Bi++){ // Прибавляем синий (зелёный - салатовый)
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 255);
analogWrite(BLUE_PIN, Bi);
delay(delTime);
}
for(int Gi = 255; Gi > 0; Gi--){ // Уменьшаем зелёный (салатовый - синий)
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, Gi);
analogWrite(BLUE_PIN, 255);
delay(delTime);
}
for(int Ri = 0; Ri < 255; Ri++){ // Прибавляем красный (синий - фиолетовый)
analogWrite(RED_PIN, Ri);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 255);
delay(delTime);
}
for(int Bi = 255; Bi > 0; Bi--){ // Уменьшаем синий (фиолетовый - красный)
analogWrite(RED_PIN, 255);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, Bi);
delay(delTime);
}
}Подключаем светодиод к пинам с ШИМ — 3, 5 и 6. А также к земле через резистор — 300-1000 Ом.

Я доработал этот проект, добавил потенциометр на пине А0. С его помощью можно управлять яркостью свечения светодиода.
Код можно скопировать здесь:
// Пины для RGB светодиода
#define RED_PIN 3
#define GREEN_PIN 5
#define BLUE_PIN 6
// Пин для потенциометра
#define LIGHTPOT_PIN A0
// Служебные переменные
int redLight = 0;
int blueLight = 0;
int greenLight = 0;
int delTime = 10;
int potVal = 0;
float brightness;
void setup() {
pinMode(LIGHTPOT_PIN, INPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop() {
for(int Gi = 0; Gi < 255; Gi++){ // Прибавляем зеленый (красный - жёлтый)
potVal = analogRead(A0);
brightness = map(potVal, 0, 1023, 255, 0);
greenLight = Gi - brightness;
if(Gi < brightness){
greenLight = 0;
}
analogWrite(RED_PIN, 255-brightness);
analogWrite(GREEN_PIN, greenLight);
analogWrite(BLUE_PIN, 0);
delay(delTime);
}
for(int Ri = 255; Ri > 0; Ri--){ // Уменьшаем красный (жёлтый - зеленый)
potVal = analogRead(A0);
brightness = map(potVal, 0, 1023, 255, 0);
redLight = Ri - brightness;
if(Ri < brightness){
redLight = 0;
}
analogWrite(RED_PIN, redLight);
analogWrite(GREEN_PIN, 255-brightness);
analogWrite(BLUE_PIN, 0);
delay(delTime);
}
for(int Bi = 0; Bi < 255; Bi++){ // Прибавляем синий (зелёный - салатовый)
potVal = analogRead(A0);
brightness = map(potVal, 0, 1023, 255, 0);
blueLight = Bi - brightness;
if(Bi < brightness){
blueLight = 0;
}
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 255-brightness);
analogWrite(BLUE_PIN, blueLight);
delay(delTime);
}
for(int Gi = 255; Gi > 0; Gi--){ // Уменьшаем зелёный (салатовый - синий)
potVal = analogRead(A0);
brightness = map(potVal, 0, 1023, 255, 0);
greenLight = Gi - brightness;
if(Gi < brightness){
greenLight = 0;
}
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, greenLight);
analogWrite(BLUE_PIN, 255-brightness);
delay(delTime);
}
for(int Ri = 0; Ri < 255; Ri++){ // Прибавляем красный (синий - фиолетовый)
potVal = analogRead(A0);
brightness = map(potVal, 0, 1023, 255, 0);
redLight = Ri - brightness;
if(Ri < brightness){
redLight = 0;
}
analogWrite(RED_PIN, redLight);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 255-brightness);
delay(delTime);
}
for(int Bi = 255; Bi > 0; Bi--){ // Уменьшаем синий (фиолетовый - красный)
potVal = analogRead(A0);
brightness = map(potVal, 0, 1023, 255, 0);
blueLight = Bi - brightness;
if(Bi < brightness){
blueLight = 0;
}
analogWrite(RED_PIN, 255-brightness);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, blueLight);
delay(delTime);
}
}Протестировать работу обновлённого проекта можно в симуляторе Wokwi (регистрация не обязательна).
Посмотреть видео демонстрацию проекта на Rutube.
Удачи в сборке проекта! 😊
