NeoPixel einzelne Pixel dimmen

Helmuth: Danke für Dein Interesse und Deine Bereitschaft selbstständig zu lesen, zu verstehen und zu experimentieren! So macht das Spaß!

Das freut mich, dann habe ich ein nicht ganz so schlechtes Gewissen :D

Selbstinitiative steigert ja auch den Lerneffekt :)

Zu deinen Ausschweifungen in die Tiefen dieser Bib: Hat geklappt; Ich sehe schon, das kann schnell eine Lebensaufgabe werden :D

Von dem was ich über die Farbsetzung aus deinem Post entnehmen konnte :) : Scheinbar werde ich durch den Rainbow Effekt wohl nicht um eine If Unterscheidung in den "Modes" kommen.

Sprich Einzelfarben, Fades und Farbverläufe kann ich über den Switch Case bei jedem Funktionsaufruf ändern lassen, für den Rainbow muss ich dann aber eine eigene Schleife in jedem modus erstellen.

Ich habe etwas Bammel vor den Lauflichtern (Cycle() und CylonDual() ) wo zusätzlich zum wandernenden Balken mit Schweif das ganze noch in Rainbow Farben... :fearful:

Ich schaue mal wie weit ich komme :)

Moin Sp4rtan,

ich sehe schon, das kann schnell eine Lebensaufgabe werden :smiley:

so weit würde ich nicht gehen, aber es gibt noch eine Weile neue Sachen zu entdecken.

Scheinbar werde ich durch den Rainbow Effekt wohl nicht um eine If Unterscheidung in den “Modes” kommen.

Probiere meine Codeschnipsel aus, dann sollte das mit dem Regenbogen klarer werden.

Sprich Einzelfarben, Fades und Farbverläufe kann ich über den Switch Case bei jedem Funktionsaufruf ändern lassen, für den Rainbow muss ich dann aber eine eigene Schleife in jedem modus erstellen.

Bevor wir darüber weitersprechen, gehen wir nochmal 2 Schritte zurück und Du denkst bitte darüber nach, wie das Benutzerinterface aussehen soll.

Wieviele Buttons? IR? Poti(s)? Drehencoder? LCD Menü? usw.

Wenn das klar ist, strukturieren wir sinnvolle und logisch unabhängige Parameter: z.B. Animationsnummer, Grundfarbe, Farbbreite, Contrast, Helligkeit, Speed, fixe Farbe oder Farbverlauf oder Farbpalette, Rot- Grün- und Blaufilter, usw.

Ein durchgehendes Konzept, mit dem sich ALLE gewünschten Animationen beschreiben lassen.

Ich habe etwas Bammel vor den Lauflichtern (Cycle() und CylonDual() ) wo zusätzlich zum wandernenden Balken mit Schweif das ganze noch in Rainbow Farben… :fearful:

Überhaupt kein Problem, aber einen Schritt nach dem anderen: zuerst eine sinnvolle und konsistente Struktur. Wenn die Struktur gut ist, ist das anschließende Coden easy.

Teste meine Codeschnipsel, ich habe mir etwas dabei gedacht, warum ich Dir die in dieser Reihenfolge schickte…

Dein Programm wird am Ende im Loop ungefähr so aussehen:

  1. Input auslesen (Taster oder IR oder sonstwas)

  2. Input auswerten und Parameter hoch- oder runterzählen (z.B. wenn Taste VOL-, dann Helligkeit runter)

  3. Switch-case Block, welcher die gewünschte Animation mit den eingestellten Parametern berechnet (z.B. wenn Animationsnummer = 5, dann berechne Animation Lauflicht. Farbe oder Farbverlauf, Helligkeit und alles andere, steht komplett in den Parametern drin und wird für jede einzelne Animation verwendet)

Gute Struktur ist das Wichtigste!

Grüße,

Helmuth

Zur Inspiration mal ein bisschen code, wie sowas aussehen kann. Bei mir steht im Loop:

void loop()
{
  read_audio();
  soften_spectrum_data();
  read_ir();
  interpret_ir();

  run_animation();

  // Serial Output für Debugging:

  //print_spectrum();
  //print_smoothed_spectrum_data();
  //print_parameters();
  //Serial.println(FastLED.getFPS());  
}

Hier die Auswertung der Tastendrücke:

