«Северное сияние» на 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.
Удачи в сборке проекта! 😊