Realisierung von RGB- und HSV-Konvertierungsfunktionen auf WS2812

Über WS2812

WS2812/2811 benötigt nur ein Signalkabel , um alle LEDs auf dem Lichtstreifen zu steuern. Mehrere Lichtleisten lassen sich durch Reihenschaltung ganz einfach verlängern. Eine Signalleitung kann bis zu 500 LEDs bei einer Bildwiederholfrequenz von 30 Hz steuern.
WS2812B ist mein erstes Projekt mit eingebetteter Software. Die Informationen hier beziehen sich auf die WS2812-Lampenperle (4) – um den Effekt von Vollfarb-Atemlicht zu realisieren . Vielen Dank für das Tutorial und den zugehörigen Quellcode, die dieser Blogger gegeben hat, aber da Nach dem Testen gibt es einige Probleme. Ich habe es selbst überprüft und geändert und es läuft perfekt auf stm32f030f4.

Über den HSV

HSV (Hue, Saturation, Value) ist ein Farbraum, der gemäß den intuitiven Eigenschaften von Farben erstellt wurde und aus drei Parametern besteht: Farbton (H), Sättigung (S) und Helligkeit (V). Im Vergleich zu herkömmlichem RGB ist dies möglich Es ist sehr praktisch, Farbhelligkeitsänderungen durch Anpassen der Helligkeit reibungslos anzuzeigen.

Funktionen zum Vergleich von Maximal- und Minimalwerten

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);
}

RGB-zu-HSV-Konvertierung

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;
}

HSV-zu-RGB-Konvertierung

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;
    }
  }
}

Guess you like

Origin blog.csdn.net/m0_46645810/article/details/119943591