void interpret_ir()
{
  switch (results.value)
  {
    case 0x20df00ff: // P+ button
      animation++;
      break;

    case 0x20df807f: // P- button
      animation--;
      break;

    case 0x20df40bf: // VOL+ button
      if (brightness + 64 <= 255)
        brightness += 64;
      break;

    case 0x20dfc03f: // VOL- button
      if (brightness - 64 >= 0 )
        brightness -= 64;
      break;

    case 0x20df8877: // 1 button
      speed += 10;
      break;

    case 0x20df28d7: // 4 button
      speed -= 10;
      break;

    case 0x20df48b7: // 2 button
      scale += 10;
      break;

    case 0x20dfa857: // 5 button
      scale -= 10;
      break;


    case 0x20dfc837: // 3 button
      if (contrast + 32 <= 255 )
        contrast += 32;
      break;

    case 0x20df6897: // 6 button
       if (contrast - 32 >= 0 )
        contrast -= 32;
      break;

    case 0x20df18e7: // 8 button
      color += 10;
      break;

    case 0x20df08f7: // 0 button
      color -= 10;
      break;

    case 0x20df9867: // 9 button
      colorrange += 5;
      break;

    case 0x20dfe817: // 7 button
      colorrange -= 5;
      break;
  }
  results.value = 0;
}

Und hier die (hässliche) Zuordnung der Animationen. Mit Switch-case wäre es schöner.

void run_animation()
{
  if (animation == 0) animation1();
  if (animation == 1) animation2();
  if (animation == 2) animation3();
  if (animation == 3) animation4();
  if (animation == 4) animation5();
  if (animation == 5) animation6();
  if (animation == 6) animation7();
  if (animation == 7) animation8();
  if (animation == 8) animation9();
  if (animation == 9) animation10();
  if (animation == 10) animation11();
  if (animation == 11) animation12();
}

Und hier ein Beispiel, wie dann eine Animation aussieht unter Einbeziehung der in interpret_ir gesetzten globalen Parameter.

void animation10()
{
  uint8_t num_dots = scale / 10;
  uint8_t base_bpm = speed / 10;
  
  fade_down( 255 - contrast );

  for (uint8_t i = 0; i < num_dots; i++) 
  {
    uint8_t position = beatsin8( base_bpm + i, 0, NUM_LEDS);
    leds[position] += CHSV( color + (( i*colorrange ) / num_dots), 255, brightness);
  }
 FastLED.show();
}

Mit dieser robusten Struktur kann man jederzeit neue Animationen ergänzen, welche dann auch in ihren Parametern einstellbar und somit interaktiv sind.

Nochwas zur Inspiration: Jason Coon hat gestern eine soundreaktive Zylindermatrix gezeigt mit angepassten Animationen aus meiner FunkyClouds und FunkyNoise Sammlung.

Jason hat vor ca. einem Jahr angefangen, sich mit LED Programmierung zu beschäftigen.

Hallo Helmuth,

das Video von Jason ist ja mal enorm motivierend :D ich bin mal gespannt woe das hinführt. Eigentlich war der LED Controller nur ein Teil einer Projektarbeit, aber mittlerweile steckt da richtig Herzblut drin :) Die anderen Videos im Channel von Stefan habe ich mir auch mal angesehen. Es gibt offensichtlich sogar LED Strip Raumbeleuchtung die nicht billg aussieht oder man direkt an Disco denken muss :D

Zu meinem kleinen Projekt. Vielleicht auch mal als Überblick: primär soll ein Doppelter, paralleler LED Stripe mit insg. 92 LEDs gesteuert werden. Das Ganze kommt unter mein Longboard. Als Quelle habe ich leider nur 5V2A aber dass reicht für die meisten Farben/Farbmuster noch aus :)

Die Hardware besteht aus einem ATMega328p (+ Kleinteile), 2-4 Microtastern und einem Elektretmikro+Verstärker.

Button1: Bewegungsmuster durchschalten Button2: Farben/Farbverläufe durchschalten Button3: Helligkeit (Global) (Button4: Geschwindigkeit (lokal) (nice to have, aber sekundär)

Platztechnisch vielleicht schöner: Button1 kurz: Farbe Button1 lang: Muster Button2 kurz: Helligkeit Button2 lang: Geschwindigkeit

Dein Programmbeispiel ist sehr inspirierend! :) Ich programmier leider zu wenig, als dass ich ein Gespür für gute Strukturen hätte. Außerdem sind meine Möglichkeiten durch mangelnde Kenntnis natürlich eingeschrängt :sweat_smile:

