Realización de funciones de conversión RGB y HSV en WS2812

Acerca de WS2812

WS2812/2811 solo necesita una línea de señal para controlar todos los LED en la tira de luz. Varias tiras de luz se pueden extender fácilmente conectándolas en serie. Una línea de señal puede controlar hasta 500 LED a una frecuencia de actualización de 30 Hz.
WS2812B es mi primer proyecto de software integrado. La información aquí se refiere a la perla de la lámpara WS2812 (4) - para realizar el efecto de la luz de respiración a todo color . Muchas gracias por el tutorial y el código fuente relacionado proporcionado por este blogger, pero no hay algunos problemas después de la prueba, lo verifiqué y lo modifiqué yo mismo, y puede funcionar perfectamente en stm32f030f4.

Acerca del VHS

HSV (Tono, Saturación, Valor) es un espacio de color creado de acuerdo con las características intuitivas del color, que consta de tres parámetros: tono (H), saturación (S) y luminosidad (V). En comparación con el RGB tradicional, puede es muy conveniente para mostrar los cambios de brillo de color sin problemas ajustando el brillo.

Funciones para comparar valores máximos y mínimos

static float min(float a, float b, float c)
{
    
    
  float m;
  m = a < b ? a : b;
  return (m < c ? m : c);
}

static float max(float a, float b, float c)
{
    
    
  float m;
  m = a > b ? a : b;
  return (m > c ? m : c);
}

Conversión de RGB a HSV

void rgb2hsv(uint8_t g, uint8_t r, uint8_t b, float *h, float *s, float *v)
{
    
    
  float red, green ,blue;
  float cmax, cmin, delta;

  red =   (float)r / 255;
  green = (float)g / 255;
  blue =  (float)b / 255;

  cmax = max(red, green, blue);
  cmin = min(red, green, blue);
  delta = cmax - cmin;

  /* H */
  if(delta == 0)
  {
    
    
    *h = 0;
  }
  else
  {
    
    
    if(cmax == red)
    {
    
    
      if(green >= blue)
      {
    
    
        *h = 60 * ((green - blue) / delta);
      }
      else
      {
    
    
        *h = 60 * ((green - blue) / delta) + 360;
      }
    }
    else if(cmax == green)
    {
    
    
      *h = 60 * ((blue - red) / delta + 2);
    }
    else if(cmax == blue)
    {
    
    
      *h = 60 * ((red - green) / delta + 4);
    }
  }

  /* S */
  if(cmax == 0)
  {
    
    
    *s = 0;
  }
  else
  {
    
    
    *s = delta / cmax;
  }

  /* V */
  *v = cmax;
}

Conversión de HSV a RGB

void hsv2rgb(float h, float s, float v, uint8_t *g, uint8_t *r, uint8_t *b)
{
    
    
  if(s == 0)
  {
    
    
    *r=*g=*b=v;
  }
  else
  {
    
    
    float H = h / 60;
    int hi = (int)H;
    float f = H - hi;
    float p = v * (1 - s);
    float q = v * (1 - f * s);
    float t = v * (1- (1 - f) * s);
    switch (hi){
    
    
      case 0:
        *r = (int)(v * 255.0 + 0.5);
        *g = (int)(t * 255.0 + 0.5);
        *b = (int)(p * 255.0 + 0.5);
        break;
      case 1:
        *r = (int)(q * 255.0 + 0.5);
        *g = (int)(v * 255.0 + 0.5);
        *b = (int)(p * 255.0 + 0.5);
        break;
      case 2:
        *r = (int)(p * 255.0 + 0.5);
        *g = (int)(v * 255.0 + 0.5);
        *b = (int)(t * 255.0 + 0.5);
        break;
      case 3:
        *r = (int)(p * 255.0 + 0.5);
        *g = (int)(q * 255.0 + 0.5);
        *b = (int)(v * 255.0 + 0.5);
        break;
      case 4:
        *r = (int)(t * 255.0 + 0.5);
        *g = (int)(p * 255.0 + 0.5);
        *b = (int)(v * 255.0 + 0.5);
        break;
      case 5:
        *r = (int)(v * 255.0 + 0.5);
        *g = (int)(p * 255.0 + 0.5);
        *b = (int)(q * 255.0 + 0.5);
        break;
			default:
				break;
    }
  }
}

Supongo que te gusta

Origin blog.csdn.net/m0_46645810/article/details/119943591
Recomendado
Clasificación