Через пару дней новый год, и возможно кто то захочет сделать собственный RGB контроллер на 2 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();
}
}
//Конец скетча
В скетче имеется функции:
“button2” - для опроса кнопки, и если кнопка нажата то перейти к следующей функции.
“offRGB” - служит для отключения каналов RGB и обнуления переменных “r, g, b”.
“program1, program2, program3, program4, program5, program6, program7 и program8” - содержат алгоритмы для RGB
Переменные “Speed1, Speed2, Speed3 Speed4=5, Speed5=5, Speed6=5 и Speed7=5” имеют значение “5”. Оно является задержкой, и влияет на скорость выполнения алгоритмов, чем больше это значение тем медленнее скорость выполнения, и наоборот.
Переменная SpeedR = random (2, 10); которая находится в 302 строке, является рандомной задержкой для функции “program8” где значение “2” является минимальным а значение “10” максимальным.
Переменная “x” служит для хранения количества режимов для RGB. Значение “8” означает 9 программы (0, 1, 2, 3, 4, 5, 6, 7, 8) = (offRGB, program1, program2, program3, program4, program5, program6, program7, program8). Если вы измените количество программ, то для корректной работы также необходимо изменить значение переменной “x”.
После сборки можно подать питание 12 вольт. При запуске будет выполняться нулевая программа с функцией “offRGB” и лента светиться не будет! Нажмите кратковременно на кнопку и цикл перейдет к программе с функцией “program1”, после второго нажатия “program2”, и так далее. После восьмого нажатия “program8” цикл опять перейдет к “offRGB”.
В этой схеме я применил мосфет транзисторы T40N03G. Они выдерживают напряжение до 24 вольт и ток 45 ампер. Этого хватит для подключения 220 метров такой RGB ленты как у меня. Вы можете применить любые другие N-канальные мосфеты которые подойдут вам по мощности, главное соблюдайте распиновку при их подключении, ОНА МОЖЕТ ОТЛИЧАТЬСЯ от распиновки T40N03G!