Vielleicht schaffe ich es heute mich mal an einen Programmablaufplan zu setzen.

Lustig ist, dass ich vor dem Scheif Problem am Anfang des Threads dachte, ich sei fast fertig... :D

Liebe Grüße

Die anderen Videos im Channel von Stefan habe ich mir auch mal angesehen.

Ja, ich habe da zeitweise intensiv gespielt und dokumentiert…

Es gibt offensichtlich sogar LED Strip Raumbeleuchtung die nicht billg aussieht oder man direkt an Disco denken muss :smiley:

Der Strip ist egal. Alles ein Frage der Farbkorrektur und der Programmierung.

92 LEDs (…) Als Quelle habe ich leider nur 5V2A

Das ist eigentlich Mist, aber man kann die globale Helligkeitssteuerung zur Strombegrenzung missbrauchen.

2-4 Microtastern

Tu Dir einen Gefallen und nimm 4. Doppelbelegung (Unterscheidung kurzer / langer Klick) nervt beim Bedienen.

Elektretmikro+Verstärker

Musst Du schauen, ob die Rollgeräusche alles andere übertönen, oder nicht.

Lustig ist, dass ich vor dem Schweif Problem am Anfang des Threads dachte, ich sei fast fertig… :smiley:

LOL!

Und da haben wir noch gar nicht mit Simplex/Perlin Noise Funktionen angefangen. Aber eins nach dem anderen: Erstmal die Standard Oszillatoren und Wellenformen verstehen und ausreizen und ein Gefühl bekommen, wie man die sinnvoll kombinieren und zur Parametermanipulation nutzen kann.

Dein Programmbeispiel ist sehr inspirierend! :slight_smile:

Freut mich.

Grüße,

Helmuth

Helmuth: Und hier die (hässliche) Zuordnung der Animationen. Mit Switch-case wäre es schöner.

Arrays aus Funktionszeigern sind bei sowas auch eine Lösung. Dann kann man direkt über den Index auf eine Funktion zugreifen

Danke für die Erinnerung!

Das war das hier, richtig?

// List of patterns to cycle through.  Each is defined as a separate function below.

typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current

#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))

void nextPattern()
{
  // add one to the current pattern number, and wrap around at the end
  gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE( gPatterns);
}

void loop()
{
  gPatterns[gCurrentPatternNumber]();
  FastLED.show();  
  EVERY_N_SECONDS( 10 ) { nextPattern(); } 
}

Ja

Helmuth: Das ist eigentlich Mist, aber man kann die globale Helligkeitssteuerung zur Strombegrenzung missbrauchen.

Damit muss ich mich am Ende dann mal beschäftigen. Es soll ja eh eine allgemeine Helligkeitsregelung implementiert werden. Lässt sich mobil und kompakt leider nicht anders lösen.

Helmuth: Tu Dir einen Gefallen und nimm 4. Doppelbelegung (Unterscheidung kurzer / langer Klick) nervt beim Bedienen.

Alles klar :)

Helmuth: Musst Du schauen, ob die Rollgeräusche alles andere übertönen, oder nicht.

Nein nein, Der Modus eist eigentlich für SitIns im Park oder für Konzerte gedacht. Bord hinstellen und ab gehts :D

Helmuth: LOL! Und da haben wir noch gar nicht mit Simplex/Perlin Noise Funktionen angefangen. Aber eins nach dem anderen...

Das ist eine Gute Idee. Bekomme jetzt schon fast Reizüberflutung :D

Ich setz mich jetzt mal hin und versuche auf Basis deiner Empfehlungen und Beispiele eine Struktur reinzubringen.

Vielleicht noch eine Frage nebenbei: Das Timing mit den millis(), macht das Sinn? Ich habe in der beatsin8() gesehen, dass dort eine bpm variable für die Durchlaufgeschwindigkeit, also schon timing implementiert ist. Sollte man diese dann sehr hoch stellen und allgemein mit millis arbeiten oder was empfiehlst du hier ? :)

Liebe Grüße

Das Timing mit den millis(), macht das Sinn?

JA.

Ich habe in der beatsin8() gesehen, dass dort eine bpm variable für die Durchlaufgeschwindigkeit, also schon timing implementiert ist.

