Arduino Forum

International => Deutsch => Topic started by: charly2020 on Jan 12, 2021, 07:27 pm

Title: Sketchoptimierung
Post by: charly2020 on Jan 12, 2021, 07:27 pm
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, ich habe den Loop gern etwas vereinigt, wurde das in einer für Schleife möglich?. Habt Ihr eine Lösung für mich?

Code: [Select]
  // include the necessary libraries
  #include <SPI.h>
  #include <SD.h>
  #include <TFT.h>  // Arduino LCD library
 
  // pin definition for the Uno
  #define sd_cs  4
  #define lcd_cs 10
  #define dc     8
  #define rst    9
   
  TFT TFTscreen = TFT(lcd_cs, dc, rst);     //create an named instance of the TFT class
   
  PImage logo;                              // this variable represents the image to be drawn on screen
 
   
  void setup()
  {

    SD.begin(sd_cs);                        // initialize the SD Card

    TFTscreen.begin();                      // initialize and clear the GLCD screen
    TFTscreen.background(0, 0, 0);
     
    TFTscreen.invertDisplay(1);             //Inverts the color display on the display
    TFTscreen.setRotation(0);               //Aligns the picture upright

  }
 
  void loop()
  {
    logo = TFTscreen.loadImage("Bild01.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild02.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild03.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild04.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild05.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild06.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild07.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild08.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild09.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild10.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild11.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild12.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild13.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild14.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild15.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
    logo = TFTscreen.loadImage("Bild16.bmp");
    Serial.println(F("drawing image"));
    TFTscreen.image(logo,26, 0);
    delay(2000);
 
  }




Title: Re: Sketchoptimierung
Post by: Tommy56 on Jan 12, 2021, 07:31 pm
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Irgendwie verstehe ich Dein Problem noch nicht. Willst Du die Dateinamen in ein Array legen und dieses in der Schleife durchlaufen?

Gruß Tommy
Title: Re: Sketchoptimierung
Post by: zwieblum on Jan 12, 2021, 07:34 pm
Ohn jetzt was getestet zu haben, nur den Teil den du vermutlich meinst:

Code: [Select]

char c[]="Bild00.bmp";
int i=0;

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

logo = TFTscreen.loadImage(c);
Serial.println(F("drawing image"));
TFTscreen.image(logo,26, 0);
delay(2000);
}
Title: Re: Sketchoptimierung
Post by: gregorss on Jan 12, 2021, 07:38 pm
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 (http://html.szaktilla.de/weekender/7.html).

Title: Re: Sketchoptimierung
Post by: my_xy_projekt on Jan 12, 2021, 07:46 pm
Hi,
Wenn Du den schon bringst,
Code: [Select]

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.
++
Title: Re: Sketchoptimierung
Post by: charly2020 on Jan 12, 2021, 08:04 pm
Danke Zwieblum, nach ein paar Klammern umsetzen läuft der Sketch. Danke nochmal.
Title: Re: Sketchoptimierung
Post by: zwieblum on Jan 12, 2021, 08:46 pm
Ich hoffe du hast Bild16.bmp in Bild00.bmp umbenannt :)
Title: Re: Sketchoptimierung
Post by: michael_x on Jan 12, 2021, 09:00 pm
Quote
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.
Title: Re: Sketchoptimierung
Post by: Katsumi_S on Jan 12, 2021, 10:38 pm
Code: [Select]

 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
Title: Re: Sketchoptimierung
Post by: zwieblum on Jan 12, 2021, 11:13 pm
Quote
Geht nur bei 2, 4, 8, 16... wenn man die 0 mitzählt.
i=(i+1)%11;

:)
Title: Re: Sketchoptimierung
Post by: michael_x on Jan 13, 2021, 11:48 am
Quote
i=(i+1)%11;
Code: [Select]
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)
Title: Re: Sketchoptimierung
Post by: charly2020 on Jan 13, 2021, 11:58 pm
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.
Title: Re: Sketchoptimierung
Post by: combie on Jan 14, 2021, 01:05 am
Quote
Leider bin ich damit auf 16 Bilder begrenzt.
Dann ist die Pflicht ja erfüllt...

Code: [Select]
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.

 :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:

Title: Re: Sketchoptimierung
Post by: zwieblum on Jan 14, 2021, 07:18 am
<klugscheissermodus>ja wieviele elemente sind's von 0 bis 16? Na?</klugscheissermodus>
Title: Re: Sketchoptimierung
Post by: combie on Jan 14, 2021, 09:39 am
Meinst du mich?

Title: Re: Sketchoptimierung
Post by: charly2020 on Jan 14, 2021, 10:43 am
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.
Title: Re: Sketchoptimierung
Post by: zwieblum on Jan 14, 2021, 10:56 am
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.
Title: Re: Sketchoptimierung
Post by: Katsumi_S on Jan 14, 2021, 11:10 am
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.
Code: [Select]
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
Title: Re: Sketchoptimierung
Post by: combie on Jan 14, 2021, 11:19 am
Ich entziehe mich der Diskussion.

Title: Re: Sketchoptimierung
Post by: michael_x on Jan 14, 2021, 01:36 pm
Quote
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.
Title: Re: Sketchoptimierung
Post by: charly2020 on Jan 14, 2021, 09:03 pm
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.
Title: Re: Sketchoptimierung
Post by: zwieblum on Jan 14, 2021, 09:37 pm
Nu, dann schau mal in die TFT library, da gibt's sicher eine Funktion zum Freigeben des Bildes.
Title: Re: Sketchoptimierung
Post by: Katsumi_S on Jan 15, 2021, 10:00 am
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