WS2812B als Bar Graph display

Hallo,

ich bin gerade bei einem Projektt, bei dem ich ein WS2812B Streifen als Bar Graph nutzen möchten.
Es funktioniert auch schon so weit, ist aber nicht besonders schön. Wie kann ich den code optimieren, dass die LEDs ehr ineinander überblenden als das es harte schritte sind (ich hoffe es ist verständlich was ich meine). Aktuell sieht mein Code so aus.

Vielen Dank für Tipps

 if (Val >= 99 && Val <= 101) {
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    } 
  else if (Val >= 95 && Val <=98 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(5, 255,255,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }
  else if (Val >= 91 && Val <=94 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(4, 255,255,0);
    strip.setPixelColor(5, 255,255,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }
  else if (Val >= 87 && Val <=90 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(3, 255,255,0);
    strip.setPixelColor(4, 255,255,0);
    strip.setPixelColor(5, 255,255,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }  
  else if (Val >= 83 && Val <=86 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(2, 255,255,0);
    strip.setPixelColor(3, 255,255,0);
    strip.setPixelColor(4, 255,255,0);
    strip.setPixelColor(5, 255,255,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }
  else if (Val >= 79 && Val <=82 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(1, 255,255,0);
    strip.setPixelColor(2, 255,255,0);
    strip.setPixelColor(3, 255,255,0);
    strip.setPixelColor(4, 255,255,0);
    strip.setPixelColor(5, 255,255,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }
  else if (Val >= 75 && Val <=78 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(0, 255,0,0);
    strip.setPixelColor(1, 255,0,0);
    strip.setPixelColor(2, 255,255,0);
    strip.setPixelColor(3, 255,255,0);
    strip.setPixelColor(4, 255,255,0);
    strip.setPixelColor(5, 255,255,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }
  else if (Val <75 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(0, 255,0,0);
    strip.setPixelColor(1, 255,0,0);
    strip.setPixelColor(2, 255,0,0);
    strip.setPixelColor(3, 255,0,0);
    strip.setPixelColor(4, 255,0,0);
    strip.setPixelColor(5, 255,0,0);
    strip.setPixelColor(6, 0, 255, 0);
    strip.show();
    }
  else if (Val >= 102 && Val <=105 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0, 255, 0);
    strip.setPixelColor(7, 255,255,0);
    strip.show();
    }
  else if (Val >= 106 && Val <=109 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0,255,0);
    strip.setPixelColor(7, 255,255,0);
    strip.setPixelColor(8, 255,255, 0);
    strip.show();
    }
  else if (Val >= 110 && Val <=113 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0, 255, 0);
    strip.setPixelColor(7, 255,255,0);
    strip.setPixelColor(8, 255,255,0);
    strip.setPixelColor(9, 255,255,0);
    strip.show();
    }  
  else if (Val >= 114 && Val <=117 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0, 255, 0);
    strip.setPixelColor(7, 255,255,0);
    strip.setPixelColor(8, 255,255,0);
    strip.setPixelColor(9, 255,255,0);
    strip.setPixelColor(10, 255,255,0);
    strip.show();
    }
  else if (Val >= 118 && Val <=121 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0, 255, 0);
    strip.setPixelColor(7, 255,255,0);
    strip.setPixelColor(8, 255,255,0);
    strip.setPixelColor(9, 255,255,0);
    strip.setPixelColor(10, 255,255,0);
    strip.setPixelColor(11, 255,255,0);
    strip.show();
    }
  else if (Val >= 122 && Val <=125 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0, 255, 0);
    strip.setPixelColor(7, 255,255,0);
    strip.setPixelColor(8, 255,255,0);
    strip.setPixelColor(9, 255,255,0);
    strip.setPixelColor(10, 255,255,0);
    strip.setPixelColor(11, 255,0,0);
    strip.setPixelColor(12, 255,0,0);
    strip.show();
    }
  else if (Val >125 ){
    strip.clear();
    strip.setBrightness(brightness);
    strip.setPixelColor(6, 0,255,0);
    strip.setPixelColor(7, 255,0,0);
    strip.setPixelColor(8, 255,0,0);
    strip.setPixelColor(9, 255,0,0);
    strip.setPixelColor(10, 255,0,0);
    strip.setPixelColor(11, 255,0,0);
    strip.setPixelColor(12, 255,0,0);
    strip.show();
    }

Ist jetzt schlecht das Du uns nicht alles zeigst , desshalb gibts auch nur eine kurze grundsätzliche Antwort. Du musst die Farbwerte irgendwie berechnen und nicht immer 255 einsetzen.

Oder mit strip.setBrightness(brightness) arbeiten. Welchen Algorithmus du dir dazu einfallen lässt hängt von Deinen Wünschen ab.

Danke für die Antwort.
Der Rest vom Code ist für meine Fragenstellung eigentlich nicht relevant, daher hab ich ihn auf das wesentliche gekürzt.
Val ist Prozent Wert den ein ESP8266 über UDP bekommt.
Bewegt sich grob in der Range von 60-140, wobei alles über 125 und unter 75 erstmal nicht von Relevanz ist.
Aktuell ist die Situation, dass wenn der Wert z.B. von 105 auf 106 wechselt einfach eine weitere LED auf der eingestellten Helligkeit an geht, und zwischen 106 und 109 nichts passiert.

Was ich gerne realisieren würde, dass die weitere LED dunkel anfängt und je größer der Wert wird desto heller.
Also z.B. bei 107 sind folgende LEDs an
6 in grün 100% hell
7 in gelb 100% hell
8 in gelb 50% hell

hoffe es war jetzt verständlicher

Hallo,
verstanden hatte ich das schon soweit.

Mal grob ein Vorschlag wie ich mit das auf die Schnelle denke. Du hast ja jetzt mehrere Stufen angelegt. die Du mit if.. else.. bearbeitest ich würde das eventuell gar nicht so machen.

mal ein einfaches Beispiel Du hast 5 LEDs und Dein max Wert sei 100 dann ist die Abstufung in dem Fall 20. bei 100 alle hell.

Wenn der Wert jetzt 50 ist dann wollen wir 2 LED auf 100% haben und die dritte auf 50%
Also 50/20=2,5 =2 plus Rest 0,5 =50% 2 LED auf 100% die dritte auf 50%

Wert 55 -> 55/20=2,75 2 auf 100% die dritte auf 75%

Heinz

dann mach einen vollen kompilierbaren Sketch mit einer Variablen aus der deine Bargraph Darstellung abgeleitet werden soll und es wird sich jemand finden der dir da eine Funktion dazu schreibt.

int Wert = 55;
const int Teiler = 100 / LED_NUM;
for (int i = 0; i < LED_NUM; i++) {
  int color;
  if (Wert > Teiler) {
    color = 255;
    Wert -= Teiler;
  }
  else {
    color = (255 * Wert) / Teiler;
    Wert = 0;
  }
  strip.setPixelColor(i, color, color, color);
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.