Die BPM Steuerung nutzt "unter der Haube" auch nur millis(). Vorteil von beiden Varianten ist, dass das Timing unabhängig von der Geschwindigkeit des verwendeten Mikrocontrollers läuft.

Wenn man nur die Funktionsgeneratoren benutzt, kann man durchgehend mit bpm (beats per minute) arbeiten.

Noisegeschichten geht besser mit "Mikrotiming", z.B. uint32_t x = millis() / 2.

Ist am Ende eine Geschmacksfrage, extrem langsame weiche Animationen sind mit auf millis basierenden Funktionen leichter in ganz kleinen Schritten zwischen den Frames zu steuern.

Für flottere Sachen (z.B. Musikbegleitung) ist bpm praktischer und ausreichend genau.

Ist am Ende wirklich egal - solange kein Delay im Code steht, ist es guter Code. ;-)

Bekomme jetzt schon fast Reizüberflutung :D

Dann halte ich mich mal ein bisschen zurück, damit Du Zeit zum Verdauen hast.

Liebe Grüße,

Helmuth

Kein Problem, je mehr Infos desto besser :D

Wie millis() funktioniert habe ich verstanden. Hatte zwischen delay() und millis() auch noch eine eigene Timing variante mit einer eigenen Variablen implementiert und dort festgestellt, dass das alles von den Funktionslängen abhängt.

Mit millis() bin ich auch zu frieden.

Später beschäftige ich mich vielleicht mal mit den Vor- und Nachteilen bzw. Unterschieden von millis() und bpm.

Im Zuge der "Renovierungsarbeiten" :) habe ich mal ein paar Ratschläge einer unserer Dozenten umgesetzt.

enums und "magic numbers" um den Code noch übersichtlicher zu bekommen :)

//VARIABLES------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------

enum colrType {COLORRED=1,COLORGREEN, COLORBLUE, COLORWHITE, FADEREDTOBLACK, FADECOLORTOBLACK, COLORFLOW, RAINBOW, OFF};
enum modeType {COLORWIPE=1, CYCLE, CYLONDUAL, FLASH, STROBE, VUMETER, EMERG};

//debounce------------------------------------------------------------------------------------------
bool 
  button01_oldState = HIGH,                    // button debounce variable
  button02_oldState = HIGH;                    // button debounce variable

byte
  debounceDelay = 0;                           // time to wait for button change

bool
  button01 = false,
  button02 = false;
  ReadInput();
  InterpretInput();
  
  StartAnimation();                                                        // Start strip with selected Mode

}
uint32_t SetColor() {                                   
  switch(colrType){
    
    case COLORRED:                                                 // RED
      return pixelColor = CRGB::Red;                         
      
    case COLORGREEN:                                               // GREEN
      return pixelColor = CRGB::Green;                         
      
    case COLORBLUE:                                                // BLUE
      return pixelColor = CRGB::Blue;                         
  }
}
void StartAnimation() {
  switch(modeType){
    case COLORWIPE: {                                             // Fill whole strip with color
      ColorWipe();
    }
            break;
  }
}
void ColorWipe() {
  uint16_t i;
    fill_solid( leds, NUM_LEDS, SetColor());
    FastLED.show();
}
void ReadInput(){

  bool button01_newState = digitalRead(BTN01_PIN);
  bool button02_newState = digitalRead(BTN02_PIN);

  // Check if state changed from high to low (button press).
  if (button01_newState == LOW && button01_oldState == HIGH) {
    // Short delay to debounce button.
    delay(debounceDelay);
    // Check if button is still low after debounce.
    button01_newState = digitalRead(BTN01_PIN);
    if (button01_newState == LOW)
      button01 = true;
  }
  else
    button01 = false;
    
  // Set the last button state to the old state.
  button01_oldState = button01_newState;
  
  // Check if state changed from high to low (button press).
  if (button02_newState == LOW && button02_oldState == HIGH) {
    // Short delay to debounce button.
    delay(debounceDelay);
    // Check if button is still low after debounce.
    button02_newState = digitalRead(BTN02_PIN);
    if (button02_newState == LOW)
      button02 = true;
  }
    else
      button02 = false;
      
  // Set the last button state to the old state.
  button02_oldState = button02_newState;  
}
void InterpretInput(){
  if(button01 == true){
    colrType++;
    pixelPos = 0;
    if (colrType > maxColors)                                                      // Color overflow
      colrType=1;
  }
  if(button02 == true){
    modeType++;
    pixelPos = 0;
    if (modeType > maxModes)                                                       // Mode overflow
      modeType=1;
  }
}

