Страница 2 из 2
Re: 100 эффектов RGB
Добавлено: Ср янв 11, 2012 17:54:35
просто КОТ
Тот был из статьи, а вот мой авторский! Эффект №3 -- Блицкриг!
Код: Выделить всё
1<<PINB0
delay_ms(300)
1<<PINB1
delay_ms(300)
1<<PINB2
delay_ms(300)
0<<PINB1
delay_ms(300)
0<<PINB0
delay_ms(300)
1<<PINB1
delay_ms(300)
0<<PINB2
delay_ms(300)
0<<PINB1
Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:03:34
WildCat
№ 4 - Радуга
Могу предложить полноценные радужные переливы.
Все что нужно - сделать преобразование из HSV в RGB модель для светодиода. Для HSV примем S и V равными 100 (максимальное значение), а H (hue, оттенок) будем вращать по кругу (0-360градусов).
если теперь сделать цикл от 0 до 360, для каждого значения H выполнять преобразование по формуле.
Для получения мягких тонов можно убавлять параметр S (saturation - насыщенность). Тогда из сочного цвета он будет перетекать в бледный оттенок и в белый. По мне, так это клевая фишка для лампы настроения на одном RGB диоде. Если сделать насыщенность, например, 30, а оттенок крутить в пределах желаемого пользователем оттенка (сине-зеленый, красно-оранжевый например).
Вообще, HSV модель куда более "человечна", что позволяет программировать множество цветовых эффектов с минимальными затратами. Все, что для этого нужно - по сути функция, осуществляющая перевод цвета из одной модели в другую. Вот она:
Код: Выделить всё
void HSV2RGB (unsigned char &r, unsigned char &g, unsigned char &b,
unsigned int i_hue, unsigned char sat, unsigned char val)
/* Вход:
* 0 <= hue < 360 градусов - оттенок. Основные цвета:
* 0 - красный, 60 - желтый,
* 120 - зеленый, 180 - голубой
* 240 - синий, 300 - пурпурный
* hue == 360 - не определён
* 0 <= sat <= 255 - Saturation - насыщенность
* 0 <= val <= 255 - Value - яркость
*
* Выход:
* 0 <= r,g,b <= 255 - значения красного, зеленого, синего
*/
{
int ii;
double fr, hue;
unsigned char c1, c2, c3;
if (!sat)
r = g = b = val;
else
{ /* Хроматический цвет */
while (i_hue >= 360)
i_hue -= 360;
hue = i_hue;
ii = (int)(hue /= 60.0);
fr = hue - ii;
c1 = (val * (255 - sat)) / 255;
c2 = (val * (255 - sat * fr)) / 255;
c3 = (val * (255 - sat * (1.0 - fr))) / 255;
switch (ii)
{
case 0: r = val; g = c3; b = c1; break;
case 1: r = c2; g = val; b = c1; break;
case 2: r = c1; g = val; b = c3; break;
case 3: r = c1; g = c2; b = val; break;
case 4: r = c3; g = c1; b = val; break;
case 5: r = val; g = c1; b = c2; break;
}
}
}
Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:06:34
просто КОТ
А это чем то отлечается от плавной смены цвета под №2?! Если да, то это эффект №4 -- радуга!
Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:12:38
WildCat
Подписал номер.
Да, эффект отличается. Во втором примере там просто по кругу красный, зеленый и синий цвета зажигаются плавно. В моем же примере их можно зажигать в хитрых комбинациях. Правда, для получения хороших оттенков, нужно сначала выставить баланс белого - программными средствами подать с МК ШИМ со 100% заполнением, как он будет подаваться в дальнейшем из управляющей программы. При этом, скорее всего мы получим не белый, а розовый свет. Теперь нужно уже аппаратным путем подобрать токоограничивающие резисторы в цепях светодиодов так, чтобы он давал субъективно чистый белый свет (по выбору, можно холодный или теплый оттенок). После этого моя радуга будет давать правдивые оттенки (при условии хорошего светорассеивателя, чтобы свет диодов хорошо смешивался).
Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:17:19
просто КОТ
WildCat писал(а):Все что нужно - сделать преобразование из HSV в RGB модель для светодиода.
А как мне это сделать?! Что то переписать надо?! Я пока новичок в МК, не всё понимаю. . .

Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:21:52
hybroid
Что-то я не вкурю, как можно сделать
100 эффектов на одном несчастном RGB-диоде

Кроме мырганий, переливаний и плавного включения-выключения что ещё можно сделать?.. Вроде ничего

Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:24:36
просто КОТ
Re: 100 эффектов RGB
Добавлено: Чт янв 12, 2012 22:33:14
WildCat
просто КОТ писал(а):А как мне это сделать?! Что то переписать надо?! Я пока новичок в МК, не всё понимаю. . .

Я же привел функцию. Ей даешь три параметра HSV модели, т.е. оттенок, насыщенность и яркость. А она возвращает три значения - уровни яркости для RGB диодов. Сама функция очень шустрая. Чтобы сделать радугу, нужно эту функцию гонять в цикле, меняя параметр Hue от 0 до 360 (359 если быть точным). А полученные значения выставлять на ШИМ для светодиодов. Чем меньше задержка в цикле, тем быстрее будут меняться цвета.
Re: 100 эффектов RGB
Добавлено: Пт янв 13, 2012 00:33:46
1stFX
Лучшее - враг хорошего. У WildCat все нормально реализовано на первый взгляд, зачем мудрить?
Re: 100 эффектов RGB
Добавлено: Пт янв 13, 2012 01:56:41
WildCat
Почему на первый взгляд?

Просто я предложил универсальную функцию, с помощью которой проще и быстрее запрограммировать определенные цвета и их последовательности, ввиду приближенной к человеческому восприятию модели. Человек же не смотрит на цвет и не говорит, что он на 50% красный, 80% зеленый и 100% синий. (ну только если он не веб дизайнер) Вместо этого он скажет, что это бледно-голубой цвет.
Один раз загнав функцию в код, можно многие эффекты сделать на ее основе. Кроме вращения Hue, можно выбрать конкретный оттенок и изменением Value плавно менять его яркость. Или, оперируя насыщенностью и оттенком сделать переход по всем цветам через белый. И т.д. Намного упрощается создание всех циклов, рассчитывающих RGB параметры, достаточно 1-2 вложенных для практически любого эффекта.