Программирование RGB ленты
- Войдите на сайт для отправки комментариев
Пнд, 04/12/2017 - 22:24
Доброго здравия!
Интересует создание рандомайзера для 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);
}
так рандом или плавный переход на 1...???
И то, и то. Суть в том, чтоб изменялись R, G, B независимо друг от друга в рандомном порядке с дискретностью в единицу
Представте себе куб, три оси которого R, G, B. Каждый канал имеет 256 значений интенсивности, в сумме мы получаем куб с 16,7 млн возможными оттенками цветов. Возьмем любую ячейку в этом кубе, для плавного изменения цвета мы должны перемещатся через каждую ячейку, но в какую сторону это должно выбираться произвольно. Например, возможные перемещения: [55,100,30] -> [54,101,31]->[53,100,32]->...и т.д. Важна именно рандомизация направленя перемещения ячейки в этом кубе.
Есть идея, что можна реализовать это, как в бильярде, а именно в векторном виде, чтобы вектор отбивался от граней куба.
Например, возможные перемещения: [55,100,30] -> [54,101,31]->[53,100,32]->...и т.д. Важна именно рандомизация направленя перемещения ячейки в этом кубе.
Вы сами себе противоречите. Где же тут "как в бильярде"? Если первый и третий параметры уменьшаются и увеличиваются соответственно (55-54-53... и 30-31-32...) - норма, то второй прыгает, как заяц - 100-101-100... "Как в бильярде" - это, я так понимаю, есть определенное направление, при котором параметры постепенно увеличиваются/уменьшаются, пока один из них не достигнет "стенки" (0 или максимума) и только потом возможна смена знака приращения.
Пример с бильярдом это как один вариант движения, а с координатами другой вариант.
Похоже вы перетрудились . Что бы RGB ,были независимы им надо друг на друга начхать. Возьмем один параметр. к примеру R. на сколько надо поменять значение. Направление в +/- это один параметр . Длительность развития от 1 милисек до 1 сек. и скорость прироста быстрая вспышка или медленая. Задаете рандом на 3 параметра , вычисляете до реальной реализации и ждете следующий шаг.
Не сложно это пишется. Пусть rgb - текущий цвет свечения. Генерим случайные RGB. Пока rgb!=RGB крутим цикл в котором if(r<R) r++; if(r>R)r--; остальные цвета аналогично. По завершению цикла генерим новые RGB и повторяем. Можна еще чесней - на 1 изменяем только тот цвет у которого разница между текущим и случайным по модулю наибольшая. Остальные цвета изменяем пропорционально, на дробную часть. Однако не партесь, результат Вам и в том и в другом случае скорей всего не понравится. Потому что теорию вероятности учить надо было ;)