Ich hoffe die geklauten Funktionsnamen sind okay ;)

Liebe Grüße

Moin Helmuth,

momentan habe ich Probleme die richtige Farbübergabe hinzubekommen.

Ich wollte es so machen wie du es mir empfohlen hast

void loop() {
  SetColor();
  StartAnimation();
}
void SetColor() {                                   
  switch(colrType){
    
    case COLORRED:                                                 // RED
      pixelColor = CHSV (0, 255, 255);                         
    case COLORGREEN:                                               // GREEN
      pixelColor = CRGB (0, 255, 0);
void ColorWipe() {
    fill_solid( leds, NUM_LEDS, pixelColor);
    FastLED.show();
}

Sollte ich lieber HSV oder RGB nehmen? In dieser Konfiguration bekomme ich die Farben nicht vernünftig angezeigt.

Jetzt bekomme ich nicht mal mehr eine einfache Farbfüllung hin... :sweat_smile:

In den von Dir gezeigten Codeausschnitten sehe ich keinen Fehler fehlt das break im switch-case. Ob Du die Farben mittels RGB oder HSV Modell zuweist, ist Deinem Geschmack überlassen. Direkte RGB Übergabe ist minimal schneller, aber das spielt für Dich momentan keine Rolle.

In dieser Konfiguration bekomme ich die Farben nicht vernünftig angezeigt.

Bitte eine präzisere Problembeschreibung.

Jetzt bekomme ich nicht mal mehr eine einfache Farbfüllung hin...

Dann mal kurz etwas anderes machen, einen Kaffee trinken und dann mit frischem Elan weitermachen.

Manchmal sieht man den Wald vor lauter Bäumen nicht mehr, das kenne ich gut.

Zum Debuggen mal vor StartAnimation() mit

Serial.println (pixelColor.r, pixelColor.g, pixelColor.b);

die Farbwerte anzeigen lassen.

Der Fehler kann eigentlich nur darin liegen, dass irgendwo colrType auf einen Wert gesetzt wird, der in Deinem switch-case nicht abgefragt wird.

Gruß,

Helmuth

edit: Wird colrType überhaupt zugewiesen?

Helmuth: Dann mal kurz etwas anderes machen, einen Kaffee trinken und dann mit frischem Elan weitermachen.

Manchmal sieht man den Wald vor lauter Bäumen nicht mehr, das kenne ich gut.

Danke für den Tip :D

case COLORRED:                                                 // RED
      pixelColor = CRGB::Red;
    break;

Wenn man vorher einen return hatte, sollte man nach Änderung das break auch wieder einfügen :grinning:

Somit habe ich die single Farbzuweisung doch verstanden. Und der kaffee tat auch ganz gut ^^

Ich wollte den ersten FadeModus jetzt ähnlich gestalten. Ich ziehe die setColor() Funktion direkt in die Methoden, da nicht alle setColor() benötigen und sie dort nicht aufgerufen werden muss.

Ich hätte bei FadeToColor und FadeToBlack jetzt jedes mal setColor aufgerufen und den Fade Grad geändert oder meinst du lieber ein case switch /if anweisung in der Bewegungsmuster Methode?

Pseudo:

case FADEREDTOBLACK: {                                         // FADE IN/OUT SINGLE COLOR  
     thisMillisFade=millis();
     if(thisMillisFade - prevMillisFade >= intervalFadeIO){    
       pixelcolor = fadeLightBy(leds, NUM_LEDS, 10);                                                           
       prevMillisFade = thisMillisFade;  
       //fade++;
       //return pixelColor;
     }

ich weiß dass das so nicht richtig funktioniert, hab es noch nicht hinbekommen.

oder lieber:

void ColorWipe() {
    SetColor();
    if(colrType == FADETOBLACK)
      fadeLightBy(leds, NUM_LEDS, 10);
    else if(colrType == RAINBOW)
      dosomething;
    else 
      fill_solid( leds, NUM_LEDS, pixelColor);
    
    FastLED.show();
}

Liebe Grüße

FadeToBlack braucht keine Farbe, das ist universell.

FadeToColor braucht die Zielfarbe vor der Schleife.

Ich bin raus für heute, gehe jetzt Glühwein trinken bei sportlichen 17 Grad Außentemperatur.

Gruß und bis morgen,

Helmuth

Sorry, mit FadeToBlack() und FadeToColor() meinte ich meine beiden Farbverläufe die ich statt einer fixen Farbe einstellen will. :) Aktuell stehe ich vor dem Problem einfach nur die Farbvariable zu ändern. Nicht in der Farbe sonder in der Helligkeit.

leds[i].fadeLightBy(brightness);

Aber nicht die Farbe eines Pixels des Strips sondern meine Farbvariable (pixelColor), die ich dann auf so viele LEDs anwenden kann wie ich möchte.

Pseudo:

Setze Farbe -> Färbe Strip ein.
setColor() -> fill_solid()

Wobei hier setColor():
wenn millis() voll 
-> pixelColor=red     //Ich wollte das so machen, weil ich dann später auch mehrere farben durchwechseln kann.
-> FadeToBlack()

Wobei hier FadeToBlack():
pixelColor = pixelColor-Dimm 
-> Dimm--;
-> wenn Dimm == 0 -> Dimm++ (bis 255)

Entspannung muss ja auch mal sein. Ich war gestern auch mit dem Board unterwegs. Bei den Temperaturen ist das echt angenehm :)

Viel Spaß und guten Durst ;)

