вівторок, 16 січня 2024 р.

HSV to RGB конвертер. код для Arduino/ESP

 

Код який конвертує колір з кольорового простору 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);

Функція віддає такі значення:
rgb[0] (яскравість червоного кольору) 0...255;
rgb[1] (яскравість зеленого кольору) 0...255;
rgb[2] (яскравість синього кольору) 0...255;

Код функції. Код можна просто скопіювати та вставити в скетч 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
Як що є питання, пишіть. Спробую відповісти.

Немає коментарів:

Дописати коментар