PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Read a ByteArray from SD Card Txt.File and Draw Bitmap with Ug8



Lord Integer
14.09.2020, 15:05
Hey Leute,

in meinem aktuellen Projekt möchte ich ein BitmapArray (konvertiertes Image) von einer SD Karte (benutzt wird ein SD- Kartenmodul) lesen und mit einem Oled Display 128*64 Pixel über I2C anzeigen.

Ich habe auf einer SD- Karte eine Textdatei eingefügt, in der sich der Inhalt von einem const uint8_t myImage[] Array befindet. Das Array entstand durch den Konverter LCDAssistant.exe .



const uint8_t image[] PROGMEM =
{
0x00, 0x00, 0x7F,......
}


Jetzt zu meinem Problem, wie konvertiere ich die Textdatei in const uint8_t []?
Beste Grüße.

Hier mein Code:


#include <SPI.h>
#include <SD.h>
#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //erzeugen des Display Objektes
File myFile;
const uint8_t myImage[] PROGMEM;
void setup()
{
InitOLED();

// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
pinMode(10, OUTPUT); CS pin

if (!SD.begin(4)) {
Serial.println(F("initialization failed!"));
return;
}
Serial.println(F("initialization done."));
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile)
{
// read from the file until there's nothing else in it:
while (myFile.available())
{
Serial.write(myFile.read());

//Clear Byte Array
memset(myImagerArray, 0, sizeof(myImage));
/*+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++ WIE KONVERTIERE ich was ich auslesen zu einem Byte Array ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++*/
myImage = myFile.read();
/*+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++ */
do //Draw Image Oled
{
u8g.drawBitmapP( 0, 0, 16, 64, myImage); //Die 16 kommt zu stande aus Width 128 dividiert durch 8
} while(u8g.nextPage());
delay(2000);
}
myFile.close();
} else
{
Serial.println(F("error opening test.txt."));
}
}

void loop()
{
// nothing happens after setup
}


void InitOLED()
{
//pinMode(9, OUTPUT); // sets the digital pin 13 as output
clearOLED();
// assign default color value
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
{
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
{
u8g.setColorIndex(3); // max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW )
{
u8g.setColorIndex(1); // pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR )
{
u8g.setHiColorByRGB(255,255,255);
}
}

void clearOLED()
{
u8g.firstPage();
do
{
}
while(u8g.nextPage());
}


Textdatei test.txt :


0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8,
0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0,
0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xFF, 0xFF, 0xFF, 0xFE, 0x1F, 0xFF, 0xF0,
0x00, 0x00, 0x00, 0x00, 0xF0, 0x1E, 0x0E, 0x0F, 0x00, 0xE1, 0x0E, 0x0C, 0x38, 0x0F, 0xFF, 0xE0,
0x00, 0x00, 0x00, 0x00, 0x70, 0x1E, 0x04, 0x0E, 0x00, 0xE1, 0x0E, 0x0C, 0x30, 0x07, 0xFF, 0xE0,
0x00, 0x00, 0x03, 0x18, 0x70, 0x1E, 0x04, 0x0E, 0x10, 0xE1, 0x0E, 0x04, 0x30, 0x87, 0xFF, 0x80,
0x00, 0x00, 0x0F, 0x08, 0x70, 0x1E, 0x04, 0x0E, 0x18, 0xE1, 0x0E, 0x04, 0x30, 0xC7, 0xFF, 0x80,
0x00, 0x00, 0x3F, 0x03, 0xE1, 0x1E, 0x04, 0x0E, 0x07, 0xE1, 0x0E, 0x04, 0x30, 0xFF, 0xFE, 0x00,
0x00, 0x00, 0xFF, 0x01, 0xE1, 0x0E, 0x24, 0x0F, 0x03, 0xE1, 0x0E, 0x04, 0x30, 0x07, 0xFC, 0x00,
0x00, 0x01, 0xFF, 0xC0, 0xE1, 0x0E, 0x20, 0x0F, 0x80, 0xE1, 0x0E, 0x20, 0x30, 0x07, 0xF0, 0x00,
0x00, 0x07, 0xFF, 0xF0, 0x61, 0x0C, 0x20, 0x8F, 0xE0, 0xE1, 0x0E, 0x20, 0x30, 0xC7, 0xE0, 0x00,
0x00, 0x0F, 0xFF, 0x18, 0x61, 0x0C, 0x20, 0x8E, 0x10, 0xE1, 0x0E, 0x20, 0x30, 0xC7, 0x80, 0x00,
0x00, 0x1F, 0xFF, 0x18, 0x41, 0x0C, 0x20, 0x8E, 0x18, 0xE1, 0x0E, 0x20, 0x30, 0x86, 0x00, 0x00,
0x00, 0x3F, 0xFF, 0x00, 0x43, 0x8C, 0x20, 0x86, 0x00, 0xE0, 0x0E, 0x30, 0x30, 0x00, 0x00, 0x00,
0x00, 0x7F, 0xFF, 0x00, 0xC3, 0x84, 0x30, 0x87, 0x00, 0xF0, 0x1E, 0x30, 0x38, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xC1, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0xF8, 0x7F, 0xFF, 0xFE, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00,
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00,
0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

HaWe
14.09.2020, 16:37
verstehe ich jetzt nicht ganz -
willst du etwa Daten von SD in dein const uint8_t image[] PROGMEM einlesen?
oder was hat das eine mit dem anderen zu tun?
const ist const, also schreibgeschützt.

Oder willst du nur gelesene Daten zu uint8_t casten?
das geht per explizitem type casting, z.B.
(uint8_t)myFile.read()

- - - Aktualisiert - - -

PS,
außerdem ist das Arduino C++ Code, gehört also besser ins Arduino Unterforum.

Lord Integer
14.09.2020, 16:40
Hi,
ups ja natürlich darf da nicht const stehen.
Ich will gelesene Daten zu einem uint8[] casten.

Die Funktion braucht ein Byte Array in der Eingabe(myImage) => Hier zu sehen:u8g.drawBitmapP( 0, 0, 16, 64, myImage);

siehe: void U8GLIB::drawBitmapP(u8g_uint_t x, u8g_uint_t y, u8g_uint_t cnt, u8g_uint_t h, const u8g_pgm_uint8_t *bitmap)

Das Problem ist ja , ich habe eine Textdatei auf der SD-Karte, die muss das Byte Array des Bildes enthalten. Dieses Byte Array muss irgendwie in die Funktion drawBitmapP.

Die Frage ist ja wie kann man das direkt Casten?

Normlerweise wird das ByteArray direkt im Sketch abgelegt und bei drawBitmap verwendet.(siehe folgenden Sketch)


U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8); // SPI communication: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8

const uint8_t rook_bitmap[] U8G_PROGMEM = {
0x00, // 00000000
0x55, // 01010101
0x7f, // 01111111
0x3e, // 00111110
0x3e, // 00111110
0x3e, // 00111110
0x3e, // 00111110
0x7f // 01111111
};

void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.drawBitmapP( 0, 0, 1, 8, rook_bitmap);
}

void setup(void) {
}

void loop(void) {
// picture loop
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );

// rebuild the picture after some delay
delay(1000);
}


