Probleme mit darstellung eines Bildes auf ein Oled Display

Hey,

ich wollte ein Bild auf ein SSD1306 Oled Display anzeigen lassen. Habe es mit LcdAssistant convertiert, allerdings wird nur müll angezeigt. Nach ein wenig goggeln, hab ich herrausgefunden, das die .bmp nicht in Hex sondern in binär convertiert werden muss. Auf einer anderen seite stand, das es egal sei, ob hex oder binär.

Weis wer weiter?

Hier mal mein Code:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_CS 2 // CS
#define OLED_DC 3 // DC
#define OLED_RESET 4 // RST
#define OLED_MOSI 5 // D1
#define OLED_CLK 6 // D0
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

static unsigned char PROGMEM logo16_glcd_bmp[] = { 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x60, 0x38, 0x4C, 0x76, 0x7B, 0x7D,
0x7D, 0x3D, 0x0D, 0x65, 0x79, 0x7D, 0x7D, 0x7D, 0x3D, 0x1D, 0x65, 0x71, 0x7D, 0x7D, 0x7D, 0x3D,
0x8D, 0xE1, 0x7D, 0x1F, 0x00, 0x00, 0x80, 0xC0, 0x60, 0xB8, 0xCC, 0xC6, 0xD1, 0xDC, 0xDE, 0xDF,
0x1F, 0x8F, 0x87, 0xD9, 0xDC, 0xDF, 0xDF, 0x5F, 0x9F, 0xC7, 0xD1, 0xDC, 0xDE, 0x5F, 0x1F, 0x8F,
0xE7, 0x71, 0x3C, 0x0F, 0x07, 0x01, 0x00, 0x00, 0x3C, 0x27, 0x29, 0x2C, 0x2E, 0x2F, 0x2F, 0x2F,
0x2F, 0x27, 0x23, 0x28, 0x2E, 0x2F, 0x2F, 0x2F, 0x2F, 0x23, 0x28, 0x2E, 0x2F, 0x2F, 0x2F, 0x27,
0x31, 0x1C, 0x0E, 
};


void setup()
{
  Wire.begin();
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay(); 
}

void loop()
{ 
  display.drawBitmap(10, 40,  logo16_glcd_bmp, 36, 22, 1);
  display.display();
}

Wenn es sich bei den Bilddaten tatsächlich um das Windows BMP Format handelt, kann das nicht von drawBitmap ausgegeben werden. drawBitmap erwartet ein einfaches Array mit Rohdaten. Ich würde da eher XBM benutzen (das beispielsweise mit gimp erzeugt werden kann).

Grüße, Oliver

Geht leider immer noch nicht.

Hier mal das Bild, was angezeigt werden soll.

module_anzeige_3.bmp (238 Bytes)

Gibt es denn keine Anleitung, in der drawBitmap erklärt wird? Wenn nicht, hier noch zwei Ideen, woran es liegen könnte. 1) Die Breite des Bildes ist nicht durch 8 teilbar. Ich würde die Breite (in GIMP) auf 40 erhöhen. Das würde zumindest einige Fehlerquellen ausschließen. 2) Die Interpretation der Bits in einem Byte: Die kann natürlich genau falsch herum sein. Hier wäre es 'mal interessant zu sehen, was auf dem OLED dargestellt wird.

Ganz andere Alternative wäre auch u8glib... Eine Bitmap als XBM aus GIMP abgespeichert, sollte problemlos dargestellt werden: http://code.google.com/p/u8glib/source/browse/sys/arduino/XBM/XBM.pde Dokumentation: http://code.google.com/p/u8glib/wiki/userreference#drawXBM

Oliver

Habe mal ein grösseres bild genommen, was 80 x 40 Pixel war. Aber dies wird auch nicht richtig dargestellt. Es sieht aus, als ob das Bild 3 mal nebeneinander überlappend dargestellt wird.

Nimm doch einfach mal zwei for-Schleifen für x und y und schreibe einige monochome oder bunte Pixel live. Damit bekommst du die Struktur des Bildspeichers heraus und dann verstehst du auch, wie die Daten statischer Bilder aufgebaut sein müssen …

Erst mal Thanks an alle. Es funktioniert nun. Die Adafruit_SSD1306.h scheint ein fehler zu haben. Mit einer anderen SSD1306.h gehts nun :)

Auch der tipp mit dem durch 8 teilbar, war super.

Die Bilder werden nun richtig angezeigt, allerdings läst sich kein text darstellen. Irgendwie funktioniert der print befehl nicht. Könnte sich das jemand mal anschauen, und mir sagen, was ich zb. ändern muss, damit das Bild richtig dargestellt wird, bzw mir sagt, was in der anderen Lybery hinzufügen muss, damit print funktioniert.

Am Bild selbst, kann es defenetiv nicht liegen, da es in der _TE richtig dargestellt wird.

Im Anhang eine Zip mit folgenden inhalt:

Datei 1: Laderegler (Text geht, Bilder werden falsch dargestellt - inklu. Leibery)
Datei2: Laderegler_TE (Bilder werden richtig dargestellt, aber kein text - inklu. Leibery)

Laderegler.zip (29.9 KB)

Bild 003.jpg

Bild 005.jpg

Hallo.

Suche ebenfalls eine library für das ssd1306 0.9" Oled Display. Hab beide mal ausprobiert. Auch im www hab ich bis jetzt nix funktionierendes gefunden. Dein problem liegt darin, das Print nicht defeniert ist.

Versuch es mal mit void print(); in der SSD1306.h

Allerdings weis ich auch nicht genau, was weiter dazu rein muss, vieleicht kann ein Experte mehr Licht ins dunkle bringen. Habe zwar ein bisschen probiert, aber erfolg hatte ich bis jetzt nicht.

Gruss Tim.

Welche Lib's hat Du denn ausprobiert (Bitte auch immer der Link angeben)? Sowohl die Adafruit Lib als auch U8glib unterstützen den Print Befehl. Es mag auch an deinem Code liegen. Hier würde auch immer ein Code Beispiel helfen.

Oliver