Sketchoptimierung

charly2020: Moin Ich stehe auf dem Schlauch. Mit dem Sketch lade ich nacheinander 16 Bitmaps von einer SD Karte und lasse sie auf einem TFT Display anzeigen. Nun würde ich den Loop gern etwas vereinfachen, wäre das in einer For Schleife möglich?. Habt Ihr eine Lösung für mich?

Dein Code ist sehr schlecht zu lesen. Daher habe ich nur sehr oberflächlich drübergescrollt.

Aber was ich sehe, sieht sehr danach aus, dass Du mit einer Schleife (for oder while) arbeiten solltest. Sieh nach, was für einen Parameter die Funktion TFTscreen.loadImage() benötigt.

Gruß

Gregor

Ach ja, lies gelegentlich das hier.

Hi, Wenn Du den schon bringst,

zwieblum: i=(i+1)&15; c[4]=(int)(i/10)+'0'; c[5]=(i%10)+'0';

hättest aus dem: delay(2000); auch noch einen millis()-modulo-Mantel bilden können ;)

Aber ne sehr schöne Idee - muss man drauf kommen. ++

Danke Zwieblum, nach ein paar Klammern umsetzen läuft der Sketch. Danke nochmal.

Ich hoffe du hast Bild16.bmp in Bild00.bmp umbenannt :)

hättest aus dem: delay(2000); auch noch einen millis()-modulo-Mantel bilden können

Ob loop 2s oder 32s dauert, ist schon ein wesentlicher Unterschied. Und solange es nichts gibt, was während der 2s gleichzeitig und noch schneller laufen soll, spricht erstmal nichts gegen das delay().

Wichtiger wäre meiner Meinung nach, auf evtl. fehlende Dateien passend zu reagieren, zumindest in den Serial Testausgaben.

zwieblum: i=(i+1)&15; c[4]=(int)(i/10)+'0'; c[5]=(i%10)+'0';

Das ist echt cool gemacht. Für den Zweck von "&15" habe ich eine Weile gebraucht. Damit sicherstellen das er die Bilder nicht über 15 rauszählt ist wirklich super (oder verrückt). Geht aber leider nicht immer. Geht nur bei 2, 4, 8, 16... wenn man die 0 mitzählt.

Gruß, Jürgen

Edit: Karma += 1

Geht nur bei 2, 4, 8, 16... wenn man die 0 mitzählt.

i=(i+1)%11;

:)

i=(i+1)%11;

i=i<10?i+1:0;  // vermeidet die teure modulo-Operation: i = 0,1,..,10, 0 ... Sägezahn2 Zeichen mehr zu tippen, 84 byte weniger Code (auf meinem Nano)

Moin Ich bin es nochmal War gestern etwas voreilig, weil ich nur sehr ähnliche Bilder zum testen hatte. Heute hab ich es mit anderen Bilder getestet. Leider bin ich damit auf 16 Bilder begrenzt.

Leider bin ich damit auf 16 Bilder begrenzt.

Dann ist die Pflicht ja erfüllt...

void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
    static unsigned index {0};
    char buffer[32];
    if(index>16) index = 0;   
    snprintf_P(buffer,32,PSTR("Bild%02d.bmp"),index);
    
    Serial.print(F("drawing image: "));
    Serial.println(buffer);
    
    // logo = TFTscreen.loadImage(buffer);
    // TFTscreen.image(logo,26, 0);
    
    index++;
    delay(2000);
 }

Nachtrag:

Wenn dieser Beispielcode maximale Nebenwirkungen zeigen soll, schlagen sie bitte den Autor, oder den Fragesteller.

:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

ja wieviele elemente sind's von 0 bis 16? Na?

Meinst du mich?

Moin zwieblum mit einem Kommentar auf deinen Post halte ich mich lieber zurück, sonst werde ich auch ausfallend. Vielleicht habe ich mich auch falsch ausgedrückt. Ist ja richtig im Sketch habe ich 16 Bitmaps aufgeführt. Aber ich habe einen Weg gesucht, wie ich mit weniger Aufwand 16 oder 50 oder 100 oder mehr Bitmaps anzeigen kann. Klar kann ich 100 mal die Zeilen in den Sketch einfügen, dachte nur es gäbe etwas Eleganteres. Aber wenn so profane Fragen hier nicht gewünscht sind, werd ich wo anders schauen.

