RGB контроллер для 2 светодиодных лент на базе Arduino NANO

Здравствуйте!

Через пару дней новый год, и возможно кто то захочет сделать собственный RGB контроллер на 2 RGB канала, на которые можно вешать аж по 110 метров светодиодной RGB ленты, со своими индивидуальными алгоритмами.

RGB контроллер на базе Arduino NANO

Для этого понадобятся:

Плата Arduino NANO.

Две двенадцати вольтовые RGB ленты.

Кнопка и сопротивление 1-10 килоом.

6 мосфет транзисторов T40N03G или любые другие N-канальные подходящие по мощности.

Для сборки устройства я еще использую макетную плату и соединительные провода, вы при желании можете сразу все спаять.

список материалов для RGB контроллера на базе Arduino NANO

//Начало скетча


  1. #define Red1 3
  2. #define Green1 5
  3. #define Blue1 6
  4. #define Red2 9
  5. #define Green2 10
  6. #define Blue2 11
  7. int r=0, g=0, b=0, sensorVal, x=8, i=0, j=0, SpeedR;
  8. int Speed1=5, Speed2=5, Speed3=5, Speed4=5, Speed5=5, Speed6=5, Speed7=5;
  9. int Random1, Random2, Random3, Random4, Random5, Random6;
  10. void setup(){
  11. pinMode(Red1, OUTPUT);pinMode(Green1, OUTPUT);
  12. pinMode(Blue1, OUTPUT);pinMode(Red2, OUTPUT);
  13. pinMode(Green2, OUTPUT);pinMode(Blue2, OUTPUT);
  14. pinMode(2, INPUT_PULLUP); //подключение кнопки к pin 2
  15. }
  16. void button2(){
  17. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  18. delay(500); i++; if (i>x){i=0;}}
  19. }
  20. void offRGB(){
  21. digitalWrite(Red1, LOW);digitalWrite(Green2, LOW);
  22. digitalWrite(Blue1, LOW);digitalWrite(Red2, LOW);
  23. digitalWrite(Green1, LOW);digitalWrite(Blue2, LOW);
  24. r=0, g=0, b=0;
  25. }
  26. void program1(){
  27. if (i==1){
  28. while (r < 256) {
  29. analogWrite(Red1, r);analogWrite(Red2, r);delay(Speed1);
  30. sensorVal = digitalRead(2); r++;if (sensorVal == HIGH) {
  31. delay(500); i++; offRGB(); if (i>x){i=0;}}
  32. }}
  33. if (i==1){while (b > 0) {
  34. analogWrite(Blue1, b);analogWrite(Blue2, b);delay(Speed1);
  35. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  36. delay(500); i++; offRGB(); if (i>x){i=0;}} b--;
  37. }}
  38. if (i==1){while (g < 255){
  39. analogWrite(Green1, g);analogWrite(Green2, g);delay(Speed1);
  40. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  41. delay(500); i++; offRGB(); if (i>x){i=0;}} g++;
  42. }}
  43. if (i==1){while (r > 0){
  44. analogWrite(Red1, r);analogWrite(Red2, r);delay(Speed1);
  45. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  46. delay(500); i++; offRGB(); if (i>x){i=0;}} r--;
  47. }}
  48. if (i==1){while (b < 256){
  49. analogWrite(Blue1, b);analogWrite(Blue2, b);delay(Speed1);
  50. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  51. delay(500); i++; offRGB(); if (i>x){i=0;}} b++;
  52. }}
  53. if (i==1){while (g > 0){
  54. analogWrite(Green1, g);analogWrite(Green2, g);delay(Speed1);
  55. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  56. delay(500); i++; offRGB(); if (i>x){i=0;}} g--;
  57. }}}
  58. void program2(){if (i==2){while (r < 255){
  59. analogWrite(Red1, r);analogWrite(Red2, r);delay(Speed2);
  60. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  61. delay(500); i++; offRGB(); if (i>x){i=0;}} r++;
  62. }}
  63. if (i==2){while (r > 0) {
  64. analogWrite(Red1, r);analogWrite(Red2, r);delay(Speed2);
  65. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  66. delay(500); i++; offRGB(); if (i>x){ i=0;}} r--;
  67. }}
  68. if (i==2){while (r < 255){
  69. analogWrite(Red1, r);analogWrite(Red2, r);
  70. analogWrite(Blue1, r);analogWrite(Blue2, r);delay(Speed2);
  71. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  72. delay(500); i++; offRGB(); if (i>x){ i=0;}} r++;
  73. }}
  74. if (i==2){while (r > 0){
  75. analogWrite(Red1, r);analogWrite(Red2, r);
  76. analogWrite(Blue1, r);analogWrite(Blue2, r);delay(Speed2);
  77. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  78. delay(500); i++; offRGB(); if (i>x){ i=0;}} r--;
  79. }}
  80. if (i==2){while (b < 256){
  81. analogWrite(Blue1, b);analogWrite(Blue2, b);delay(Speed2);
  82. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  83. delay(500); i++; offRGB(); if (i>x){ i=0;}} b++;
  84. }}
  85. if (i==2){while (b > 0){
  86. analogWrite(Blue1, b);analogWrite(Blue2, b);delay(Speed2);
  87. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  88. delay(500); i++; offRGB(); if (i>x){ i=0;}} b--;
  89. }}
  90. if (i==2){while (b < 256){
  91. analogWrite(Blue1, b);analogWrite(Blue2, b);
  92. analogWrite(Green1, b);analogWrite(Green2, b);delay(Speed2);
  93. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  94. delay(500); i++; offRGB(); if (i>x){ i=0;}} b++;
  95. }}
  96. if (i==2){while (b > 0){
  97. analogWrite(Blue1, b);analogWrite(Blue2, b);
  98. analogWrite(Green1, b);analogWrite(Green2, b);delay(Speed2);
  99. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  100. delay(500); i++; offRGB(); if (i>x){ i=0;}} b--;
  101. }}
  102. if (i==2){while (g < 255){
  103. analogWrite(Green1, g);analogWrite(Green2, g);delay(Speed2);
  104. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  105. delay(500); i++; offRGB(); if (i>x){ i=0;}} g++;
  106. }}
  107. if (i==2){while (g > 0){
  108. analogWrite(Green1, g);analogWrite(Green2, g);delay(Speed2);
  109. sensorVal = digitalRead(2);if (sensorVal == HIGH) {
  110. delay(500); i++; offRGB(); if (i>x){ i=0;}} g--;
  111. }}
  112. if (i==2){while (g < 255){
  113. analogWrite(Green1, g);analogWrite(Green2, g);
  114. analogWrite(Red1, g);analogWrite(Red2, g);delay(Speed2);
  115. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  116. delay(500); i++; offRGB(); if (i>x){ i=0;}} g++;
  117. }}
  118. if (i==2){while (g > 0){
  119. analogWrite(Green1, g);analogWrite(Green2, g);
  120. analogWrite(Red1, g);analogWrite(Red2, g);delay(Speed2);
  121. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  122. delay(500); i++; offRGB(); if (i>x){ i=0;}} g--;
  123. }}}
  124. void program3(){
  125. if (i==3){while (g < 255){
  126. analogWrite(Green1, g);analogWrite(Red2, g);
  127. analogWrite(Blue1, g);analogWrite(Green2, g);
  128. analogWrite(Red1, g);analogWrite(Blue2, g);delay(Speed3);
  129. sensorVal = digitalRead(2);g++;if (sensorVal == HIGH){
  130. delay(500); i++; offRGB(); if (i>x){i=0;}}
  131. }}
  132. if (i==3){while (g > 0){
  133. analogWrite(Green1, g);analogWrite(Red2, g);
  134. analogWrite(Blue1, g);analogWrite(Green2, g);
  135. analogWrite(Red1, g);analogWrite(Blue2, g);delay(Speed3);
  136. sensorVal = digitalRead(2); g--;if (sensorVal == HIGH){
  137. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  138. }}}
  139. void program4(){b=255; analogWrite(Blue1, b);analogWrite(Red2, b);
  140. while (j < 1) {if (i==4&&j < 1){while (r < 256) {
  141. analogWrite(Red1, r);analogWrite(Green2, r);delay(Speed4);
  142. sensorVal = digitalRead(2); r++;if (sensorVal == HIGH) {
  143. delay(500); i++; j++; offRGB(); if (i>x){i=0;}}
  144. }}
  145. if (i==4&&j < 1){while (b > 0) {
  146. analogWrite(Blue1, b);analogWrite(Red2, b);delay(Speed4);
  147. sensorVal = digitalRead(2); b--;if (sensorVal == HIGH) {
  148. delay(500); i++; j++; offRGB(); if (i>x){i=0;}}
  149. }}
  150. if (i==4&&j < 1){while (g < 255){
  151. analogWrite(Green1, g);analogWrite(Blue2, g);delay(Speed4);
  152. sensorVal = digitalRead(2); g++;if (sensorVal == HIGH) {
  153. delay(500); i++; j++; offRGB(); if (i>x){i=0;}}
  154. }}
  155. if (i==4&&j < 1){while (r > 0){
  156. analogWrite(Red1, r);analogWrite(Green2, r);delay(Speed4);
  157. sensorVal = digitalRead(2); r--;if (sensorVal == HIGH) {
  158. delay(500); i++; j++; offRGB(); if (i>x){i=0;}}
  159. }}
  160. if (i==4&&j < 1){while (b < 256){
  161. analogWrite(Blue1, b);analogWrite(Red2, b);delay(Speed4);
  162. sensorVal = digitalRead(2); b++;if (sensorVal == HIGH) {
  163. delay(500); i++; j++; offRGB(); if (i>x){i=0;}}
  164. }}
  165. if (i==4&&j < 1){while (g > 0){
  166. analogWrite(Green1, g);analogWrite(Blue2, g);delay(Speed4);
  167. sensorVal = digitalRead(2); g--;if (sensorVal == HIGH) {
  168. delay(500); i++; j++; offRGB(); if (i>x){i=0;}}
  169. }}}j=0;
  170. }
  171. void program5(){
  172. if (i==5){while (r < 255){
  173. analogWrite(Red1, r);analogWrite(Green2, r);delay(Speed5);
  174. sensorVal = digitalRead(2); r++;if (sensorVal == HIGH) {
  175. delay(500); i++; offRGB(); if (i>x){i=0;}}
  176. }}
  177. if (i==5){while (r > 0) {
  178. analogWrite(Red1, r);analogWrite(Green2, r);delay(Speed5);
  179. sensorVal = digitalRead(2); r--;if (sensorVal == HIGH) {
  180. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  181. }}
  182. if (i==5){while (r < 255){
  183. analogWrite(Red1, r);analogWrite(Green2, r);
  184. analogWrite(Green1, r);analogWrite(Blue2, r);delay(Speed5);
  185. sensorVal = digitalRead(2); r++;if (sensorVal == HIGH){
  186. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  187. }}
  188. if (i==5){while (r > 0){
  189. analogWrite(Red1, r);analogWrite(Green2, r);
  190. analogWrite(Green1, r);analogWrite(Blue2, r);delay(Speed5);
  191. sensorVal = digitalRead(2); r--;if (sensorVal == HIGH){
  192. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  193. }}
  194. if (i==5){while (b < 256){
  195. analogWrite(Green1, b);analogWrite(Blue2, b);delay(Speed5);
  196. sensorVal = digitalRead(2); b++;if (sensorVal == HIGH) {
  197. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  198. }}
  199. if (i==5){while (b > 0){
  200. analogWrite(Green1, b);analogWrite(Blue2, b);delay(Speed5);
  201. sensorVal = digitalRead(2); b--;if (sensorVal == HIGH) {
  202. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  203. }}
  204. if (i==5){while (b < 256){
  205. analogWrite(Green1, b);analogWrite(Blue2, b);
  206. analogWrite(Blue1, b);analogWrite(Red2, b);delay(Speed5);
  207. sensorVal = digitalRead(2); b++;if (sensorVal == HIGH){
  208. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  209. }}
  210. if (i==5){while (b > 0){
  211. analogWrite(Green1, b);analogWrite(Blue2, b);
  212. analogWrite(Blue1, b);analogWrite(Red2, b);delay(Speed5);
  213. sensorVal = digitalRead(2); b--;if (sensorVal == HIGH) {
  214. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  215. }}
  216. if (i==5){while (g < 255){
  217. analogWrite(Blue1, g);analogWrite(Red2, g);delay(Speed5);
  218. sensorVal = digitalRead(2); g++;if (sensorVal == HIGH){
  219. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  220. }}
  221. if (i==5){while (g > 0){
  222. analogWrite(Blue1, g);analogWrite(Red2, g);delay(Speed5);
  223. sensorVal = digitalRead(2); g--;if (sensorVal == HIGH) {
  224. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  225. }}
  226. if (i==5){while (g < 255){
  227. analogWrite(Blue1, g);analogWrite(Red2, g);
  228. analogWrite(Red1, g);analogWrite(Green2, g);delay(Speed5);
  229. sensorVal = digitalRead(2); g++;if (sensorVal == HIGH){
  230. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  231. }}
  232. if (i==5){while (g > 0){
  233. analogWrite(Blue1, g);analogWrite(Red2, g);
  234. analogWrite(Red1, g);analogWrite(Green2, g);delay(Speed5);
  235. sensorVal = digitalRead(2); g--;if (sensorVal == HIGH){
  236. delay(500); i++; offRGB(); if (i>x){ i=0;}}
  237. }}}
  238. void program6(){if (i==6){while (g < 255){
  239. analogWrite(Green1, g);analogWrite(Red2, g);
  240. analogWrite(Blue1, g);analogWrite(Green2, g);;delay(Speed6);
  241. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  242. delay(500); i++; offRGB(); if (i>x){i=0;}} g++;
  243. }}
  244. if (i==6){while (g > 0){
  245. analogWrite(Green1, g);analogWrite(Red2, g);
  246. analogWrite(Blue1, g);analogWrite(Green2, g);delay(Speed6);
  247. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  248. delay(500); i++; offRGB(); if (i>x){ i=0;}} g--;
  249. }}
  250. if (i==6){while (g < 255){
  251. analogWrite(Green1, g);analogWrite(Red2, g);
  252. analogWrite(Red1, g);analogWrite(Blue2, g);delay(Speed6);
  253. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  254. delay(500); i++; offRGB(); if (i>x){i=0;}} g++;
  255. }}
  256. if (i==6){while (g > 0){
  257. analogWrite(Green1, g);analogWrite(Red2, g);
  258. analogWrite(Red1, g);analogWrite(Blue2, g);delay(Speed6);
  259. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  260. delay(500); i++; offRGB(); if (i>x){ i=0;}} g--;
  261. }}
  262. if (i==6){while (g < 255){
  263. analogWrite(Blue1, g);analogWrite(Green2, g);
  264. analogWrite(Red1, g);analogWrite(Blue2, g);delay(Speed6);
  265. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  266. delay(500); i++; offRGB(); if (i>x){i=0;}} g++;
  267. }}
  268. if (i==6){while (g > 0){
  269. analogWrite(Blue1, g);analogWrite(Green2, g);
  270. analogWrite(Red1, g);analogWrite(Blue2, g);delay(Speed6);
  271. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  272. delay(500); i++; offRGB(); if (i>x){ i=0;}} g--;
  273. }}}
  274. void program7(){while (j<1){
  275. Random1 = random (3, 7);Random4 = random (8, 12);
  276. Random2 = random (3, 7);Random5 = random (8, 12);
  277. Random3 = random (3, 7);Random6 = random (8, 12);
  278. if (i==7){ while (g < 255&&j < 1){
  279. analogWrite(Random1, g);analogWrite(Random4, g);
  280. analogWrite(Random2, g);analogWrite(Random5, g);
  281. analogWrite(Random3, g);analogWrite(Random6, g);delay(Speed7);
  282. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  283. delay(500); i++; j++; offRGB(); if (i>x){i=0;}} g++;
  284. }}
  285. if (i==7&&j < 1){while (g > 0){
  286. analogWrite(Random1, g);analogWrite(Random4, g);
  287. analogWrite(Random2, g);analogWrite(Random5, g);
  288. analogWrite(Random3, g);analogWrite(Random6, g);delay(Speed7);
  289. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  290. delay(500); i++; j++; offRGB(); if (i>x){ i=0;}} g--;
  291. }}}j=0;
  292. }
  293. void program8(){while (j<1){
  294. Random1 = random (3, 7);Random4 = random (8, 12);
  295. Random2 = random (3, 7);Random5 = random (8, 12);
  296. Random3 = random (3, 7);Random6 = random (8, 12);
  297. SpeedR = random (2, 10);
  298. if (i==8&&j < 1){ while (g < 255){
  299. analogWrite(Random1, g);analogWrite(Random4, g);
  300. analogWrite(Random2, g);analogWrite(Random5, g);
  301. analogWrite(Random3, g);analogWrite(Random6, g);delay(SpeedR);
  302. sensorVal = digitalRead(2);if (sensorVal == HIGH){
  303. delay(500); i++; j++; offRGB(); if (i>x){i=0;}} g++;
  304. }}
  305. if (i==8&&j < 1){while (g > 0){
  306. analogWrite(Random1, g);analogWrite(Random4, g);
  307. analogWrite(Random2, g);analogWrite(Random5, g);
  308. analogWrite(Random3, g);analogWrite(Random6, g);delay(SpeedR);
  309. sensorVal = digitalRead(2);
  310. if (sensorVal == HIGH){
  311. delay(500); i++; j++; offRGB(); if (i>x){ i=0;}} g--;
  312. }}}j=0;}
  313. void loop() {button2();if (i == 0){offRGB();}
  314. if (i == 1){program1();}if (i == 2){program2();}
  315. if (i == 3){program3();}if (i == 4){program4();}
  316. if (i == 5){program5();}if (i == 6){program6();}
  317. if (i == 7){program7();}if (i == 8){program8();}
  318. }

//Конец скетча


В скетче имеется функции:

“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”.

Можете настроит этот скетч, как вам нравится. Или просто как есть, загрузите на плату, и соберите все, как показано на этой схеме.

принципиальная схема RGB контроллер на базе Arduino NANO

После сборки можно подать питание 12 вольт. При запуске будет выполняться нулевая программа с функцией “offRGB” и лента светиться не будет! Нажмите кратковременно на кнопку и цикл перейдет к программе с функцией “program1”, после второго нажатия “program2”, и так далее. После восьмого нажатия “program8” цикл опять перейдет к “offRGB”.

В этой схеме я применил мосфет транзисторы T40N03G. Они выдерживают напряжение до 24 вольт и ток 45 ампер. Этого хватит для подключения 220 метров такой RGB ленты как у меня. Вы можете применить любые другие N-канальные мосфеты которые подойдут вам по мощности, главное соблюдайте распиновку при их подключении, ОНА МОЖЕТ ОТЛИЧАТЬСЯ от распиновки T40N03G!


Видео версия проекта "RGB контроллер для 2 светодиодных лент на базе Arduino NANO"


RGB контроллер для 2 светодиодных лент на базе Arduino NANO