Unterprogramm langsamer nach erneuter Ausführung

Guten Abend Leute :slight_smile:
Und zwar sitze ich gerade an einer kleinen Bastelei: ich möchte einen Kürbis von innen mit APA102 ausleuchten (mit Feuereffekt) und das Ganze per WLAN steuern. Ich hatte schon etwas Ähnliches gehabt, über die App Virtuino kann man mit dem Controller leicht Daten austauschen. Also hab ich mein vorheriges Programm genommen (funktioniert fehlerfrei) und um eine Feuersimulation erweitert (aus diesem Video).
Aber leider tritt ein Problem auf: schließe ich das Teil an, so startet normal die Feuersimulation wie sie soll. Schalte ich nun per App durch (-->Hoch- und Runterdimmen -->Stroboskop--> Dauerleuchten--> wieder Feuersimulation), so läuft die Feuersimulation extrem langsam ab. Habe schon Vieles versucht, aber ich komme diesem Fehler einfach nicht auf den Grund... Kann mir eventuell Jemand weiterhelfen? :disappointed_relieved:
Code im Anhang (zu lang für Editor), vermuteter Fehler in dieser Erweiterung:

void Fire(){
  // Add entropy to random number generator; we use a lot of it.
  random16_add_entropy(rand());
  if(fireMode==1){
    gPal = HeatColors_p;
  }else if(fireMode==2){
    gPal = RainbowColors_p;
  }else if(fireMode==3){
    gPal = CloudColors_p;
  }else if(fireMode==4){
    gPal = PartyColors_p;
  }else if(fireMode==5){
    gPal = OceanColors_p;
  }else if(fireMode==6){
    gPal = LavaColors_p;
  }else if(fireMode==7){
    gPal = ForestColors_p;
  }else if(fireMode==8){
    gPal = CRGBPalette16( CRGB::Black, CRGB::OliveDrab, CRGB::Orange,  CRGB::White);
  }
  Fire2014(); // run simulation frame
  FastLED.show(); // display this frame
  FastLED.delay(1000 / FRAMES_PER_SECOND);
}

void Fire2014(){
// Array of temperature readings at each simulation cell
  static byte heat[NUM_LEDS];
  // Step 1.  Cool down every cell a little
  for( int i = 0; i < NUM_LEDS; i++) {
    heat[i] = qsub8( heat[i],  random8(0, ((COOLING * 10) / NUM_LEDS) + 2));
  }
  // Step 2.  Heat from each cell drifts 'up' and diffuses a little
  for( int k= NUM_LEDS - 1; k >= 2; k--) {
    heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2] ) / 3;
  }   
  // Step 3.  Randomly ignite new 'sparks' of heat near the bottom
  if( random8() < SPARKING ) {
    int y = random8(7);
    heat[y] = qadd8( heat[y], random8(100,255) );
  }
  // Step 4.  Map from heat cells to LED colors
  for( int j = 0; j < NUM_LEDS; j++) {
    // Scale the heat value from 0-255 down to 0-240
    // for best results with color palettes.
    byte colorindex = scale8( heat[j], 240);
    CRGB color = ColorFromPalette(gPal,colorindex);
    int pixelnumber;
    if( gReverseDirection ) {
      pixelnumber = (NUM_LEDS-1) - j;
    } else {
      pixelnumber = j;
    }
    leds[pixelnumber] = color;
  }
}

Schaltplan wie hier, nur ohne Display, Taster, Taster-LED und Potis)

sketch_oct26a.ino (10.7 KB)

Nanu, so wenig Resonanz?
Konnte das Problem nun lösen: mit der Variable intervall wird bestimmt, wie oft eine Routine aufgerufen wird. Die Feuer-Routine möchte ständig aufgerufen werden, deshalb geht es zuerst. Beim Durchschalten der Modi komme ich zum Dauerleuchten-Modus, wo intervall auf 400 gesetzt wird. Beim vorherigen Programm gab es das Problem nicht, da die Variable stets mit dem Wert aus der App aktualisiert wird (also im Lauflicht- bzw. Glow-Modus, um die Geschwindigkeit zu bestimmen). Behoben hab ich das ganz einfach, indem ich im Feuermodus die Variable auf 1 setze.... ganz simpler Fehler eigentlich.
Habe mich aber stark auf die Feuer-Routine konzentriert, da diese mir nicht ganz geläufig ist. Vor allem die Zeile "random16_add_entropy(rand());" verstehe ich nicht.... original stand statt rand() random() drin, random() verlangt aber nach Übergabewerten. Aber egal ob nun random() mit einem Zahlenbereich von 16 Bit, rand() oder gar auskommentiert, die Feueranimation läuft so oder so.... wozu also diese Zeile?

DerLehmi:
Nanu, so wenig Resonanz?

Da hast du wohl Recht.
Das liegt evtl. daran, dass dein Sketch schlecht bis überhaupt nicht dokumentiert ist.
Das ist für außenstehende sehr schwer zu lesen und nachzuvollziehen.

Das liegt evtl. daran, dass dein Sketch schlecht bis überhaupt nicht dokumentiert ist.