Wasislos? Wenn du 100 bitmaps von Bild00.bmp bis Bild99.bmp anzeigen willst, dann machst' halt i=(i+1)%100; rein, was willst du da kopieren? Ich war mir nur ziemlich sicher, dass du in der Zeile da "if(index>16) index = 0;" übersiehst, dass es 17 bilder sind und nicht 16.

charly2020: Moin zwieblum mit einem Kommentar auf deinen Post halte ich mich lieber zurück, sonst werde ich auch ausfallend. Vielleicht habe ich mich auch falsch ausgedrückt. Ist ja richtig im Sketch habe ich 16 Bitmaps aufgeführt. Aber ich habe einen Weg gesucht, wie ich mit weniger Aufwand 16 oder 50 oder 100 oder mehr Bitmaps anzeigen kann. Klar kann ich 100 mal die Zeilen in den Sketch einfügen, dachte nur es gäbe etwas Eleganteres. Aber wenn so profane Fragen hier nicht gewünscht sind, werd ich wo anders schauen.

Hallo charly2020,

  1. meinte zwieblum nicht Dich, sondern combie hatte sich verrechnet. 0 bis 16 sind 17 Elemente und nicht 16.
  2. zwieblum hat ja oben die von Dir übernommene Lösung mit 16 Bildern reingestellt und weiter unten auch schon gesagt wie es geht wenn es mehr oder weniger sind.
i=(i+1)%11;

Einfach die 11 durch Deine gewünschte Anzahl -1 ersetzen. Weil erstes Bild ist Bild00.bmp. Oder den Sketch von combie versuchen und anpassen.

Gruß, Jürgen

Ich entziehe mich der Diskussion.

Oder den Sketch von combie versuchen und anpassen

Modulo ( % ) ist zwar nett, aber selten “optimal”.
Den Gedankenfehler, dass 0…1000 1001 Elemente sind, macht man hier wie da gleich gern, denke ich.

Und wenn man schon bewusst Zweierpotenzen verwendet, sollte man nicht hoffen, dass der Compiler das merkt und aus %16 heimlich ein &0x0F macht, sondern es lieber auch gleich so hinschreiben.
Finde ich.
Weil es schön ist, was man mit wenigen Byte alles hinkriegt, deshalb programmieren wir ja solche Winzlinge.

Moin Um mal den etwas herben Umgangston raus zunehmen. habe alles durchgetestet konnte aber nur max 24 Bilder anzeigen lassen. Leider ist das durch die TFT Lib begrenzt. Also Entschuldigung und bleibt gesund.

Nu, dann schau mal in die TFT library, da gibt's sicher eine Funktion zum Freigeben des Bildes.

charly2020: Moin Um mal den etwas herben Umgangston raus zunehmen. habe alles durchgetestet konnte aber nur max 24 Bilder anzeigen lassen. Leider ist das durch die TFT Lib begrenzt. Also Entschuldigung und bleibt gesund.

Der Ton kommt manchmal vor und solange Uwefed (Moderator) nicht einschreitet ist alles noch im grünen Bereich. ;-) Wir sind hier noch angenehm, schau mal im Mikrocontroller Forum...

Bist Du sicher das die auf 24 Bilder begrenzt? Oder ist eines der Bilder nicht kompatibel? Die GFX Library von Adafruit will z.B. nur unkomprimierte 24-Bit BMPs. Bei einem Komprimierten kommt eine Fehlermeldung. Kannst ja mal die Bilder tauschen. Sonst bleibt eventuell noch eine andere Library wie gerade die Adafruit GFX mit Image_Reader. Habe ich allerdings bisher nur für die Anzeige von Text benutzt und mit Bildanzeige noch nichts gemacht.

Gruß, Jürgen