Sooooo, nach einer Nachtschicht ist das Programm soweit fertig und lauffähig :sleeping:

Langsam wird das zur Obsession :o

Alles läuft mehr oder weniger wie es soll (ein paar kleine Schönheitsfehler, die es in Zukunft auszumerzen gilt :slight_smile: ).

Ein, zwei Dinge möchte ich noch implementieren, bzw. unbedingt verbessern.
Ich formuliere das mal in Form der Fragen die ich mir heute morgen noch schnell notiert habe :smiley:

  1. Helligkeitssteuerung:
  • ich habe schon die LEDS.setBrightness gesehen und im Wiki
    LIB8STATIC uint8_t dim8 und brighten gefunden.
    Kann ich die helligkeit des gesammten Sketches mit einer Variablen steuern, welche ich über
    einen Taster hochzähle?
  • Durch die hohe Stromaufnahme und die mangelnde Versorgung ist mein Weiß sehr warm.
    Ich habe über HSV versucht die Farbe zu dimmen und etwas Blau einzumischen, damit das Weiß
    nicht zu warm wird wenn ich mit der helligkeit heruntergehe. hat leider nicht so geklappt wie ich
    mir das vorgestellt habe :-/

@Helmut, du sagtest man könne damit auch die Stromaufnahme begrenzen.
Wie berechne ich das; bzw. wie bekomme ich Ampere und Helligkeit ins Verhältnis?

  1. Gibt es eine Funktion wie beat, beatsin, etc. welche wie ein counter in einem Intervall hoch oder
    runter Zählt und dann wieder von vorne anfängt?
    Quasi eine Mischung aus beat und beatsin (Sägezahn, aber mit Anfangs-, Endwert und bpm).

  2. Für mein VU-Meter (das ist noch nicht implementiert) suche ich noch eine
    Elektret Amplifier Schaltung. Hat damit schon mal jemand gearbeitet, bzw was erstellt?

Meine nicht invertierende Verstärkerschaltung will einfach nicht funktionieren.
Ich hab schon einiges im Netz recherchiert und im Labor aufgebaut.
Oszi ist vorhanden. Probiert habe ich bis jetzt u.A. den TLC352CP und TL081CN.

Ich setze mich jetzt mal ran und versuche über HSV einen schönen Farbverlauf Grün-Gelb-Rot für den Equalizer hinzubekommen.
Mal sehen wie weit ich komme, aber wenn jemand Lust hat einen Anstupser zu geben, für Tipps bin ich immer zu haben :slight_smile:
Zu einem Codebeispiel für “Soundbar reagiert auf analog input” würde ich auch nicht nein sagen :slight_smile:
Ich geb ehrlich zu, dass mir das noch eine Nummer zu hoch ist.
Unter NeoPixel habe ich diesen Code genommen.
Ich werde mal versuchen den an FastLED anzupassen.

Im Anhang noch der aktuellste Sketch.

Vielen Dank an alle die mir bis hierhin geholfen haben, vor allem Helmuth :slight_smile:

Liebe Grüße

LED_Controller_3.3_FastLED_FINAL_ohneVUMeter.txt (24.1 KB)

