Images.raw von der SD Karte auf das Display laden

Hallo,

ich bin gerade dabei mein 7" Touchpanel einzurichten. Nun wollte ich nach einigen Recherchen ein Bild auf das Panel laden.

Bild ausgeucht, Bildgröße auf 16-Bit 565 umgestellt.

Auf die Speicherkarte gezogen und hinten in den Display gesteckt.

Ich benutze folgenden Sketch :

#include <UTFT.h>
#include <UTouch.h>
#include <avr/pgmspace.h>

UTFT myGLCD(CTE70,38,39,40,41); // 7" Sainsmart - richtigen controller auswählen

//initialisiere touchscreen 

UTouch myTouch(6,5,4,3,2);

//deklariere Font 

extern uint8_t BigFont[]; 

int x,y; 
char stCurrent[20]="";
int stCurrentLen=0; 
char stLast[20]="";





void setup()

{
  myGLCD.InitLCD();
  myGLCD.clrScr();

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);

  myGLCD.setFont(BigFont);
  myGLCD.setBackColor(0, 0, 255);

}
  



void loop()
{
myGLCD.drawBitmap(0,0,800,480,"images.raw");
}

Leider bekomme ich folgenden Fehlermeldung :

Touc_Button_RECT.ino: In function 'void loop()':
Touc_Button_RECT:43: error: no matching function for call to 'UTFT::drawBitmap(int, int, int, int, const char [11])'
C:\Users\Alex\Documents\Arduino\libraries\UTFT/UTFT.h:223: note: candidates are: void UTFT::drawBitmap(int, int, int, int, unsigned int*, int)
C:\Users\Alex\Documents\Arduino\libraries\UTFT/UTFT.h:224: note:                 void UTFT::drawBitmap(int, int, int, int, unsigned int*, int, int, int)

Woran liegt das ? Wird etwa die avr/pgmspace.h nicht richtig eingebunden?

Gibts eventuell einen anderen Weg um ein Bild von der SD Karte auf das Display zu laden?!

MFG Crazy Rider

Du versteht da was grundlegend falsch. Da wird nicht der Dateiname übergeben. Sonst wie bei Fonts auch ein Zeiger auf ein Array das im Flash liegt. Das Array kann dann auch nicht größer als 64kB sein. Das geht also in dieser Größe nicht.

Du kannst in UTFT nicht ein Bild direkt von der SD Karte laden. Die Datei legst du im deinem Sketch Verzeichnis ab. Und die Daten werden dann beim Hochladen in den Flash Speicher geschrieben.

Schau dir mal das Beispiel dazu genauer an. Da fehlt auch der Verweis auf das Bild (wie beim Font mit extern).

Wobei es theoretisch auch möglich wäre das so umzuschreiben dass die Daten von der SD Karte gelesen werden. Die Adafruit Library kann glaube ich Bilder von SD lesen. Ich weiß aber nicht ob die mit deinem Display funktioniert.

Das ist schon richtig, so genau versteh ich das noch nicht. Ich habe folgenden Beitrag aus dem Nachbarforum gelesen:

http://www.arduinoforum.de/arduino-Thread-Fix-ein-paar-images-raw-f%C3%BCr-das-3-2-Touch-LCD

Dort ist nämlich die Rede vom Laden, von der SD Karte.

Fakt ist, ich möchte gerne eigene Grafiken auf das Display laden und diese später auch als Button benutzen, wenn möglich.

Und genau da benötige ich, wie kaum zu übersehen ist, Hilfe und Unterstützung.

Wie lege ich denn Bild-Dateien in dem Sketch Verzeichnis ab?!

Vorher müssen diese noch in ein anderes Format gebracht werden, so wie der Pinguin im Bsp. in Hex dargestellt wird. Wie schimpft sich das ?!

LG Crazy Rider

CrazyRider: Wie lege ich denn Bild-Dateien in dem Sketch Verzeichnis ab?!

Da ist doch ein Beispiel dazu dabei.

Man muss die Bilder mit diesem Tool konvertieren: http://www.rinkydinkelectronics.com/t_imageconverter565.php Und dann im Sketch Verzeichnis ablegen. Und das Array im Sketch als extern deklarieren. Genauso wie auch einen Font

