Go Down

Topic: Sketchoptimierung (Read 347 times) previous topic - next topic

charly2020

Jan 12, 2021, 07:27 pm Last Edit: Jan 12, 2021, 07:33 pm by 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, 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);
 
  }





Tommy56

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
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

zwieblum

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);
}

gregorss

#3
Jan 12, 2021, 07:38 pm Last Edit: Jan 12, 2021, 07:39 pm by gregorss
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.

Nicht lange fackeln, lass' Backen wackeln! (Seeed)

my_xy_projekt

#4
Jan 12, 2021, 07:46 pm Last Edit: Jan 12, 2021, 07:48 pm by my_xy_projekt
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.
++

charly2020

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

zwieblum

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

michael_x

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.

Katsumi_S

#8
Jan 12, 2021, 10:38 pm Last Edit: Jan 12, 2021, 10:40 pm by Katsumi_S
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

zwieblum

Quote
Geht nur bei 2, 4, 8, 16... wenn man die 0 mitzählt.
i=(i+1)%11;

:)

michael_x

#10
Jan 13, 2021, 11:48 am Last Edit: Jan 13, 2021, 11:49 am by michael_x
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)

charly2020

#11
Jan 13, 2021, 11:58 pm Last Edit: Jan 14, 2021, 12:20 am by charly2020
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.

combie

#12
Jan 14, 2021, 01:05 am Last Edit: Jan 14, 2021, 11:45 am by combie
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:

Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

zwieblum

<klugscheissermodus>ja wieviele elemente sind's von 0 bis 16? Na?</klugscheissermodus>

combie

Gefährlich, was Theorien aus Menschen machen können.
Schlimmer, was Menschen aus Theorien machen.

Go Up