Integration LED Strip und Ring mit NeoPixel

Ich fand die Integration eines LED Strip und Ring total spannend und hab mich in meinem Urlaub mit dem Thema befasst. Wie in den anderen Threads bereits beschrieben, blockieren die Animationen, die von Haus aus dabei sind, die Eingabe und das Lesen von Karten, weil diese Animationen meiner Ansicht in einer „for“ Schleife hängen. Daher habe ich ein paar Animationen selbst geschrieben, die das Problem umgehen und bei jedem Loop Durchgang eine Variable verändert und diese die Animationen steuern. Damit sind sowohl die Tasten als auch das Einlesen der Karte jederzeit möglich.

Gleichzeitig war es mir wichtig, dass wenn ich mir die Zeit dazu nehme andere ggf. davon profitieren können. Daher habe ich den Code so geschrieben, dass man den überall einbauen kann (habe die aktuelle DEV Version von Thorsten zum testen verwendet). Der Code liest die vom System vorhanden Variablen (isPlaying(), knownCard, volume und currentTrack) aus und nutzt diese als Grundlage der Animation.

Animations-Modis:

  • Default (Keine Karte erkannt): Wechselnde Füllung aller LED im gesamten Farbspektrum
  • Musik spielt: RainbowCycle (nachgebaut)
  • Musik pausiert: Aufsteigende Füllung in Regenbogenfarben
  • Lautstärkeanpassung: Prozentuale Anzeige (angepasst an eingestellte minimale und maximale Lautstärke) in der Skala grün zu gelb zu rot
  • Nächstes Lied: Aufsteigende Füllung in Grün (kann ganz am Anfang über Variable als RGB schnell geändert werden)
  • Lied zurück: Absteigende Füllung in Blau (kann ganz am Anfang über Variable als RGB schnell geändert werden)

In jedem Modus funktionieren die Tasten und das Lesen von Karten.

Alle Animationen sind angepasst an die zunächst angepasste Anzahl an LEDs, sodass dazu keine Anpassung im Code notwendig ist.

Für die Integration in euer Projekt, einfach den folgenden Code wie folgt einfügen:

Am Anfang vor den Setup:

// uncomment the below line to enable LED Strip and Ring support
#define LED_SR

#ifdef LED_SR
#include <Adafruit_NeoPixel.h>
#define LED_PIN    6              // Der Pin am Arduino vom dem das Daten Signal rausgeht
#define LED_COUNT 16              // Anzahl an LEDs im Ring oder Strip
 
// Declare NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Zählvarbiablen
uint16_t loopCountdown;       // Runterzählen der Loops
uint16_t lsrLoopCountWait;    // Definierte Anzahl wieviele Loops runtergezählt werden sollen, also wie lange gewartet wird
uint8_t animationCountdown;   // Wie oft die einmalige Animation ausgeführt wird bevor es zurück in die Hauptschleife (Animationsmodus 0) geht
uint8_t x;
uint8_t y;
uint8_t z;
uint8_t i;

// Datenvarbiablen
uint32_t lsrColorUp = strip.Color(0, 255, 0);   // Farbe wird bei Animation nächstes Lied verwendet
uint32_t lsrColorDown = strip.Color(0, 0, 255); // Farbe wird bei Animation Lied zurück verwendet
uint8_t currentDetectedVolume;                  // Speichern der aktuellen Lautstärke für späteren Vergleich
uint8_t lastDetectedVolume;                     // Speichern der Lautstärke um die Animation nur ein mal zu triggern
uint8_t volumeScope;                            // Differenz der von euch eingestellten minimalen und maximalen Lautstärke
uint8_t volumeScopeAmount;                      // Lautstärkenwert in deinem Scope
uint8_t currentDetectedTrack;                   // Speichern des aktuellen Tracks für späteren Vergleich
uint8_t lastDetectedTrack;                      // Speichern des Tracks um die Animation nur ein mal zu triggern
uint8_t lsrAnimationMode;                       // Animationsmodus - 0: Daueranimation, 1-2 einmalige Animation (als Unterbrechung zu 0)
uint8_t lsrAnimationTrackMode;                  // Bei Animationsmodus Liedwechsel bestimmung der Farbe und Richtung
uint32_t lsrHueCalc;                            // Zwischenspeicher einer Farbe
uint32_t lsrColors;                             // Zwischenspeicher einer Farbe
uint8_t lsrColorR[LED_COUNT];                   // Zwischenspeicher des Rot-Wertes für alle LEDs
uint8_t lsrColorG[LED_COUNT];                   // Zwischenspeicher des Grün-Wertes für alle LEDs
uint8_t lsrColorB[LED_COUNT];                   // Zwischenspeicher des Blau-Wertes für alle LEDs