Aber wie gesagt geht das nur bis 64kB Array Größe. Eigentlich ist es noch schlimmer. Die PROGMEM Daten können insgesamt nicht größer als 64kB sein. Dein Font fällt da also auch noch rein.

Für Buttons schau dir mal die UTFT Button Library an. Damit kannst du problemlos Button-Rahmen zeichnen ohne dass Speicher für Grafiken belegt wird: http://www.rinkydinkelectronics.com/library.php?id=61

Für Icons schau mal hier bei "various_symbols" nach ob was passendes für dich dabei ist: http://www.rinkydinkelectronics.com/r_fonts.php Das sind Fonts. Man setzt den entsprechenden SymbolFont, gibt an dass der Button ein Symbol ist und schreibst das Icon als Text auf den Button. Also z.B. "\x20" und "\x21" für die ersten zwei. Das ist sehr einfach. Das Array kürzt man dann besser so dass nur die Icons drin sind die man auch möchte. Ich habe mir daraus nur ein paar der Pfeile herausgenommen.

Kann aber auch sein dass die für dich zu klein sind. Die sind nur 16x16. Für ein 3,2" passt das gut. Aber bei 7" willst du vielleicht was größeres. Wenn du was eigenes brauchst, mach aus deinen Bildern vielleicht lieber einen Font als ein einzelnes Bild: http://www.rinkydinkelectronics.com/h_utft_fonts_101.php Den kannst du dann mit der Button Lib verwenden. Das Prinzip ist aber das gleiche. Der Font wird als Array im Flash abgelegt.

Was die Seite da mit SD Karte meint weiß ich nicht. Mit der Original UTFT geht das nicht. Die liest die Daten aus dem Flash Speicher.

EDIT: Hier hatte ich erst was falsches geschrieben

Es gibt TinyFat als Addon um Bilder von der SD Karte zu laden: http://www.rinkydinkelectronics.com/library.php?id=53 Das ist es was du brauchst wenn du größere Datenmengen hast. :)

Ich habe mitlerweile ein paar Buttons generieren und per Flash Speicher einladen können. Leider ist dieser wirklich nicht groß und mein Display schon, sodass ich jetzt von SD Karte laden wollte.

Ich scheiter aber schon an der Kompellierung des Bsp. Eingebunden werden soll die tinyFAT.h ( welche auch korrekt abgelegt ist) und die avr/pgmspace.h und bei der bin ich mir nicht sicher, ich habe gelesen, dass diese von Arduino gestellt wird. Aber ich finde sie nirgens auf der Platte und ich habe ein eindeutiges Problem mit einer Lib.

An pgmspace.h liegt es nicht. Die ist Teil der AVR libc und wird auch von der Arduino Core Software verwendet bevor du irgendwas machst.

Ich bekomme aber auch diesen Fehler:

Demo_Landscape.ino:21:21: fatal error: tinyFAT.h: No such file or directory

Komisch ... obwohl die .h ja vorhanden ist !

http://uploaded.net/file/j2o5b9u3 - Hier habe ich mal ein Bild mit den Ordnerstrukturen und dem Fehlercode.

OK. Geht doch. Man darf nicht UTFT_tinyFAT und tinyFAT verwechseln. Das sind zwei Libs und man braucht beide!

Also noch das installieren: http://www.rinkydinkelectronics.com/library.php?id=37

Danach geht es. Das heißt es kompiliert. Angezeigt wird irgendwie nichts :s Mal sehen

Ja das habe ich auch schon bemerkt, wie hast du die in der Ordnerstruktur abgelegt?

Ich habe nämlich beide installiert und leider immer noch kein Erfolg.

In dem Ordner UFTFT_tinyFAT und im Ordner tinyFAT ist jeweils die tinyFAT.h abgelegt, können die sich eventuell in die quere kommen?

Einfach die zip Dateien in den Libraries Ordner entpacken. Wie üblich.

Aber UFTFT_tinyFAT hat nur UTFT_tinyFAT.h

Richtig! Bin da wohl durcheinander gekommen. Also nochmal die beiden ZIP runtergezogen und im Sketch Ordner entpackt - kein Stück besser -.-*

Welche IDE nutzt du?

