Код який конвертує колір з кольорового простору 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Як що є питання, пишіть. Спробую відповісти.
Немає коментарів:
Дописати коментар