Nanu? Bisher reichten Sketch und Schaltplan immer aus^^
Spaß beiseite.... mein Sketch und schlecht kommentiert? Du meinst bestimmt den Teil, welchen ich in die Code-Tags verfrachtet habe? Wie schon erwähnt habe ich diesen Teil übernommen, und blicke selber noch nicht ganz durch, was da nun passiert, zumal ich bisher noch nix weiter mit Zufallsgeneratoren am Hut hatte. Angeblich ist es eine weiterentwickelte Version aus der FastLED-Library....

DerLehmi:
Spaß beiseite.... mein Sketch und schlecht kommentiert?

Schreibst Du Deine Kommentare auf englisch?

Gruß

Gregor

Schreibst Du Deine Kommentare auf englisch?

-->eigentlich nicht... und die Kommentare in dem Ausschnitt aus dem ersten Post sind nicht von mir, da hab ich gar keine Kommentare zugepackt.

DerLehmi:
-->eigentlich nicht...

Wenn ich fremden Code verstehen möchte, gucke ich zuerst, wie ich ihn möglichst einfach mache. Im gezeigten Beispiel ist eine if-else-Orgie enthalten, die ich zunächst durch ein switch()-Konstrukt ersetzen würde.

Vielleicht ist das zumindest ein guter Anfang.

Gruß

Gregor

DerLehmi:
Nanu? Bisher reichten Sketch und Schaltplan immer aus^^
Spaß beiseite.... mein Sketch und schlecht kommentiert? Du meinst bestimmt den Teil, welchen ich in die Code-Tags verfrachtet habe? Wie schon erwähnt habe ich diesen Teil übernommen, und blicke selber noch nicht ganz durch, was da nun passiert, zumal ich bisher noch nix weiter mit Zufallsgeneratoren am Hut hatte. Angeblich ist es eine weiterentwickelte Version aus der FastLED-Library....

Ja, stimmt. Den Code-Schnipsel in den Code-Tags meinte.

Sorry, da war ich wohl zu streng.
Aber das war mein erster Gedanke auf deine Reaktion, da sich keiner hier gemeldet hat.
Am Tablet kann ich leider keine "ino-Dateien" öffnen.

Wenn ich fremden Code verstehen möchte, gucke ich zuerst, wie ich ihn möglichst einfach mache. Im gezeigten Beispiel ist eine if-else-Orgie enthalten, die ich zunächst durch ein switch()-Konstrukt ersetzen würde.

-->Das scheint so eine Formatierungssache zu sein, wo sich die Geister scheiden (wie z.B. { in der selben Zeile einer Schleife oder in der nächsten Zeile...). Ich selbst bevorzuge if()^^

Sorry, da war ich wohl zu streng.
Aber das war mein erster Gedanke auf deine Reaktion, da sich keiner hier gemeldet hat.
Am Tablet kann ich leider keine "ino-Dateien" öffnen.

-->Passt ja schon, ich habe ja selber keine Möglichkeit, den Code direkt hier reinzuposten, maximaler Zeichensatz und so. Für die Zukunft: würde der Code in einer .txt funktionieren? Bin nicht sonderlich Tablet-affin....

Und zu meiner eigentlichen Frage:
Was macht "random16_add_entropy(rand());" denn nun, hat es irgendeine Bedeutung, da der Code auch ohne diese Zeile funktioniert. Aber irgendwas muss sich der Autor ja dabei gedacht haben....

DerLehmi:
-->Das scheint so eine Formatierungssache zu sein, wo sich die Geister scheiden (wie z.B. { in der selben Zeile einer Schleife oder in der nächsten Zeile...). Ich selbst bevorzuge if()^^

Über Geschmack zu streiten ist Blödsinn (da habe ich bislang j-e-d-e-s-m-a-l am rechtesten gehabt). Ich bevorzuge Schreibweisen und Formatierungen, die einen Code für Nicht-Programmierer verständlich und nachvollziehbar machen. Und häufig beginne ich die Besichtigung eines fremden Codes, indem ich es möglichst übersichtlich „formatiere“. Das führt oft zu Konstrukten, die in wenigen Zeilen viel bewirken und den Ablauf des Codes „sichtbar“ machen. Die if-else-Orgie lässt sich um geschätzte 2/3 kürzen. Außerdem versuche ich, meine Funktionen so kurz zu halten, dass sie auf eine "normale" Bildschirmseite passen.

DerLehmi:
Was macht "random16_add_entropy(rand());" denn nun, hat es irgendeine Bedeutung, da der Code auch ohne diese Zeile funktioniert. Aber irgendwas muss sich der Autor ja dabei gedacht haben....

Wer weiß ... der Vater eines Freundes hat den Freund hin und wieder gefragt, was ihm denn nun schon wieder „vom Arsch in den Kopf“ gestiegen ist.

Mit Code, der ohne etwas so gut funktioniert, wie damit, ist ohne es auf jeden Fall kürzer :slight_smile:

Gruß

Gregor

Einfach mal Google anwerfen "random16_add_entropy" und schon hat man die Beschreibung der Funktion.

Die macht vereinfacht gesagt, den Zufall zufälliger, als es die random() allein sein könnte.

Gruß Tommy