Oder muss ich die ganze Textdatei auslesen und jeden Wert mit der Trennung Komma nacheinander auslesen,casten in uint8_t und einem ByteArray hinzufügen?

Ich weiß nicht genau wie ich das mache soll ... Oder gibt es eine bessere Lösung?

Ich habe nämlich 34 Bilder, die ich später nacheinander auf dem Oled abspielen möchte. Da ich aber einen Arduino nano (32 kb memory) verwende und mein Sketch nicht klein ist , habe ich nur noch 7 kb frei. Deswegen kam mir die Idee , alle Bilder auf eine SD Karte zu speichern und diese dann nacheinander einzulesen.

HaWe
14.09.2020, 16:56
da muss jetzt jemand 'ran, der weiß, was
myFile.read()
tatsächlich als gelesene Variable zurückgibt, ein char, ein int oder einen String.
wenn es einzelne char oder int in dieser Form liest, kannst du es in der genannten Form casten, wenn es ein String wäre, musst du ihn erst in eine Zahl umwandeln.
Arduino benutzt sonst auch eher "byte" statt "uint8_t".
Aber weil ich auch die Grafik-lib nicht kenne, gebe ich hier an andere ab.

- - - Aktualisiert - - -

PS,
evt kannst einen byte array als buffer definieren (ohne const)
byte (oder uint8_t) bitmapbuffer [128*64]; // bzw. kleiner, so groß wie halt mindestens nötig
und dann liest du erst dorthin byte-weise alle file Daten ein,
und anschließend liest du das Bild von dort genau wie sonst aus dem progmem.

Moppi
12.10.2020, 08:56
Oder muss ich die ganze Textdatei auslesen und jeden Wert mit der Trennung Komma nacheinander auslesen,casten in uint8_t und einem ByteArray hinzufügen?

Ich weiß nicht genau wie ich das mache soll ... Oder gibt es eine bessere Lösung?

Ich habe nämlich 34 Bilder, die ich später nacheinander auf dem Oled abspielen möchte. Da ich aber einen Arduino nano (32 kb memory) verwende und mein Sketch nicht klein ist , habe ich nur noch 7 kb frei. Deswegen kam mir die Idee , alle Bilder auf eine SD Karte zu speichern und diese dann nacheinander einzulesen.

Das TEST.TXT ist ein Problem.
Wenn Du Bilder speichern willst, die abgespielt werden sollen, speichere die nicht so in dieser Form! - Warum? - Weil Du die Daten, während des Ladens von der SD-Karte, übersetzen/umwandeln musst. Vielleicht gibt es Bibliotheken für so was, langsam ist es trotzdem. Zeit, die unnötig verbraten wird.
Das bedeutet, dass Du die Textdatei einliest, die Daten umwandelst und am Ende in die Datei zurückschreibst (z.B.).
Das kannst Du ja beim ersten mal Auslesen machen. Dort stellst Du fest, dass die Daten in Textform vorliegen und wandelst die Datei zunächst um.
Beim nächsten Einlesen sind die Daten im richtigen Format, nämlich als Bytes, gespeichert. Jedes physische Byte wird in der Textdatei durch 6 Bytes abgebildet (inkl. Komma und Leerzeichen). Dafür musst Du 6x so viele Daten lesen, wie notwendig. Du könntest in derselben Zeit vermutlich etwa 6 Bilder laden, anstatt einem.

Wenn Du ein Filesystem hast, dann sollte .read() ein Byte liefern. Du könntest die Datei einfach in einer Schleife Byte um Byte auslesen und in einem Array ablegen.
Beim Umwandeln kannst Du auch Byte um Byte auslesen, in ein Char-Array vermutlich. Dann liest Du so lange, bis Du auf ein Komma triffst, dieses ignorierst Du dann, ebenso, wie das Leerzeichen.
Nachdem Du das Lesen beim Komma unterbrochen hast, hast Du in dem Array z.B. stehen: "0x00", als Text. Der muss dann noch konvertiert werden (klick mich! (https://www.roboternetz.de/community/entries/487-Hex-String-zu-Byte-umwandeln)).