Neopixel LED Breathing/Pulsieren

Servus zusammen, ich wollte meinen Neopixel (und insbesondere die Anzeige des Titelfortschrittes beim Abspielen) gerne etwas „lebendiger“ machen und habe mir deswegen mal angeschaut, wie man so einen „breathing“-Effekt (Pulsieren der Helligkeit) einbauen könnte.

Ist im Endeffekt sehr einfach gewesen. Ich habe das aktuell mit einem 3-Zeiler implementiert:

Würde mich interessieren, wie ihr das Feature so findet. Wenn es mehreren gefällt, könnte man überlegen, es upstream zu bringen (nicht als 3 Zeiler sondern etwas schöner implementiert).

float breath = (exp(sin(millis()/2500.0*PI)) - 0.36787944)*108.0;
      breath = map(breath, 0, 255, 5, Led_Brightness);

Die 2500 sind die Millisekunden für die Länge des „Pulsierungsintervalles“. Die 5 in der map-Funktion ist die Minimun-Helligkeit. Ich setze diese nicht auf 0 (=aus), da der Neopixel bei mir etwas flackert und ich es auch schöner finde, wenn er nicht komplett aus geht.

Wer sich für die Mathe hinter der Funktion interessiert: Sean Voisen » Re-creating the "breathing" LED

Super das Du Dir das näher anschaust!, da ist definitiv noch was drin!

Habe das mal einkompiliert und es sieht fein aus. Waberrn & Hunger nach einen neuen Karte, so ein Hertzpochern und angenehm.
Die Kunst ist es nicht zu übertreiben sondern weichere Übergänge zu schaffen, Daumen hoch :+1:
Sende das doch als Pull-request!

Bin ebenfalls ein Freund von solchen Animationen.
Hab’ zusätzlich Effekte mit Farbpaletten realisiert.
Vielleicht als Anregung:

Ich hatte bei meinem Vorgängerprojekt eine sehr weiche Lautstärkeregelung umgesetzt:

Also nicht einfach nur den nächsten Pixel einschalten sondern über Helligkeit einen weichen Übergang mit dem letzten Pixel gemacht. Diese Kleinigkeiten fühlen sich dann bei der Bedienung einfach schöner an.
Ich weiß jetzt nicht ob es hilft aber man müsste nur den letzten Pixel faden. So sah das bei mir aus (NeoPixelBus anstelle von FastLED):

void setVolume(int newVolume){
  ...    
    // show current volume on neopixel ring
    uint32_t neopixelValue = map(newVolume, 0, stepsPerTurn, 0, (NEOPIXEL_NUM) * 255);
    uint8_t fullLEDs = (neopixelValue / 255);
    uint8_t lastLED = (neopixelValue % 255);
    uint8_t  i;
    // clear all LED's
    for(i=0; i < (NEOPIXEL_NUM); i++) {
      pixels.SetPixelColor(i + 1, black);
    }
    // set "full" LED's  
    for(i=0; i < (fullLEDs); i++) {
      pixels.SetPixelColor(i + 1, RgbColor(255));
    }  
    // set last LED
    if (lastLED != 0) {
      pixels.SetPixelColor(fullLEDs + 1, RgbColor(lastLED));
    }  
    pixels.Show();
    // start fade out after 2000 ms
    startTimeNeoPixel = millis();
}
1 „Gefällt mir“