#endif

In den Setup:

  #ifdef LED_SR
    strip.begin();
    strip.setBrightness(20);
    strip.show();

    loopCountdown = 0;
    animationCountdown = 1;
    lastDetectedTrack = 0;
    
  #endif

Im Loop:

#ifdef LED_SR
// LED Strip und Ring

///////////////// Prüfung der einmaligen Animationen /////////////////

// ----------   Liedänderung erkennen und Animation aktivieren   ---------- //   
currentDetectedTrack = currentTrack;
if (currentDetectedTrack != lastDetectedTrack) 
{
  strip.clear();
  if(currentTrack > lastDetectedTrack){ //nächstes Lied
    lsrAnimationTrackMode = 1;
    lsrColors = lsrColorUp;
  }
  if(currentTrack < lastDetectedTrack){ // Lied zurück
    lsrAnimationTrackMode = 2;
    lsrColors = lsrColorDown;
  }
  lsrAnimationMode = 1;
  animationCountdown = strip.numPixels();
  lsrLoopCountWait = 5; // Geschwindigkeit der Animation, desto größer desto langsamer
  y = 0;
}

// ----------    Lautstärkenanpassung erkennen und Animation aktivieren    ---------- //  
currentDetectedVolume = volume;
if (currentDetectedVolume != lastDetectedVolume)
{
  lsrAnimationMode = 2;
  animationCountdown = strip.numPixels();
  lsrLoopCountWait = 6;
  y = 0;
}

///////////////// Dauerhafte Loop Animationen /////////////////

// ----------   Loop Animation: Default Mode   ---------- //  
if (lsrAnimationMode == 0 && loopCountdown == 0 && isPlaying() == false && knownCard == false)
{
  lsrLoopCountWait = 1; // Geschwindigkeit der Animation, desto größer desto langsamer

  // Farbe & Animation definieren: Alle LEDs leuchten alle abwechselnd  im hue Spektrum
  y++;
  if (y >= (strip.numPixels()*8) ) 
  {
    y = 0;
  }
  strip.fill(strip.ColorHSV((y * 65536 / strip.numPixels() / 8) , 255, 30), 0, 0);

  strip.show();
  loopCountdown = lsrLoopCountWait;
}

// ----------   Loop Animation: Musik spielt   ---------- // 
if (lsrAnimationMode == 0 && loopCountdown == 0 && isPlaying() == true && knownCard == true)
{
  lsrLoopCountWait = 5; // Geschwindigkeit der Animation, desto größer desto langsamer
  
  // Fabre definieren: hue Spektrum (Rainbow)
  do
  {
    for (i = 0; i < strip.numPixels(); i++)
    {
      lsrColors = strip.ColorHSV(i * 65536 / strip.numPixels(), 255, 30);
      strip.setPixelColor(i, lsrColors);
      lsrColorR[i] = (lsrColors >> 16 & 0xFF);
      lsrColorG[i] = (lsrColors >> 8 & 0xFF);
      lsrColorB[i] = (lsrColors & 0xFF);
    }
    x++;
  } while (x < strip.numPixels());

  // Animation definieren: Rotation im Uhrzeigersinn
  y++;
  x = 0;
  if (y >= strip.numPixels())
  {
    y = 0;
  }
  do
  {
    for (i = 0; i < strip.numPixels(); i++)
    {
      strip.setPixelColor((i + y) % strip.numPixels(), lsrColorR[i], lsrColorG[i], lsrColorB[i]);
    }
    x++;
  } while (x < strip.numPixels());

  strip.show();
  loopCountdown = lsrLoopCountWait;
}

