Код який конвертує колір з кольорового простору HSV(Hue - відтінок кольору, Saturation - насиченість кольором (в нашому випадку насиченість білого кольору, Value - Яскравість) в кольоровий простір RGB.
Займався розробкою годинника на світлодіодній матриці формату HUB75.
Застосовував бібліотеку ESP32-HUB75-MatrixPanel-DMA.
Потрібно було змінити колір, та так щоб можна було робити це плавно для кольорових ефектів. І в такому випадку кольоровий простір HSV - гарно вирішує таку задачу.
Бібліотека HUB75 сприймає колір в форматі R(Red), G(Green), B(blue). Де R, G, B - яскравість кожного з основних кольорів. Кожна зимінна може приймати значення від 0 до 255.
Вбудованого інструменту для конвертації бібліотека HUB75 немає, або я неуважно дивився, тому нагуглив і застосував код який покажу нижче.
функція приймає такі значення:
hsv[0] (Параметр Hue) 0...360 (це градуси на кольоровому колі);
hsv[1] (Параметр Saturation) 0 ... 255 (насиченість кольором, де 0 - це білий колір незалежно від Hue, 255 - це колір заданий Hue;
hsv[2] (Параметр Value) 0...255 (яскравість, де 0 - всі кольори вимкнені, 255 - всі кольори світяться в залежності від Hue та Saturation);
Функція віддає такі значення:
функція приймає такі значення:
hsv[0] (Параметр Hue) 0...360 (це градуси на кольоровому колі);
hsv[1] (Параметр Saturation) 0 ... 255 (насиченість кольором, де 0 - це білий колір незалежно від Hue, 255 - це колір заданий Hue;
hsv[2] (Параметр Value) 0...255 (яскравість, де 0 - всі кольори вимкнені, 255 - всі кольори світяться в залежності від Hue та Saturation);
Функція віддає такі значення:
rgb[0] (яскравість червоного кольору) 0...255;
rgb[1] (яскравість зеленого кольору) 0...255;
rgb[2] (яскравість синього кольору) 0...255;
Код функції. Код можна просто скопіювати та вставити в скетч Arduino поза функцією loop() чи setup():
Код функції. Код можна просто скопіювати та вставити в скетч Arduino поза функцією loop() чи setup():
void HSVtoRGB (double hsv[], byte rgb[]) {
double h = hsv[0];
double s = hsv[1]/255.0;
double v = hsv[2]/255.0;
double c = v*s;
double tmp = h/60.0;
double tmp2 = tmp-2*floor(tmp/2);
double x = c*(1-abs(tmp2-1));
double m = v-c;
double r,g,b;
int i = floor(tmp);
switch (i) {
case 0:
r = c;
g = x;
b = 0;
break;
case 1:
r = x;
g = c;
b = 0;
break;
case 2:
r = 0;
g = c;
b = x;
break;
case 3:
r = 0;
g = x;
b = c;
break;
case 4:
r = x;
g = 0;
b = c;
break;
case 5:
r = c;
g = 0;
b = x;
break;
}
rgb[0] = constrain((int)255*(r+m),0,255);
rgb[1] = constrain((int)255*(g+m),0,255);
rgb[2] = constrain((int)255*(b+m),0,255);
}Приклад використання коду. Код можна скопіювати та використовувати в тілі функції Loop() чи іеших функцій:double hsv[3];
byte rgb[3];
hsv[0] = 0; // red
hsv[1] = 255; // максимальна начисеність кольором - червоний
hsv[2] = 255; // максимальна яскравість
HSVtoRGB(rgb,hsv);
Serial.println(rgb[0]); // Red = 255
Serial.println(rgb[1]); // Green = 0
Serial.println(rgb[2]); // BLUE = 0В прикладі ми створюємо 2 масиви hsv та grb. Задаємо значення :
hsv[0] = 0; // red hsv[1] = 255; // максимальна начисеність кольором - червоний hsv[2] = 255; // максимальна яскравістьТа отримаємо яскравий червоний колір.
Для зеленого кольору, необхідно задати Hue = 120:
hsv[0] = 120; // greenЯк що є питання, пишіть. Спробую відповісти.

Немає коментарів:
Дописати коментар