Ach ich Depp. Ich habe mein Display so umgebaut dass ich die Hintergrund Beleuchtung schalten kann. Und das mit einem PNP, der LOW-aktiv ist. Die muss ich jetzt natürlich auch immer Einschalten. Was in den Beispielen nicht gemacht wird. ARG! Jetzt geht es :)

Ich verwende 1.6.1

Habe jetzt auch umgesattelt auf 1.6.1 und siehe da, die Libs werden eingebunden 8)

Sketch laut kompiler zu groß ? Habe jetzt nix weiter angeschlossen, nur den Sketch Softwaremäßig kompiled um das Lib Problem auszuschließen.

Hast du auch das richtige Board ausgewählt? Standardmäßig wird das auf UNO stehen

Danke ! Natürlich bei neuer IDE neue Boardauswahl ... Schluss für heute :)

Das Beispiel “Landscape” läuft bei noch nicht so wie ich mir das vorstelle. Darf die Speicherkarte größer wie 2GB sein? Ich habe hier nämlich grad nur eine 4GB rumfliegen, nich das daran schon alles scheitert.

Ansonsten hab ich nur ein schwarzen Bildschirm. Initialisierung funktioniert, man sieht nmlich wie er den clean Befehl ausübt. Sobald ich die SD Karte raus ziehe, kommt die Fehlermeldung, dass er die geforderten Files nicht findet.

D.h. vorher wird er ja etwas gefunden haben oder hat sich beim “suchen” aufgehängt. ? !

CrazyRider: Darf die Speicherkarte größer wie 2GB sein?

Laut der TinyFAT Seite nicht:

The library supports FAT16 formatted SD cards up to 2GB in size. 4GB FAT16 formatted SD cards does not work.

Du kannst mal probieren sie kleiner zu formatieren, aber ich weiß nicht ob das geht.

Bilder von der SD Karte laden funktioniert soweit ! :)

Jetzt hätt ich noch gern die Bildchen als Buttons deklariert. Sodass ich die auch drücken kann, ansonten hab ich ja nur eine Art digitaler Bilderrahmen.

Jemand eine Idee oder einen Ansatz ?! Ich steh da grad aufm Schlauch, hab schon einiges Probiert. Leider erfolglos.

Könnte ich einfach ein Viereck zeichnen, welches mein gewünschtes Bild umschließt und das "innere" als Button deklarieren?!

LG CrazyRider

Wieso schaust dir nicht erst mal an wie Buttons grundlegend funktionieren? Die Libraries sind doch sehr gut dokumentiert und haben zig Beispiele dabei. Dann entwickle dein Konzept so wie das die Libraries erwarten und nicht so wie du denkst was sie machen sollen.

Entweder du machst die Buttons per Hand wie im UTouch_ButtonTest Beispiel. Da fragt man einfach ab ob die gedrückten Koordinaten innerhalb der Koordinaten eines Rechtecks sind.

Dann gibt es die UTFT_Button Library, die das für dich übernimmt und die Logik in Button Objekten kapselt. Das macht den Code viel übersichtlicher

Wenn du das machst:

myButtons.setButtonColors(VGA_WHITE, VGA_GRAY, VGA_WHITE, VGA_RED,VGA_BLACK);

myButtons.addButton( 10,  20, 300,  30, "");
myButtons.drawButtons();
  
myGLCD.print("Test", 50, 25);

Dann wird der Text durch das Drücken des Buttons nicht geändert (da nur der Rahmen neu gezeichnet wird). Wenn man statt dessen nach dem Zeichnen der Buttons die Bilder drüber zeichnet sollte das genauso sein. Ist aber nur eine Vermutung. Mit Bildern habe ich es nicht ausprobiert.

Was dich vielleicht stören könnte ist dass hierbei die Ecken des Buttons rund sind. Das würde nerven wenn du die Button Fläche vollständig mit einem Bild ausfüllen willst. Das kann man aber in der Library ändern, wenn man in drawButton() und checkButtons() drawRoundRect() durch drawRect() ersetzt

Ja ich hatte vorhin nicht die Zeit mich an PC zu setzen, wollte nur mal eine Zweitmeinung hören.

Mit der Abfrage der Koordinaten des eingefügten Bilds klappt es genauso wie ich es benötige !