// ----------   Loop Animation: Musik pausiert   ---------- //  
if (lsrAnimationMode == 0 && loopCountdown == 0 && isPlaying() == false && knownCard == true)
{
  lsrLoopCountWait = 5; // Geschwindigkeit der Animation, desto größer desto langsamer

  // Fabre definieren: hue Spektrum (Rainbow)
  x=0;
  do
  {
    for (i = 0; i < strip.numPixels(); i++)
    {
      lsrColors = strip.ColorHSV(i * 65536 / strip.numPixels(), 255, 30);
      lsrColorR[i] = (lsrColors >> 16 & 0xFF);
      lsrColorG[i] = (lsrColors >> 8 & 0xFF);
      lsrColorB[i] = (lsrColors & 0xFF);
    }
    x++;
  } while (x < strip.numPixels());

  // Farbe definieren: Füllend ansteigend
  
  y++;
  if (y >= strip.numPixels())
  {
    y = 0;
    z++;
    strip.clear();
  }
  if (z >= strip.numPixels())
  {   
    z = 0;
  }
  
  x=0;
  do
  {
    for (i = 0; i < y +1 ; i++)
    {
      strip.setPixelColor( y , lsrColorR[y], lsrColorG[y], lsrColorB[y]);
    }
    x++;
  } while (x < y + 1);

  strip.show();
  loopCountdown = lsrLoopCountWait;
}

///////////////// Einmalige Animationen bei einem Ereignis /////////////////

// ----------   Einmalige Animation: Liedänderung    ---------- //
if (lsrAnimationMode == 1 && loopCountdown == 0)
{

  // Fabre definieren: oben definiert
  x=0;
  do
  {
    for (i = 0; i < strip.numPixels(); i++)
    {
      lsrColorR[i] = (lsrColors >> 16 & 0xFF);
      lsrColorG[i] = (lsrColors >> 8 & 0xFF);
      lsrColorB[i] = (lsrColors & 0xFF);
    }
    x++;
  } while (x < strip.numPixels());

  // Animation definieren: oben definiert
  
  
  if (y >= strip.numPixels()){ 
      strip.clear();
      y = 0; 
    }


  if(lsrAnimationTrackMode == 1){
    z = y ;
  }
  if(lsrAnimationTrackMode == 2){
    z = strip.numPixels() - y ;
  }
  
  x=0;  
  do
  {
    for (i = 0; i < y +1 ; i++)
    {
      strip.setPixelColor( z , lsrColorR[y], lsrColorG[y], lsrColorB[y]);
    }
  x++;
  } while (x < y + 1);
  
  y++;

  strip.show();

  if (animationCountdown != 0){ animationCountdown--; }

  if (animationCountdown == 0){
    lsrAnimationMode = 0;
  }
  loopCountdown = lsrLoopCountWait ;
}

// ----------   Einmalige Animation: Prozentuale Lautstärkenanpassung   ---------- // 
if (lsrAnimationMode == 2 && loopCountdown == 0)
{
  if (animationCountdown != 0)
  {
    animationCountdown--;
  }

  if (currentDetectedVolume != lastDetectedVolume)
  {
    lsrLoopCountWait = 5;
  }

  volumeScope = (mySettings.maxVolume - mySettings.minVolume);
  volumeScopeAmount = (volume - mySettings.minVolume) * (LED_COUNT - 1) / volumeScope; // Lautstärkenanzeige angepasst an die Anzahl der LEDs

  // Fabre definieren: von grün zu rot
  x = 0;
  do
  {
    for (i = 0; i < strip.numPixels(); i++)
    {
      lsrHueCalc = 21000 / (strip.numPixels() - 1) / (strip.numPixels() - 1);
      lsrColors = strip.ColorHSV(((strip.numPixels() - 1) - i) * (strip.numPixels() - 1) * lsrHueCalc, 255, 30);
      strip.setPixelColor(i, lsrColors);
      lsrColorR[i] = (lsrColors >> 16 & 0xFF);
      lsrColorG[i] = (lsrColors >> 8 & 0xFF);
      lsrColorB[i] = (lsrColors & 0xFF);
    }
    x++;
  } while (x < strip.numPixels());
  // Animation definieren: Prozentuale Lautstärkenanpassung
  strip.clear();
  x = 0;
  do
  {
    for (i = 0; i < volumeScopeAmount + 1; i++)
    {
      strip.setPixelColor(i, lsrColorR[i], lsrColorG[i], lsrColorB[i]);
    }
    x++;
  } while (x < (volumeScopeAmount + 1));

  strip.show();

  if (animationCountdown == 0)
  {
    //delay(20);
    lsrAnimationMode = 0;
  }
  loopCountdown = lsrLoopCountWait;
}


