U8g2, Bitmap funktioniert nicht

Hallo zusammen,
ich will eine Bitmap auf einem 128x64 OLED Display darstellen, sie wird jedoch nicht richtig angezeigt.
Hier ist der Code:

# include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

int BildschirmBreite = u8g2.getDisplayWidth();
int BildschirmHoehe = u8g2.getDisplayHeight(); 


# define SmileyBreite 64
# define SmileyHoehe 34
static unsigned char Smiley[] PROGMEM = {
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00111111,B10000000,B00000000,B00000000,B01111111,B00000000,B00000000,
  B00000000,B11111111,B11100000,B00000000,B00000001,B11111111,B11000000,B00000000,
  B00000001,B11111111,B11110000,B00000000,B00000011,B11111111,B11100000,B00000000,
  B00000001,B11111111,B11110000,B00000000,B00000011,B11111111,B11100000,B00000000,
  B00000011,B11111111,B11111000,B00000000,B00000111,B11111111,B11110000,B00000000,
  B00000011,B11111111,B11111000,B00000000,B00000111,B11111111,B11110000,B00000000,
  B00000011,B11111111,B11111000,B00000000,B00000111,B11111111,B11110000,B00000000,
  B00000111,B11111111,B11111100,B00000000,B00001111,B11111111,B11111000,B00000000,
  B00000111,B11111111,B11111100,B00000000,B00001111,B11111111,B11111000,B00000000,
  B00000111,B11111111,B11111100,B00000000,B00001111,B11111111,B11111000,B00000000,
  B00000111,B11000000,B01111100,B00000000,B00001111,B10000000,B11111000,B00000000,
  B00000110,B00000000,B00001100,B00000000,B00001100,B00000000,B00011000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
};

void setup()
{
  
  
  
  u8g2.begin();

  
  u8g2.setContrast(255);
}

void loop()
{
  
  u8g2.setDrawColor(1);

  
  u8g2.firstPage();
  do
  {
    u8g2.drawXBM(40, 10, SmileyBreite, SmileyHoehe, Smiley);
  }
  while (u8g2.nextPage());
  delay(2000);

}

Hier noch ein Bild:

Liebe Gr├╝├če ( :

Bist Du sicher, das das stimmt?
Versuch mal

U8G_PROGMEM

Es funktioniert immer noch nicht ...

Dann fang doch mal mit einem ganz kleinen Ansatz an.

Hallo,

das Array hat 8 x 34 Bytes. Also eine Bit- bzw. Pixelbreite von 8x8, deine 64 Pixel.
Die draw Funktion wird sicherlich bei Pixel Koordinate 40,10 anfangen zu zeichnen.
Dadurch wird es vermutlich eine Verschiebung der Darstellung geben. Vermutlich solltest du bei 0,0 anfangen.
Ausprobieren oder erstmal andere Bsp. austesten.
Oder nimmst eine kleine ├╝berschaubare Bit/Pixelfolge und spielst mit der draw Funktion rum und schaust wo das wie gezeichnet wird.

Nach dieser Beschreibung w├╝rde ich die Verwendung von drawXBMP empfehlen.

u8g2.drawXBMP(40, 10, SmileyBreite, SmileyHoehe, Smiley);

Gru├č Walter

drawXBM ist schon richtig und macht er ja auch...

Es scheint immer wieder mal auch diverse Probleme mit der Konvertierei zu geben.
Oder mit den Displays.

Siehe auch hier:

u8g2_DrawXBMP

Ein Versuch mit dem extra P kann ja nicht schaden.

keiner von euren Tipps funktioniert ):
kann es sein, dass das Display fehlerhaft ist?!

Was heisst das?

Ist nicht auszuschliessen, aber das ist eher ein Konfigurations- als Funktionsproblem.
Von daher sage ich mal nein.

Gib doch einfach mal einen Punkt/Linie auf dem Display aus, um die Funktion zu testen.
Warum initialisierst Du SW-I2C? Du hast doch wohl Hardware-I2C.

Gru├č Tommy

Neben dem von Tommy56:
Es gibt ein example. Geht / geht nicht?

Dann steuere ich mal einen Tipp dazu:

grafik

Das _F_ steht f├╝r full buffer, Du nutzt aber nextPage(), was nicht harmoniert. Au├čerdem scheinst Du Hardware-I2C zu nutzen, gibst aber _SW_ an.

Das eigentliche Problem ist aber, da├č Du mit den Bits "malst", was mit dem verwendeten Format aber nicht ├╝bereinstimmt. Beispiel B00000110 mu├č B01100000, also in vertauschter Reihenfolge. So habe ich das Bild erzeugt (getestet mit Nano):

#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

#define SmileyBreite 64
#define SmileyHoehe 34
static const unsigned char Smiley[] U8X8_PROGMEM = {
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B11111100,B00000001,B00000000,B00000000,B11111110,B00000000,B00000000,
  B00000000,B11111111,B00000111,B00000000,B10000000,B11111111,B00000011,B00000000,
  B10000000,B11111111,B00001111,B00000000,B11000000,B11111111,B00000111,B00000000,
  B10000000,B11111111,B00001111,B00000000,B11000000,B11111111,B00000111,B00000000,
  B11000000,B11111111,B00011111,B00000000,B11100000,B11111111,B00001111,B00000000,
  B11000000,B11111111,B00011111,B00000000,B11100000,B11111111,B00001111,B00000000,
  B11000000,B11111111,B00011111,B00000000,B11100000,B11111111,B00001111,B00000000,
  B11100000,B11111111,B00111111,B00000000,B11110000,B11111111,B00011111,B00000000,
  B11100000,B11111111,B00111111,B00000000,B11110000,B11111111,B00011111,B00000000,
  B11100000,B11111111,B00111111,B00000000,B11110000,B11111111,B00011111,B00000000,
  B11100000,B00000011,B00111110,B00000000,B11110000,B00000001,B00011111,B00000000,
  B01100000,B00000000,B00110000,B00000000,B00110000,B00000000,B00011000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
  B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
};
void setup()
{
  u8g2.begin();
}

void loop()
{
  u8g2.firstPage();
  do
  {
    u8g2.drawXBMP(10, 10, SmileyBreite, SmileyHoehe, Smiley);
  }
  while (u8g2.nextPage());
  delay(2000);
}

Ist dieser Tipp besser?

Ja, dass hat geklappt.
danke f├╝r eure Antworten.

Freut mich, danke f├╝r die R├╝ckmeldung :slightly_smiling_face:

Bei mir funktioniert es nicht .
Es wird weiter das angezeigt , was vorher auf dem Display zu sehen war.

Dann wird das Display nicht beschrieben.

Bei mir sieht es so aus:

grafik

welches Format muss ich nutzen, dass ich nicht alles "umdrehen" muss?

Ich w├╝rde nicht das Format ├Ąndern, sondern einen XBM-Editor suchen:

1 Like