Zur Info: Normalerweise programmiere ich VB oder VBA und versuche mich gerade mit C++ für Arduino zu beschäftigen.
Ich habe vor, Bitmaps im RGB565 Format von einer SD-Karte in eine Teensy zu laden und dann anzuzeigen.
Anzeigen einer Bitmap aus dem Programmspeicher hat schon geklappt.
Ein Text-File konnte ich auch schon auf SD abspeichern und neu einlesen.
Was ich nun also will ist, dass ich 16Bit Daten direkt in ein Array lesen könnte, das
zum Anzeigen des Bildes verwendet wird.
Natürlich könnte ich das als Textfile irgendwie einlesen, und jeden Wert einzeln
in das Array schreiben. Das finde ich aber nicht besonders effizient.
Was ich also bräuchte, wäre ein File, in dem die Daten Byte für Byte stehen, oder sollte
ich besser sagen Word hinter Word. Ohne CR oder LF.
Dieses File müsste ich dann in ein int Array lesen können, das ich dann direkt
als Bild anzeigen würde.
Was ich jetzt nicht verstehe: Kann die SD.Read Funktion nur Bytes lesen, oder kann sie auch Ints ? Oder muss ich parseInt() verwenden, um aus den Bytes Ints zu machen?
Lohnt es sich überhaupt, meine Daten binär einzulesen, oder mache ich mir da zu viele Gedanken, und könnte genau so gut Text einlesen und konvertieren? Dann hätte ich aber z.B. irgendwelche Kommas, oder Semikolons oder CRs und LFs.
Oder gibt es sowieso schon eine Library, mit der man Bitmaps direkt einlesen und anzeigen kann?
wenn man etwas nicht kann, aber braucht, dann sollte man es schnell lernen und können.
für Bitmap empfehlt sich natürlich Texte zu meiden, Zahlen so zu speichern wie sie im RAM sind. ach und Einlesen könnte man auch direct ins RAM.
du braucsht ja nur jeweils ein Byte lesen, wenns das HiByte ist um 8 bit nach links shiften, das nächste Byte lesen, verodern, fertig ist das erste int
weiter zum nächsten aufnehmenden int (bzw. die nächsten zwei Byte aus dem File)
bis zum Ende vom File.
Wobei man sich Gedanken machen könnte: was machst mit dem Daten im Array.
Vermutlich kannst es sogar gleich irgendwohin ausgeben/ins Ziel streamen.
Das wäre natürlich toll. Ich bauche für ein RGB Display von 128*160 RGB565 Daten. Also Ints. Je schneller ich die da rein schieben kann, umso besser. Allerdings habe ich dazu schon eine eine Funktion, der man die Bitmap übergeben kann.
Wenn du der Meinung bist, dass es vieleicht mehr als ein RGB Display und vieleicht mehr als nur eine Lib dazu gibt, dann wäre es halt schon irgendwie cool, wenn du vieleicht auch konkret schreibst welches Display, welche lib, wie schaut ein kleiner Demo-Sketch aus, was bietet die Lib alles an Funktionen ...
Wenn die obige Antwort aber auch schon gereicht hat - dann passt es natürlich auch.
Es sind ja 160 * 128 Pixel. Pro Pixel sind es ein Word oder halt 2 Byte
160 x 128 x 2=40960 Byte oder 20480 Words
40960 / 512 = 80 Blöcke. Das geht restlos auf.
Meinst du jetzt, dass ich 80 mal 512 Bytes abrufen soll, und diese dann
anschließend in ein Word-Array schreiben, oder verstehe ich da etwas falsch?
Nö, hast Du schon richtig verstanden.
Hat Dein Teensy genug RAM?
Der Teensy ist ein 32-Bit-Prozessor. Da ist ein "normales" int 32 Bit groß. Du musst also für das Array den passenden Datentyp wählen (z.B. uint16_t)
Ich habe keinen Teensy im Einsatz, kann also nur allgemein antworten.
Stimmt zwar, dass für 1 Byte ein ganzer Sektor (512 Byte) gelesen wird, aber mehr als 1 Sektor, oder über eine Sektorgrenze hinweg, sollte read(byte* buf, sizeof len); auch können.
Wobei intern alles auf eine Serie von bytes (Stream) hinausläuft.
Aber die andere Frage (ob es sich lohnt, den Overhead Text zu UInt zu vermeiden) ist auch berechtigt.
Ist eher die Frage, wie die Bitmap auf die SD-Karte kommt. Warum nicht das .bmp Format verwenden? Und eventuell erstmal nur die 1 Variante realisieren (die dein Lieblings-bmp Programm im einfachsten Fall erzeugt).
Bis jetzt hatte ich z.B. mit Gimp ein passend großes BMP erzeugt. Dieses habe ich dann mittels eines Online-Konverters in RGB565 konvertiert, was man als Programmcode eben in den Code einfügen kann. Das war dann ein Array (image) das ich mit tft.drawRGBBitmap(x, y, image, w, h); zum Display schickte. Das hat ganz gut funktioniert.
Jetzt will ich halt etwas dynamischer sein, und die Bilder von der SD Karte lesen.
Es geht ja immer irgendwie um Zeit und Speicherplatz.
Am sinnvollsten wäre natürlich, wenn auf der SD-Karte nur Bytes hintereinander angeordnet wären. Beim Lesen müsste man dann je zwei Bytes "gleichzeitig" lesen und direkt zum Display schicken können.
Leider war die normalerweise verfügbare Bibliothek zum Anzeigen von Farbbildern nicht für Teensy angepasst. Nachdem ich das irgendwie hingebracht hatte, hat die Anzeige ganz gut funktioniert.
Ich erwarte praktisch schon die nächsten Fallsstricke, wo man denkt, was ist jetzt schon wieder los...
Darum halt die Fragen, wie man das am besten löst.
Als Anfänger nerven solche Sachen halt, weil man dann erst mal auf dem Schlauch steht, und sich wundert, warum das nicht so funktioniert wie man es erwartet/irgendwo gelesen hat.
Verrate doch was für TFT das ist und welche Bibliothek du nutz
Für TFT Displays 128 * 160 gibt's mehrere Lib je nach dem was für Treiber drauf ist
ZB der ST7735 gibt es in ST7735, ST7735S, Displays mit grünen, roten Tab usw.
Im Umlauf sind ach 128 * 160 Displays mit ILI9225 und anderen.