// ----------   Countdown Zähler über den loop als ersatz zur delay Funktion   ----------
if (loopCountdown != 0 ){ loopCountdown--;}

// ----------   Dadurch wird die Änderung der Lautstärke bzw. Track nur ein mal registiert   ----------
lastDetectedVolume = currentDetectedVolume;
lastDetectedTrack = currentDetectedTrack;

#endif

Speicherbelegung ist mit der Integration des Codes bei 90%, nimmt also ca. 10% ein. Man könnte den Code noch etwas schlanker machen, mir war jedoch wichtig, dass auch Code Unerfahrene die Farbe oder Animation einfach ändern können, ohne dass das eine das andere Beeinflusst und Fehler reinkommen.

Wichtig: Wenn ihr den Code ausprobieren wollt, dann solltet ihr nach dem Aufspielen den Arduino kurz vom Strom nehmen. Beim Schreiben und Testen (bin ich fast wahnsinnig geworden) haben beim Aufspielen von kleinen Änderungen, Dinge nicht mehr funktioniert, die ich garnicht geändert habe. Leider ist mir das erst nach einer Woche und der dritten Version aufgefallen, dass man den Arduino bei Änderungen kurz vom Strom nehmen sollte.

Auch wenn es bei mir läuft, würde mich freuen, wenn das jemand nochmals testen könnte.
Wenn ihr andere Animationen schreibt, könnte diese gerne hier teilen.

Als nächstes Würde ich gerne noch eine Powersafe Option mit einbauen, also die durchgehenden Animationen, bspw. wenn Musik spielt, zeitlich begrenzt. Wie genau dies sinnvoll ist, weiß ich aber noch nicht genau.

11 „Gefällt mir“

Super, Danke und grosses Lob dafuer!!
Dieses Thema stand noch auf meiner Liste, aber Programmiertechnisch ist bei mir gleich null.

Finde es daher doppelt gut das du die unerfahrenen Anwender beruecksichtigst.
Evtl. noch eine Step by Step Anleitung :-)…Bei Setup und Loop hoerst bei mir schon auf :blush:

Cool. Ich probiers bei Gelegenheit auch mal aus.
Danke für die Mühe

