Программирование RGB ленты

Elodreip
Offline
Зарегистрирован: 04.12.2017

Доброго здравия!

Интересует создание рандомайзера для RGB ленты. Нужен полный охват всех цветов (16,5 млн) в рандомном порядке,переключение цвета с помощью плавного перехода(чтобы R,G,B изменялись с дискретностью в единицу)

Есть такой исходник, который делает переход цветов, но по ограниченному периоду.(Охватывает всего лишь до трёх тысяч цветов)
Есть идея, что можна реализовать это, как в бильярде, а именно в векторном виде, чтобы вектор отбивался от граней куба.
 

#include <time.h>
int a1,a2,a3,c1,c2,c3,l;
void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:
 srand(time(NULL));
  a1=rand() %255+1;
  analogWrite(3, a1);
  a2=rand() %255+1;
  analogWrite(5, a2);
  a3=rand() %255+1;
  analogWrite(6, a3);
  
c1=1;
c2=0;
c3=1;
  
 
}

void loop() {
  // put your main code here, to run repeatedly:
//Serial.print("a1=");
Serial.print(a1);
//Serial.print(" a2=");
Serial.print(" ");
Serial.print(a2);
//Serial.print(" a3=");
Serial.print(" ");
Serial.print(a3);
Serial.print(" ");
Serial.print(c1);
Serial.print("\n");
delay(10);
  

  if(0<=a1&&a1<=5)
  {c1=1;}
  else if(250<=a1&&a1<=255)
  {c1=0;}
   if(0<=a2&&a2<=5)
  {c2=1;}
  else if(250<=a2&&a2<=255)
  {c2=0;}
   if(0<=a3&&a3<=5)
  {c3=1;}
  else if(250<=a3&&a3<=255)
  {c3=0;}
  analogWrite(3, a1);
  if(c1==1)
  {
    l=rand() % 5 +1;
    a1+=l;;
  }
  else
  {
    l=rand() % 5 +1;
    a1-=l;;
  }
  delay(25);
  analogWrite(5, a2);
  if(c2==1)
  {l=rand() % 5 +1;
    a2+=l;;
  }
  else
  {l=rand() % 5 +1;
    a2-=l;;
  }
  delay(2);
   analogWrite(6, a3);
  if(c3==1)
  {l=rand() % 5 +1;
    a3+=l;;
  }
  else
  {l=rand() % 5 +1;
    a3-=l;;
  }
  delay(2);
//delay (500);

}

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

так рандом или плавный переход на 1...???

Elodreip
Offline
Зарегистрирован: 04.12.2017

И то, и то. Суть в том, чтоб изменялись R, G, B независимо друг от друга в рандомном порядке с дискретностью в единицу

Elodreip
Offline
Зарегистрирован: 04.12.2017

Представте себе куб, три оси которого R, G, B. Каждый канал имеет 256 значений интенсивности, в сумме мы получаем куб с 16,7 млн возможными оттенками цветов. Возьмем любую ячейку в этом кубе, для плавного изменения цвета мы должны перемещатся через каждую ячейку, но в какую сторону это должно выбираться произвольно. Например, возможные перемещения: [55,100,30] -> [54,101,31]->[53,100,32]->...и т.д. Важна именно рандомизация направленя перемещения ячейки в этом кубе.

vk007
Offline
Зарегистрирован: 16.06.2015

Elodreip пишет:

Есть идея, что можна реализовать это, как в бильярде, а именно в векторном виде, чтобы вектор отбивался от граней куба.

Elodreip пишет:

Например, возможные перемещения: [55,100,30] -> [54,101,31]->[53,100,32]->...и т.д. Важна именно рандомизация направленя перемещения ячейки в этом кубе.

Вы сами себе противоречите. Где же тут "как в бильярде"? Если первый и третий параметры уменьшаются и увеличиваются соответственно (55-54-53... и 30-31-32...) - норма, то второй прыгает, как заяц - 100-101-100... "Как в бильярде" - это, я так понимаю, есть определенное направление, при котором параметры постепенно увеличиваются/уменьшаются, пока один из них не достигнет "стенки" (0 или максимума) и только потом возможна смена знака приращения.

Elodreip
Offline
Зарегистрирован: 04.12.2017

Пример с бильярдом это как один вариант движения, а с координатами другой вариант.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Похоже вы перетрудились . Что бы RGB ,были независимы им надо друг на друга начхать. Возьмем один параметр. к примеру R. на сколько надо поменять значение. Направление в +/-  это один параметр . Длительность развития от 1 милисек до 1 сек. и скорость прироста быстрая вспышка или медленая. Задаете рандом на 3 параметра , вычисляете до реальной реализации и ждете следующий шаг. 

Logik
Offline
Зарегистрирован: 05.08.2014

Не сложно это пишется. Пусть rgb - текущий цвет свечения. Генерим случайные RGB. Пока rgb!=RGB крутим цикл в котором if(r<R) r++; if(r>R)r--; остальные цвета аналогично. По завершению цикла генерим новые RGB и повторяем. Можна еще чесней - на  1  изменяем только тот цвет у которого разница между текущим и случайным по модулю наибольшая. Остальные цвета изменяем пропорционально, на дробную часть. Однако не партесь, результат Вам и в том и в другом случае скорей всего не понравится. Потому что теорию вероятности учить надо было ;)