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

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

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

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

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

Плата Arduino NANO.

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

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

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

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

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

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



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

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

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

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

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


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


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