Всем привет. Есть обычный кусок светодиодной RGB ленты. Где взять все возможные “эффекты” - цвета для такой ленты??? Спасибо.
Написать генератор истинно случайных последовательностей цветов и погонять его пару тысяч лет?
Обычным бывает стиральный порошок, а светодиодная лента всегда имеет свою схему, свои параметры и характеристики. Скажете, что за лента - будет разговор, не скажете, … ну, Вы сами поняли.
а если точнее - так и так разговора не будет
Вопрос разумного ответа не предполагает.
Автор, имея масляные краски - хочет получить все возможные живописные полотна формата 20х25, начиная от “малых голландев” и заканчивая детской мазней из соседнего детсада.
Да, нет, почему, по-моему, он спрашивает адрес ближайшей галереи, где эти полотна можно приобрести. Просто не уточнил требования к рисункам.
Гуглить по слову “комбинаторика”.
Да походу так и придется =)
Добрый вечер. Да не нужны мне никакие полотна, просто сделал свет на балконе из обычной 12V RGB ленты. Arduino и 3 транзистора. Хотел по кнопке переключать цвета - просто сейчас у меня там 6 цветов, хотел расширить не много. А с фантазией туговато. Может кто-то уже просто делал. Мой код сейчас такой:
void setMode(int mode)
{
//RED
if (mode == 1)
{
digitalWrite(RLED, HIGH);
digitalWrite(GLED, LOW);
digitalWrite(BLED, LOW);
}
//GREEN
else if (mode == 2)
{
digitalWrite(RLED, LOW);
digitalWrite(GLED, HIGH);
digitalWrite(BLED, LOW);
}
//BLUE
else if (mode == 3)
{
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, HIGH);
}
//PURPLE (RED+BLUE)
else if (mode == 4)
{
analogWrite(RLED, 127);
analogWrite(GLED, 0);
analogWrite(BLED, 127);
}
//TEAL (BLUE+GREEN)
else if (mode == 5)
{
analogWrite(RLED, 0);
analogWrite(GLED, 127);
analogWrite(BLED, 127);
}
//ORANGE (GREEN+RED)
else if (mode == 6)
{
analogWrite(RLED, 127);
analogWrite(GLED, 127);
analogWrite(BLED, 0);
}
//WHITE (GREEN+RED+BLUE)
else if (mode == 7)
{
analogWrite(RLED, 85);
analogWrite(GLED, 85);
analogWrite(BLED, 85);
}
//OFF (mode = 0)
else
{
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, LOW);
}
}
А если использовать шим, то можно любые оттенки делать
Баловался несколько лет назад, для управления использовал 3 потенциометра.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
// ПЕРЕКЛЮЧАТЕЛЬ СВЕТОДИОДНОЙ RGB ЛЕНТЫ
//
#define Re 9
#define Gr 10
#define Bl 11
byte n=75;//переменная длительности между переключениями
byte Mx=255;//переменная для хранения макс. знач. яркости
byte N=0;//переменная-номер программы переключений
long Y=0;//переменная для хранения текущего времени
long Y1=0;//переменная для хранения текущего времени
void setup()
{
pinMode(Re, OUTPUT);//красный
digitalWrite(Re, LOW);
pinMode(Gr, OUTPUT);//зелёный
digitalWrite(Gr, LOW);
pinMode(Bl, OUTPUT);//синий
digitalWrite(Bl, LOW);
pinMode(A0, INPUT);//регулятор скорости - потенциометр
pinMode(A1, INPUT);//регулятор яркости - потенциометр
pinMode(A2, INPUT);//регулятор выбора программы - потенциометр
}
void loop()
{
/////////////////////////////// №1 ПЛАВНЫЙ РАДУЖНЫЙ ПЕРЕХОД-СМЕНА ЦВЕТОВ////////////////////////////////////////
if (N==0||N==1)//условие исполнения данной программы
{
analogWrite(Bl,Mx);//начальное включение ленты - синий
for (byte i=0;i<Mx;i++)
{
analogWrite(Bl,Mx-i);analogWrite(Gr,i);delay_(n*255/Mx);//переход синий-зелёный
}
for (byte i=0;i<Mx;i++)
{
analogWrite(Gr,Mx-i);analogWrite(Re,i);delay_(n*255/Mx);//переход зелёный-красный
}
for (byte i=0;i<Mx;i++)
{
analogWrite(Re,Mx-i);analogWrite(Bl,i);delay_(n*255/Mx);//переход красный-синий
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// №2 ПЛАВНЫЙ ПЕРЕХОД НА БЕЛЫЙ С ВОЗВРАТОМ НА ОДИН ИЗ ЦВЕТОВ ///////////////////////
if (N==0||N==2)//условие исполнения данной программы
{
analogWrite(Bl,Mx);//начальное включение ленты - синий
for (byte i=0;i<Mx;i++)
{
analogWrite(Re,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
}
for (byte i=0;i<Mx;i++)
{
analogWrite(Gr,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на красный
}
//////////////////////////////////////
for (byte i=0;i<Mx;i++)
{
analogWrite(Bl,i);analogWrite(Gr,i);delay_(n*127/Mx);//переход на белый
}
for (byte i=0;i<Mx;i++)
{
analogWrite(Re,Mx-i);analogWrite(Bl,Mx-i);delay_(n*127/Mx);//переход на зелёный
}
//////////////////////////////////////
for (byte i=0;i<Mx;i++)
{
analogWrite(Re,i);analogWrite(Bl,i);delay_(n*127/Mx);//переход на белый
}
for (byte i=0;i<Mx;i++)
{
analogWrite(Gr,Mx-i);analogWrite(Re,Mx-i);delay_(n*127/Mx);//переход на синий
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// №3 ПСЕВДОСЛУЧАЙНОЕ ПЕРЕКЛЮЧЕНИЕ ЦВЕТА ЧЕРЕЗ ПАУЗУ ///////////////////////
if (N==0||N==3)//условие исполнения данной программы
{
Y1=millis();
while(millis()-Y1<300*n)//условие длительности исполнения данной программы за 1 проход loop()
{
analogWrite(Bl,random(0,3)*Mx/2);//выбор цвета из 27 с учётом "пусто"- выключение всех цветов
analogWrite(Re,random(0,3)*Mx/2);
analogWrite(Gr,random(0,3)*Mx/2);
delay_(15*n);//пауза между переключением
}
analogWrite(Bl,Mx);//начальное включение ленты - синий
analogWrite(Re,0);
analogWrite(Gr,0);
}
////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// №4 ПЛАВНЫЙ УХОД-ПРИХОД ЦВЕТА////////////////////////////////////////
if (N==0||N==4)//условие исполнения данной программы
{
analogWrite(Bl,Mx);//начальное включение ленты - синий
for (byte i=0;i<Mx;i++) {analogWrite(Bl,Mx-i);delay_(n*127/Mx);//уход синий
}
for (byte i=0;i<Mx;i++) {analogWrite(Gr,i);delay_(n*127/Mx);//приход зелёный
}
for (byte i=0;i<Mx;i++) {analogWrite(Gr,Mx-i);delay_(n*127/Mx);//уход зелёный
}
for (byte i=0;i<Mx;i++) {analogWrite(Re,i);delay_(n*127/Mx);//приход красный
}
for (byte i=0;i<Mx;i++) {analogWrite(Re,Mx-i);delay_(n*127/Mx);//уход красный
}
for (byte i=0;i<Mx;i++) {analogWrite(Bl,i);delay_(n*127/Mx);//приход синий
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
}
//// ФУНКЦИИ ОПИСАНИЕ // вместо задержки времени через delay ////////////////////////////////////////
void delay_(int T1)
{
Y=millis();metka:if(millis()-Y>=T1){}
else {
n=map(analogRead(A0), 0,1023, 20, 150);//регулировка скорости переключений ленты по потенциометру
Mx=map(analogRead(A1), 0,1023, 40, 255);//регулировка яркости переключений ленты по потенциометру
N=map(analogRead(A2), 0,1023, 0, 4);//выбор программы переключений ленты по потенциометру
goto metka;}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
Спасибо.
На всякий случай, вдруг заинтересует:
вот например
Варианты управления гирляндой / лентой - Отвлечённые темы - Arduino.ru
Спойлер
void pattern_random(unsigned char * oneBuf, unsigned short tIn) {
if (tIn % 8) return;
for (unsigned short i = 0; i < count_bytes_in_buf; ++i) *(oneBuf+i) = random();
}
void pattern_snakes(unsigned char * oneBuf, unsigned short tIn) {
for (unsigned short i = 0; i < numLEDSws281X; ++i) {
unsigned short x = (i + (tIn >> 1)) % 64;
if (x < 10){
*(oneBuf+i*ws281x_bytes_per_pixel) = 0xFF; // R
} else if (x >= 15 && x < 25) {
*(oneBuf+i*ws281x_bytes_per_pixel+1) = 0xFF; // G
} else if (x >= 30 && x < 40) {
*(oneBuf+i*ws281x_bytes_per_pixel+2) = 0xFF; // B
} else {
*(oneBuf+i*ws281x_bytes_per_pixel) = 0x00; // R
*(oneBuf+i*ws281x_bytes_per_pixel+1) = 0x00; // G
*(oneBuf+i*ws281x_bytes_per_pixel+2) = 0x00; // B
}
if (ws281x_bytes_per_pixel>3) *(oneBuf+i*ws281x_bytes_per_pixel+3) = 0x00; // W
}
}
void pattern_sparkle(unsigned char * oneBuf, unsigned short tIn) {
if (tIn % 8) return;
for (unsigned short i = 0; i < numLEDSws281X; ++i) {
unsigned char putByte = random() % 16 ? 0 : 0xFF;
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+i*ws281x_bytes_per_pixel+j) = putByte;
}
}
void pattern_greys(unsigned char * oneBuf, unsigned short tIn) {
for (unsigned short i = 0; i < numLEDSws281X; ++i) {
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+i*ws281x_bytes_per_pixel+j) = (unsigned char)tIn;
}
}
void pattern_blink(unsigned char * oneBuf, unsigned short tIn) {
static unsigned char cR, cG, cB;
static unsigned short currPos = 0;
static unsigned short currPeriod;
if (!currPos) { // start new
cR = random(); cG = random(); cB = random();
for (unsigned short i = 0; i < numLEDSws281X; ++i) {
*(oneBuf+i*ws281x_bytes_per_pixel) = cR;
*(oneBuf+i*ws281x_bytes_per_pixel+1) = cG;
*(oneBuf+i*ws281x_bytes_per_pixel+2) = cB;
if (ws281x_bytes_per_pixel>3) *(oneBuf+i*ws281x_bytes_per_pixel+3) = cR+cG+cB;
}
++currPos;
currPeriod = 20 + (random() >> 2);
} else { // cont
if (currPos == 3) for (unsigned short i = 0; i < count_bytes_in_buf; ++i) *(oneBuf+i) = 0;
if ((++currPos) >= currPeriod) currPos = 0;
}
}
void pattern_fillr(unsigned char * oneBuf, unsigned short tIn) {
if (tIn % 4) return;
static unsigned short i = 0;
static unsigned char fillMode = 0;
switch (fillMode) {
case 0: {
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+i*ws281x_bytes_per_pixel+j) = random();
break;
}
case 1: {
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+i*ws281x_bytes_per_pixel+j) = 0;
break;
}
case 2: {
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+(numLEDSws281X-i-1)*ws281x_bytes_per_pixel+j) = random();
break;
}
case 3: {
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+(numLEDSws281X-i-1)*ws281x_bytes_per_pixel+j) = 0;
break;
}
default: {}
}
if ((++i) >= numLEDSws281X) {
i = 0;
if ((++fillMode) >= 4) fillMode = 0;
}
}
void pattern_bomb(unsigned char * oneBuf, unsigned short tIn) {
static unsigned short s = 16;
if (tIn % s) return;
static unsigned short i = 0;
static unsigned char fillMode = 0;
static unsigned char c1R, c2R, c1G, c2G, c1B, c2B;
if ((!i) && (!fillMode)) {
c1R = random(); c1G = random(); c1B = random();
c2R = random(); c2G = random(); c2B = random();
s = 16;
}
switch (fillMode) {
case 0: {
*(oneBuf+i*ws281x_bytes_per_pixel) = c1R;
*(oneBuf+i*ws281x_bytes_per_pixel+1) = c1G;
*(oneBuf+i*ws281x_bytes_per_pixel+2) = c1B;
*(oneBuf+(numLEDSws281X-i-1)*ws281x_bytes_per_pixel) = c2R;
*(oneBuf+(numLEDSws281X-i-1)*ws281x_bytes_per_pixel+1) = c2G;
*(oneBuf+(numLEDSws281X-i-1)*ws281x_bytes_per_pixel+2) = c2B;
if (ws281x_bytes_per_pixel>3) {
*(oneBuf+i*ws281x_bytes_per_pixel+3) = c1R+c1G+c1B;
*(oneBuf+(numLEDSws281X-i-1)*ws281x_bytes_per_pixel+3) = c2R+c2G+c2B;
}
if (i) { // clear prev pixel
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+(i-1)*ws281x_bytes_per_pixel+j) = 0;
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+(numLEDSws281X-i)*ws281x_bytes_per_pixel+j) = 0;
}
break;
}
case 1: { // full fill pixel
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+((numLEDSws281X >> 1)-1-i)*ws281x_bytes_per_pixel+j) = 0xFF;
for (unsigned char j = 0; j < ws281x_bytes_per_pixel; ++j) *(oneBuf+((numLEDSws281X >> 1)+i)*ws281x_bytes_per_pixel+j) = 0xFF;
break;
}
default: {}
}
if ((++i) >= (numLEDSws281X >> 1)) { // half strip
i = 0;
if ((++fillMode) >= 2) {
fillMode = 0;
for (unsigned short i = 0; i < count_bytes_in_buf; ++i) *(oneBuf+i) = 0;
} else {
s = 4;
}
}
}
У ТС не адресная лента !!!
Откуда знаешь? Он, вроде бы, писал только что она “обычная”…
Из #8 точно понятно …
sorry, не обратил внимания.