Das was du auf den Arduino lädst nennt man einen Sketch der die .ino Endung hat. Ein Sketch muss mindestens aus einem „void setup()“ und einem „void loop()“ bestehen. Das setup() wird beim Start einmal durchlaufen. Das was im loop() steht, läuft in einer Endlosschleife immer wieder ab. Wenn ein loop() durchlaufen wurde, fängt er von vorne an.

  1. Den Teil „Am Anfang vor den Setup“ habe ich auf Linie 22 nach dem folgenden Teil eingefügt:

    // uncomment the below line to enable five button support
    //#define FIVEBUTTONS

  2. Den Teil „In den Setup:“ kannst du in die Zeile nach dem „void setup(){“ einfügen.

  3. Den Teil „Im Loop:“ kannst du in die Zeile nach dem folgenden Zeilen reinkopieren:

    void loop(){
    do{

Ich hoffe, dass hat dir geholfen.

1 „Gefällt mir“

Könntest Du nich auch einen Fork bei Github für deine Version anlegen, das man sich die komplette aktuelle .ino runterladen kann?

Ich hab mittlerweile soviele Testversionen, das ich völlig durcheinander komme.
Würde deine Implementierung aber gerne ausprobieren. Ab und an hab ich tatsächlich ein Problem mit einer hängenden Box. (nutze die FastLED Library)


EDIT schreitvon hinten, OK schon eingebunden.
Gefällt mir sehr gut. +1

Ich würde nur gern die Startanimation (im IDLE Modus) wenn s geht max1 mal durchlaufen lassen, oder garnicht. Hab eine StatusLED die pulsiert im Pause Modus.
Habs nicht hinbekommen, kannst Du mich in die richtige Richtung schubsen?

Nehm den Impuls gerne auf und werde mir mal einen Github Account machen. Wenn dort eine fertige Version liegt wird es auch für Codeunerfahrene einfacher sein, dass auszuprobieren.

Um zu deiner Frage zurückzukommen:
Ich nutze im Idle-Mode y um die Farbe (hue) zu berechnen und setze y immer wieder auf 0 zurück um in der Farbskala von vorne anzufangen. Statt von vorne anzufangen könntest du die LEDs „stumm“ schalten. Das wäre die schnellste Lösung.
Will sowas in der Richtung (Powersafe Modus) auch noch einbauen. Bei Kindern müssen die nicht durchgehend an sein und da reichen ein paar Durchgänge aus.

Das Problem sehe ich eher, das der Arduino wie wild am arbeiten dabei ist.

Brightness auf 0 geht zwar auch, arbeiten tut er dabei abern atürlich trotzdem.
Muss ja nicht zwingend sein. Stromsparen und so.
Optional wäre auch gut.

Ich habs jetzt mal so gemacht, das ich bei
„Loop Animation: Musik pausiert“ die Geschwindigkeit runter setze (auf 15)
und vor x=0
noch ein
strip.clear();
gesetzt habe.
Daduch wandert nur eine einzelne LED im Kreis rum. Gefällt mir so besser.

Als ich damit angefangen habe, habe ich auch Gedacht, dass er dann wild am arbeiten ist. Mit dem normalen TonUino Code ist er aber auch ganz schön am arbeiten, dort sind auch einige Prozesse am laufen wenn er den Loop durchläuft. Ich frag mich wieviel mehr Arbeit der Arduino wirklich hat und ob es die Lebenserwartung des Arduino beeinflussen kann. Vielleicht kann jemand der sich mit Mikrocontroller gut auskennt, dazu mal eine Einschätzung geben.

Ok, dazu kann ich nichts sagen. Die Klappe ist nur zum flashen offen und offenbart den Blick auf die LEDs.
Kann sein, das er das tatsächlich immer macht

:slight_smile: lustig dass du den gleichen Gedankengang hast. Aus dem Grund habe ich ein mal die dev Version ohne zusätzlichen Code draufgespielt und dort sah es genauso aus.
PS: Fand es schwierig die passenden Animationen zu finden. Um es leicht editierbar zu gestalten, habe ich auch Farbe und Animation versucht zu trennen. Der Idle- und Pause-Mode passen eigentlich schon ganz gut, aber 100%-ig bin ich damit auch noch nicht zufrieden. Aber das ist ja Geschmackssache und kann man immer wieder ändern.

Habe auf meinem Github Account https://github.com/tvyzq/TonUINO den oben beschriebenen Code hochgeladen. Habe als Grundlage die 2.1 DEV Version genommen.
Ich habe dort außerdem die Funktion hinzugefügt, die LEDs über gemeinsames langes drücken auf Lauter und Pause Knopf einzuschalten bzw. Leiser und Pause Knopf auszuschalten. Diese Funktion ist jedoch deaktiviert und kann bei bedarf aktiviert werden.

4 „Gefällt mir“

Hallo zusammen,
ich finde die Idee mit den Strips oder Rings schon echt klasse. Allerdings will das ganze bei mir nicht richtig funktionieren… Ich muss allerdings dazu sagen, dass ich was Arduino, etc. angeht noch totaler Anfänfer bin. Ich betreibe die Box mit dem 18650 V3 Shield und Pololu. Was bis jetzt funktioniert ist: die ersten 5 LEDS beim Strip leuchten grün bei der Liedwechsel Funktion (also hier currentDetectedTrack = currentTrack;…). Selbst wenn ich die Farbe in der Funktion ändere und den Code neu hochlade: es ändert sich nichts. Kann es sein, das der Pololu dazwischen funkt? Mangels echtem Debugger ist das ganze auch recht mühsam herauszufinden.
Hat das hier schon jemand in der Konstellation ans laufen bekommen?

1 „Gefällt mir“

Hast du die LED Anzahl angepasst im Code (falls unterschiedlich)?
Funktionieren die lauter und leiser LEDs? Die müssten sich auf bzw abbauen (saucoole Funktion Btw.)
Im Prinzip müsste direkt beim Starten eine Animation los laufen.

Kann mir nicht vorstellen, daß es am pololu liegt. Der ist doch nur für ein und ausschalten zuständig? Habe keinen verbaut.
Allerdings werkelt bei mir auch das 18650 wemos shield.

Hast du meine Github Version genommen oder den zusätzlichen Code selbst hinzugefügt?
Hast du nach dem aufspielen, den Arduino kurz vom Strom getrennt?

So sollte es aussehen, wenn alles funktioniert:
Beim Einschalten des Arduino wird bei den LEDs die Lautstärke angezeigt (von grün zu rot), weil diese vom Arduino eingestellt wird (und vom zusätzlichen Code als Änderung wahrgenommen wird). Nach einem kurzen Augenblick wird der Idle Mode aktiviert, dort leuchten alle LEDs gleichzeitig mit wechselnden Farben.
Sobald eine Karte aufgelegt wird, leuchten die LEDs aufsteigend grün und nach einem kurzen Moment gibt es den RainbowCycle.
Passiert am Anfang nichts oder erst wenn du eine Karte auflegst?

@barni:
Yep, habe ich: #define LED_COUNT 9. Auf Lauter / Leiser reagieren die LEDs nicht, ansonsten funktionieren die Tasten schon. Die Animation läuft leider auch nicht los.
BTW: Wie machst Du das mit Ein/Aus bzw. Stromsparen ohne Pololu?

@tON:
Ich habe beide Varianten getestet: Die Github Version wollte bei mir gar nicht, da hat z. B der Card Reader gar nicht mehr angesprochen. Beim selbst eingefügten Code dagegen springen die ersten 5 LEDs auf grün, sobald eine Karte angelegt wird. Die Startanimation dagegen sehe ich erst gar nicht.

Interessanter Weise funktioniert die Version von Barnosch (die verwendet ja die FastLED Lib) auf Anhieb (die hier: https://github.com/barnosch/TonUINO). Zumindest bei ein paar kuerzen Tests von mir. Im Grunde könnte ich die jetzt zwar nehmen, aber ich würde schon gern das warum und wieso verstehen…

Dann wollen wir weiter suchen:
Was sagtn die Ausgabe im seriellen Monitor?
Benutzt du die DEV Soundfiles von Thorsten?
Hast du einen Widerstand zwischen Arduino und den LEDs?

Aber gerne doch :slight_smile:

Der Monitor sagt:

 _____         _____ _____ _____ _____
|_   _|___ ___|  |  |     |   | |     |
  | | | . |   |  |  |-   -| | | |  |  |
  |_| |___|_|_|_____|_____|_|___|_____|

TonUINO Version 2.1
created by Thorsten Voß and licensed under GNU/GPL.
Information and contribution at https://tonuino.de.

=== loadSettingsFromFlash()
Version: 2
Maximal Volume: 25
Minimal Volume: 5
Initial Volume: 15
EQ: 1
Locked: 0
Sleep Timer: 5
Inverted Volume Buttons: 1
Admin Menu locked: 0
Admin Menu Pin: 1111
=== setstandbyTimer()
300053
Firmware Version: 0x88 = (clone)
=== playShortCut()
3
Shortcut not configured!
Card UID: 26 7E 3A D5
PICC type: MIFARE 1KB
Authenticating Classic using key A...
Reading data from block 4 ...
Data on Card :
 13 37 B3 47 02 01 05 1C 57 00 00 00 00 00 00 00

1
1
== playFolder()
=== disablestandby()
1 Dateien in Ordner 1
Hörbuch Modus -> kompletten Ordner spielen und Fortschritt merken

Bitte beim Posten von Code oder Konsole den </> Knopf verwenden! Danke!

PS: Mir ist grade aufgefallen: Im Monitor Mode reagieren die Lauter/Leiser/Pause Tasten nicht. Sobald ich die USB-Verbindung trenne läuft alles wieder normal.

Ok, also funktioniert meine Version bei dir (barni =barnosch)
Dann scheint ja zumindest alles richtig verkabelt zu sein.

Das es dann mit @tON Version nicht tut, wundert mich.
Ich hab seine Code Schnipsel bei mir reinkopiert (und meinen Kram auskommentiert) und das klappte auf Anhieb.

Lese oben was von platformio… Daran kann es nicht liegen? Ich nutze die ganz normale Arduino IDE.

@barni: Nein, an vscodium/platformio liegt es nicht. (Bin da einfach nur Gewohnheitstier, ich nutze vscodium täglich) Mit der Arduino IDE ist der Effekt der gleiche.

Ich habe es grade noch einmal getestet (mit der Arduino IDE): Deine Github-Version läuft sofort, die LEDs sind schön animiert beim abspielen, lauter/leiser reagiert wie es soll, etc.
Bei @tON’s Version leuchten nur die ersten 5 LEDs grün.


WG: Du hast das Antwort-Beschränkung für dieses Thema erreicht…

@tON:
Das mit dem USB Kabel (Reset) habe ich mir eh schon angewöhnt, nach dem Motto ‚Boot tut gut‘… :slight_smile:

Jetzt zum merkwürdigen Teil: Ich habe deinen Code heute 2mal geflasht: Laptop angeworfen, Arduino Studio gestartet und Code hochgelden: Beim erstem Mal ging rein gar nichts, danach den Laptop neu gebootet und den Code wieder hochgeladen… Was soll ich sagen? Jetzt funktionierte es auf Anhieb. Ich vermute mal das hat etwas mit Sonnenflecken oder so zu tun… Echt merkwürdig.

 _____         _____ _____ _____ _____
|_   _|___ ___|  |  |     |   | |     |
  | | | . |   |  |  |-   -| | | |  |  |
  |_| |___|_|_|_____|_____|_|___|_____|

TonUINO Version 2.1
created by Thorsten Voß and licensed under GNU/GPL.
Information and contribution at https://tonuino.de.

=== loadSettingsFromFlash()
Version: 2
Maximal Volume: 25
Minimal Volume: 5
Initial Volume: 15
EQ: 1
Locked: 0
Sleep Timer: 5
Inverted Volume Buttons: 1
Admin Menu locked: 0
Admin Menu Pin: 1111
=== setstandbyTimer()
300054
Firmware Version: 0x88 = (clone)
=== playShortCut()
3
Shortcut not configured!
Loop#:
0
Card UID: 26 7E 3A D5
PICC type: MIFARE 1KB
Authenticating Classic using key A...
Reading data from block 4 ...
Data on Card :
 13 37 B3 47 02 01 05 1C 57 00 00 00 00 00 00 00

1
1
== playFolder()
=== disablestandby()
1 Dateien in Ordner 1
Hörbuch Modus -> kompletten Ordner spielen und Fortschritt merken
Loop#:
0
=== volumeUp()
16
=== volumeUp()
17
=== volumeUp()
18
=== volumeDown()
17
=== volumeDown()
16
=== volumeDown()
15
=== volumeUp()
16
=== volumeUp()
17
=== setstandbyTimer()
326477
=== volumeDown()
16
=== volumeDown()
15
=== volumeDown()
14
=== volumeDown()
13
=== volumeUp()
14
=== volumeUp()
15
=== volumeUp()
16
=== volumeUp()
17
=== volumeUp()
18
=== disablestandby()
=== setstandbyTimer()
343797
Card UID: 26 7E 3A D5
PICC type: MIFARE 1KB
Authenticating Classic using key A...
Reading data from block 4 ...
Data on Card :
 13 37 B3 47 02 01 05 1C 57 00 00 00 00 00 00 00

1
1
== playFolder()
=== disablestandby()
1 Dateien in Ordner 1
Hörbuch Modus -> kompletten Ordner spielen und Fortschritt merken
Loop#:
2
=== setstandbyTimer()
355050
=== power off!

Ich werde das jetzt erst mal so lassen und schauen wie sich das Ganze so im Dauerbetrieb macht.

Auf jeden Fall erstmal: Vielen Dank für eure Hilfe!!!