У цій статті ви дізнаєтесь, як створити RGB контролер для двох світлодіодних стрічок на базі Arduino NANO. Стаття покроково пояснює процес складання, підключення компонентів і налаштування програмного забезпечення.
Для тих, хто планує створити RGB контролер на два RGB канали, який дозволяє підключати до 110 метрів світлодіодної RGB стрічки на кожен канал із можливістю налаштування індивідуальних алгоритмів роботи.
Плата Arduino NANO.
Дві дванадцяти вольтові стрічки RGB.
Кнопка та опір 1-10 кілоом.
6 мосфет транзисторів T40N03G або будь-які інші N-канальні, що підходять по потужності.
Для складання пристрою я ще використовую макетну плату та з’єднувальні дроти, ви за бажання можете відразу все спаяти.
#define Red1 3
#define Green1 5
#define Blue1 6
#define Red2 9
#define Green2 10
#define Blue2 11
int r = 0, g = 0, b = 0, sensorVal, x = 8, i = 0, j = 0, SpeedR;
int Speed1 = 5, Speed2 = 5, Speed3 = 5, Speed4 = 5, Speed5 = 5, Speed6 = 5, Speed7 = 5;
int Random1, Random2, Random3, Random4, Random5, Random6;
void setup() {
pinMode(Red1, OUTPUT); pinMode(Green1, OUTPUT);
pinMode(Blue1, OUTPUT); pinMode(Red2, OUTPUT);
pinMode(Green2, OUTPUT); pinMode(Blue2, OUTPUT);
pinMode(2, INPUT_PULLUP); //подключение кнопки к pin 2
}
void button2() {
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; if (i > x) {
i = 0;
}
}
}
void offRGB() {
digitalWrite(Red1, LOW); digitalWrite(Green2, LOW);
digitalWrite(Blue1, LOW); digitalWrite(Red2, LOW);
digitalWrite(Green1, LOW); digitalWrite(Blue2, LOW);
r = 0, g = 0, b = 0;
}
void program1() {
if (i == 1) {
while (r < 256) {
analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed1);
sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 1) {
while (b > 0) {
analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed1);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} b--;
}
}
if (i == 1) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed1);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 1) {
while (r > 0) {
analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed1);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} r--;
}
}
if (i == 1) {
while (b < 256) {
analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed1);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} b++;
}
}
if (i == 1) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed1);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
}
void program2() {
if (i == 2) {
while (r < 255) {
analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} r++;
}
}
if (i == 2) {
while (r > 0) {
analogWrite(Red1, r); analogWrite(Red2, r); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} r--;
}
}
if (i == 2) {
while (r < 255) {
analogWrite(Red1, r); analogWrite(Red2, r);
analogWrite(Blue1, r); analogWrite(Blue2, r); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} r++;
}
}
if (i == 2) {
while (r > 0) {
analogWrite(Red1, r); analogWrite(Red2, r);
analogWrite(Blue1, r); analogWrite(Blue2, r); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} r--;
}
}
if (i == 2) {
while (b < 256) {
analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} b++;
}
}
if (i == 2) {
while (b > 0) {
analogWrite(Blue1, b); analogWrite(Blue2, b); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} b--;
}
}
if (i == 2) {
while (b < 256) {
analogWrite(Blue1, b); analogWrite(Blue2, b);
analogWrite(Green1, b); analogWrite(Green2, b); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} b++;
}
}
if (i == 2) {
while (b > 0) {
analogWrite(Blue1, b); analogWrite(Blue2, b);
analogWrite(Green1, b); analogWrite(Green2, b); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} b--;
}
}
if (i == 2) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 2) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Green2, g); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
if (i == 2) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Green2, g);
analogWrite(Red1, g); analogWrite(Red2, g); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 2) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Green2, g);
analogWrite(Red1, g); analogWrite(Red2, g); delay(Speed2);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
}
void program3() {
if (i == 3) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Red2, g);
analogWrite(Blue1, g); analogWrite(Green2, g);
analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed3);
sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 3) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Red2, g);
analogWrite(Blue1, g); analogWrite(Green2, g);
analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed3);
sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
}
void program4() {
b = 255; analogWrite(Blue1, b); analogWrite(Red2, b);
while (j < 1) {
if (i == 4 && j < 1) {
while (r < 256) {
analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed4);
sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 4 && j < 1) {
while (b > 0) {
analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed4);
sensorVal = digitalRead(2); b--; if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 4 && j < 1) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Blue2, g); delay(Speed4);
sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 4 && j < 1) {
while (r > 0) {
analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed4);
sensorVal = digitalRead(2); r--; if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 4 && j < 1) {
while (b < 256) {
analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed4);
sensorVal = digitalRead(2); b++; if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 4 && j < 1) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Blue2, g); delay(Speed4);
sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
} j = 0;
}
void program5() {
if (i == 5) {
while (r < 255) {
analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed5);
sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (r > 0) {
analogWrite(Red1, r); analogWrite(Green2, r); delay(Speed5);
sensorVal = digitalRead(2); r--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (r < 255) {
analogWrite(Red1, r); analogWrite(Green2, r);
analogWrite(Green1, r); analogWrite(Blue2, r); delay(Speed5);
sensorVal = digitalRead(2); r++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (r > 0) {
analogWrite(Red1, r); analogWrite(Green2, r);
analogWrite(Green1, r); analogWrite(Blue2, r); delay(Speed5);
sensorVal = digitalRead(2); r--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (b < 256) {
analogWrite(Green1, b); analogWrite(Blue2, b); delay(Speed5);
sensorVal = digitalRead(2); b++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (b > 0) {
analogWrite(Green1, b); analogWrite(Blue2, b); delay(Speed5);
sensorVal = digitalRead(2); b--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (b < 256) {
analogWrite(Green1, b); analogWrite(Blue2, b);
analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed5);
sensorVal = digitalRead(2); b++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (b > 0) {
analogWrite(Green1, b); analogWrite(Blue2, b);
analogWrite(Blue1, b); analogWrite(Red2, b); delay(Speed5);
sensorVal = digitalRead(2); b--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (g < 255) {
analogWrite(Blue1, g); analogWrite(Red2, g); delay(Speed5);
sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (g > 0) {
analogWrite(Blue1, g); analogWrite(Red2, g); delay(Speed5);
sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (g < 255) {
analogWrite(Blue1, g); analogWrite(Red2, g);
analogWrite(Red1, g); analogWrite(Green2, g); delay(Speed5);
sensorVal = digitalRead(2); g++; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
if (i == 5) {
while (g > 0) {
analogWrite(Blue1, g); analogWrite(Red2, g);
analogWrite(Red1, g); analogWrite(Green2, g); delay(Speed5);
sensorVal = digitalRead(2); g--; if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
}
}
}
}
void program6() {
if (i == 6) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Red2, g);
analogWrite(Blue1, g); analogWrite(Green2, g);; delay(Speed6);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 6) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Red2, g);
analogWrite(Blue1, g); analogWrite(Green2, g); delay(Speed6);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
if (i == 6) {
while (g < 255) {
analogWrite(Green1, g); analogWrite(Red2, g);
analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 6) {
while (g > 0) {
analogWrite(Green1, g); analogWrite(Red2, g);
analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
if (i == 6) {
while (g < 255) {
analogWrite(Blue1, g); analogWrite(Green2, g);
analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 6) {
while (g > 0) {
analogWrite(Blue1, g); analogWrite(Green2, g);
analogWrite(Red1, g); analogWrite(Blue2, g); delay(Speed6);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
}
void program7() {
while (j < 1) {
Random1 = random (3, 7); Random4 = random (8, 12);
Random2 = random (3, 7); Random5 = random (8, 12);
Random3 = random (3, 7); Random6 = random (8, 12);
if (i == 7) {
while (g < 255 && j < 1) {
analogWrite(Random1, g); analogWrite(Random4, g);
analogWrite(Random2, g); analogWrite(Random5, g);
analogWrite(Random3, g); analogWrite(Random6, g); delay(Speed7);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 7 && j < 1) {
while (g > 0) {
analogWrite(Random1, g); analogWrite(Random4, g);
analogWrite(Random2, g); analogWrite(Random5, g);
analogWrite(Random3, g); analogWrite(Random6, g); delay(Speed7);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
} j = 0;
}
void program8() {
while (j < 1) {
Random1 = random (3, 7); Random4 = random (8, 12);
Random2 = random (3, 7); Random5 = random (8, 12);
Random3 = random (3, 7); Random6 = random (8, 12);
SpeedR = random (2, 10);
if (i == 8 && j < 1) {
while (g < 255) {
analogWrite(Random1, g); analogWrite(Random4, g);
analogWrite(Random2, g); analogWrite(Random5, g);
analogWrite(Random3, g); analogWrite(Random6, g); delay(SpeedR);
sensorVal = digitalRead(2); if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
} g++;
}
}
if (i == 8 && j < 1) {
while (g > 0) {
analogWrite(Random1, g); analogWrite(Random4, g);
analogWrite(Random2, g); analogWrite(Random5, g);
analogWrite(Random3, g); analogWrite(Random6, g); delay(SpeedR);
sensorVal = digitalRead(2);
if (sensorVal == HIGH) {
delay(500); i++; j++; offRGB(); if (i > x) {
i = 0;
}
} g--;
}
}
} j = 0;
}
void loop() {
button2(); if (i == 0) {
offRGB();
}
if (i == 1) {
program1();
}
if (i == 2) {
program2();
}
if (i == 3) {
program3();
}
if (i == 4) {
program4();
}
if (i == 5) {
program5();
}
if (i == 6) {
program6();
}
if (i == 7) {
program7();
}
if (i == 8) {
program8();
}
}
Чи можете налаштувати цей скетч, як вам подобається. Або просто як є, завантажте на плату, і зберіть все, як показано на цій схемі.
Після збирання пристрою подається живлення 12 вольт. При запуску автоматично активується нульова програма з функцією “offRGB”, при цьому стрічка не світитиметься. Коротке натискання кнопки переводить цикл до наступної програми: перше натискання – до “program1”, друге – до “program2”, і так далі. Після восьмого натискання, яке активує “program8”, цикл повертається до “offRGB”.
У цій схемі використовуються мосфет-транзистори T40N03G, які витримують до 24 вольт і струм до 45 ампер. Ці характеристики дозволяють підключати до 220 метрів RGB стрічки, аналогічної до тієї, що використовується у схемі. У разі заміни транзисторів на інші N-канальні мосфети, важливо врахувати їх потужність та уважно дотримуватись розпинування, яке може відрізнятися від розпинування T40N03G.