Kann ich die helligkeit des gesammten Sketches mit einer Variablen steuern, welche ich über
einen Taster hochzähle?

Ja, setBrightness (uint8_t scale) kannst Du immer und überall aufrufen. Ich würde in 16er oder 32er Schritten zählen.

Durch die hohe Stromaufnahme und die mangelnde Versorgung ist mein Weiß sehr warm.
Ich habe über HSV versucht die Farbe zu dimmen und etwas Blau einzumischen, damit das Weiß
nicht zu warm wird wenn ich mit der helligkeit heruntergehe. hat leider nicht so geklappt wie ich
mir das vorgestellt habe :-/

Das ist Pfusch. Durch den Spannungsabfall (wg. ungenügend stromfester Spannunsversorgung) kackt blau zuerst ab = Temperaturverschiebung nach rot/grün.

Entweder genug Strom liefern (96 Leds x 3 Farben x 20 mA = 5,76 A) oder die Helligkeit massiv runternehmen.

Letzteres kann man auch dynamisch machen - das Problem besteht ja nur bei stromhungrigen Animationen. Es gibt Funktionen, um das zu automatisieren. Hier lesen.

@Helmut, du sagtest man könne damit auch die Stromaufnahme begrenzen.
Wie berechne ich das; bzw. wie bekomme ich Ampere und Helligkeit ins Verhältnis?

Halbe Helligkeit = halber Strom im Durchschnitt. Besser noch einen dicken Stützelko parallel zu Spannungsversorgung vom Strip.

Gibt es eine Funktion wie beat, beatsin, etc. welche wie ein counter in einem Intervall hoch oder
runter Zählt und dann wieder von vorne anfängt?
Quasi eine Mischung aus beat und beatsin (Sägezahn, aber mit Anfangs-, Endwert und bpm).

Ja, triwave8.

zu einem Codebeispiel für “Soundbar reagiert auf analog input” würde ich auch nicht nein sagen :slight_smile:

memset8(leds, 0, NUM_LEDS * sizeof(CRGB));  // CLS - alles auf 0 setzen
byte audio_level = analogRead(1) / 11;      // Maximum von 1023 auf 93 reduzieren (Deine LED Anzahl)
for(byte i = 0; i < audio_level; i++) {
    leds[i] = CRGB::Red;
}
FastLED.show();

Grüße,

Helmuth

Wieder einmal hast du mir enorm weitergeholfen Helmuth! Vielen Dank! Wird alles im Kopf abgespeichert; kann man ja vielleicht nochmal gebrauchen ;)

Zu 1.2 Die Stromaufnahme der Leds kenne ich; Ich wollte das halt allgemein runterrechnen da ich nicht wusste dass es dafür auch eine Funktion gibt :stuck_out_tongue_closed_eyes: power_mgt.h ist der Hammer! Funktioniert super und ist kinderleicht anzupassen. Ich bin begeistert!

Zu 1.1 setBrightness() funktioniert auch super, danke. Entweder hab ich mal wieder einen Denkfehler oder es geht wirklich nicht, aber mit einem byte komme ich nicht zurecht. Ich dachte ich könnte eine byte variable einfach von 255 runterzählen, aber die landet natürlich bei -1 und nicht bei 0. Ich habe jetzt einen int genommen und zwei if Anweisungen für "auf 0 setzen" und "auf 255 setzen". Funktioniert, ist aber nicht soo schön wie eine einzige zeile Code :) Hab ich da was übersehen?

Zu 3. Vielen Dank für deinen BeispielCode. hatte ich so direkt übernommen. Leider reagiert mir die Bar zu schnell.

Ich habe daher den Sketch den ich verlinkt hatte noch mal überarbeitet.

Leider ist mein Mikro noch zu leise. Ich hab mir jetzt mal den Amplifier von Adafruit bestellt, aber eigentlich wollte ich einen eigenen konstruiren und in die spätere Platine integrieren.

Helmuth: Ja, triwave8.

Ich meinte mehr so etwas:

i = increment(bpm, 0, 10, 2);
i -> 0  2  4  6  8  10  0  2  4  6  8  10...

i = increment(bpm, 0, 5, 1);
i -> 0  1  2  3  4  5  0  1  2  3  4  5...

Wollte mir für meine globale "pixelPos" die durch den LED Strip zählt sparen :)

Ich wünsche euch frohe Festtage ^^