Эффекты для обычной RGB ленты

Всем привет. Есть обычный кусок светодиодной RGB ленты. Где взять все возможные “эффекты” - цвета для такой ленты??? Спасибо.

Написать генератор истинно случайных последовательностей цветов и погонять его пару тысяч лет?

1 лайк

Обычным бывает стиральный порошок, а светодиодная лента всегда имеет свою схему, свои параметры и характеристики. Скажете, что за лента - будет разговор, не скажете, … ну, Вы сами поняли.

1 лайк

а если точнее - так и так разговора не будет :slight_smile:
Вопрос разумного ответа не предполагает.
Автор, имея масляные краски - хочет получить все возможные живописные полотна формата 20х25, начиная от “малых голландев” и заканчивая детской мазней из соседнего детсада.

Да, нет, почему, по-моему, он спрашивает адрес ближайшей галереи, где эти полотна можно приобрести. Просто не уточнил требования к рисункам.

Гуглить по слову “комбинаторика”.

1 лайк

Да походу так и придется =)

Добрый вечер. Да не нужны мне никакие полотна, просто сделал свет на балконе из обычной 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);
  }
}

А если использовать шим, то можно любые оттенки делать :wink:

Баловался несколько лет назад, для управления использовал 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;}
}
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
 



1 лайк

Спасибо.

На всякий случай, вдруг заинтересует:

вот например
Варианты управления гирляндой / лентой - Отвлечённые темы - 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;
		}
	}
}

У ТС не адресная лента !!!

Откуда знаешь? Он, вроде бы, писал только что она “обычная”…

1 лайк

Из #8 точно понятно …

sorry, не обратил внимания.