Arduino Lektion 78: 128×64 Pixel, 1,3″ OLED Display

In diesem Tutorial möchte ich das 128×64 Pixel, 1,3″ OLED Display für den Arduino vorstellen.

1,3" OLED Display
1,3″ OLED Display

Das Display wird mit einer 4er Pinleiste geliefert welche noch angelötet werden muss.

1,3" Display - Pinleiste anlöten
1,3″ Display – Pinleiste anlöten

Bezug

Das Display kann für ca. 3,5€ inkl. Versandkosten aus China bei ebay.de bestellt werden. 

Technische Daten des Displays

  • Auflösung 128x64Pixel
  • Größe 1,3″
  • Controller SSH1106
  • Betriebsspannung 3,3V bis 5V
  • Umgebungstemperatur -40°C bis +70°C

Anschluss & Schaltung

Das Display verfügt über 4 Pins welche mit GND, VCC, SCL und SDA bezeichnet sind.

DisplayArduino Leonardo
GNDGND
VCC5V
SCLA4 oder SCL
SDAA5 oder SDA

Der Arduino UNO und Leonardo verfügen neben den analogen Pins A4 & A5 auch über separat hinausgeführte SCL & SDA Pins.

Beschriftung der SCL & SDA Pins auf der Rückseite des Arduino UNOs
Beschriftung der SCL & SDA Pins auf der Rückseite des Arduino UNOs
Schaltung - 1,3" OLED Display am Arduino UNO
Schaltung – 1,3″ OLED Display am Arduino UNO
Arduino Leonardo mit 1,3" OLED Display
Arduino Leonardo mit 1,3″ OLED Display

Quellcode

Für den Betrieb des Displays verwende ich die Adafruit Bibliothek SSD1306 in der Version 1.2.9. Die Bibliothek kann über den „Bibliotheksverwalter“ installiert werden.

Bibliothek - Adafruit SSD1306 von Adafruit
Bibliothek – Adafruit SSD1306 von Adafruit

Zusätzlich wird die GFX Bibliothek von Adafruit benötigt.

Bibliothek - Adafruit GFX Library von Adafruit
Bibliothek – Adafruit GFX Library von Adafruit

Nachdem beide Bibliotheken installiert wurden (ein Neustart ist nicht notwendig) kann mit der Entwicklung begonnen werden.

Beispiele zur Bibliothek „U8glib“

Der Bibliothek liegen einige Beispiele bei welche die Funktionen der Bibliothek sehr gut beschreiben. 

Arduino IDE - Beispiele der Bibliothek U8glib
Arduino IDE – Beispiele der Bibliothek U8glib

Die Bibliothek kann für mehrere Displays verwendet werden und daher muss man sich aus einer (wahnsinnig) langen Liste erst einmal sein Display heraussuchen und konfigurieren.

// setup u8g object, please remove comment from one of the following constructor calls
// IMPORTANT NOTE: The following list is incomplete. The complete list of supported 
// devices with all constructor calls is here: https://github.com/olikraus/u8glib/wiki/device
//U8GLIB_NHD27OLED_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD27OLED_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD27OLED_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD27OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_NHD31OLED_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGS102 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM132 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM128 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGM128_2X u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_128X64_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_128X64_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_192X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_192X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_192X32_1X u8g(13, 11, 10);	// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10
//U8GLIB_ST7920_192X32_4X u8g(10);		// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_ST7920_202X32_4X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_LM6059 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_LM6063 u8g(13, 11, 10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_BW u8g(10, 9);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_2X_BW u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_KS0108_128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 14, 15, 17, 16); 		// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs1=14, cs2=15,di=17,rw=16
//U8GLIB_LC7981_160X80 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_LC7981_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_LC7981_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7,  18, 14, 15, 17, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=14 ,di=15,rw=17, reset = 16
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 );  			// 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED)
//U8GLIB_SSD1306_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI 
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send AC
//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_ADAFRUIT_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_128X32 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_128X32 u8g(10, 9);             // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
//U8GLIB_SSD1306_64X48 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_64X48 u8g(10, 9);             // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_64X48 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
//U8GLIB_SH1106_128X64 u8g(13, 11, 10, 9);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SH1106_128X64 u8g(4, 5, 6, 7);	// SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new blue HalTec OLED)
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);	// I2C / TWI 
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);	// Dev 0, Fast I2C / TWI
//U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send ACK
//U8GLIB_SSD1309_128X64 u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1327_96X96_GR u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_SSD1327_96X96_2X_GR u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_UC1611_DOGM240 u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_UC1611_DOGM240 u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1611_DOGM240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_UC1611_DOGM240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_UC1611_DOGM240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16
//U8GLIB_UC1611_DOGXL240 u8g(U8G_I2C_OPT_NONE);	// I2C
//U8GLIB_UC1611_DOGXL240 u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1611_DOGXL240 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_UC1611_DOGXL240 u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 3, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, cs=3, di/a0=17,rw=16
//U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_NHD_C12832 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_LD7032_60x32 u8g(13, 11, 10, 9, 8);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_LD7032_60x32 u8g(11, 12, 9, 10, 8);	// SPI Com: SCK = 11, MOSI = 12, CS = 9, A0 = 10, RST = 8  (SW SPI Nano Board)
//U8GLIB_UC1608_240X64 u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64 u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(13, 11, 10, 9, 8);	// SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64 u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_UC1608_240X64_2X u8g(10, 9, 8);	// HW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RST = 8
//U8GLIB_T6963_240X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_T6963_128X128 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_T6963_240X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_T6963_128X64 u8g(8, 9, 10, 11, 4, 5, 6, 7, 14, 15, 17, 18, 16); // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7, cs=14, a0=15, wr=17, rd=18, reset=16
//U8GLIB_HT1632_24X16 u8g(3, 2, 4);		// WR = 3, DATA = 2, CS = 4
//U8GLIB_SSD1351_128X128_332 u8g(13, 11, 8, 9, 7); // Arduino UNO: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_332 u8g(76, 75, 8, 9, 7); // Arduino DUE: SW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_332 u8g(8, 9, 7); // Arduino: HW SPI Com: SCK = 13, MOSI = 11, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_HICOLOR u8g(76, 75, 8, 9, 7); // Arduino DUE, SW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (http://electronics.ilsoft.co.uk/ArduinoShield.aspx)
//U8GLIB_SSD1351_128X128GH_332 u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)
//U8GLIB_SSD1351_128X128GH_HICOLOR u8g(8, 9, 7); // Arduino, HW SPI Com: SCK = 76, MOSI = 75, CS = 8, A0 = 9, RESET = 7 (Freetronics OLED)

Für die nachfolgenden Beispiele nutze ich 

U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);

da, das Display über SCL & SDA angeschlossen ist.

Eine Ausführliche Erläuterung was die Bibliothek bietet findet man unter https://github.com/olikraus/u8glib/wiki/userreference.

Einfaches Beispiel – „Hello World!“

#include "U8glib.h" //Bibliothek für das Display
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //erzeugen des Display Objektes

void setup(void) {}

//Funktion zum zeichnen der Zeichenkette "Hello World!" 
//an der Position x=0 und y=20
void draw(void) {
  u8g.setFont(u8g_font_unifont);
  u8g.setPrintPos(0, 20); 
  u8g.print("Hello World!");
}

void loop(void) { 
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  delay(100);
}

Ergebnis

einfaches Beispiel - "HelloWorld!"
einfaches Beispiel – „HelloWorld!“

Das Positionieren und ausgeben von Texten auf dem Display ist mit den Funktionen

u8g.setPrintPos(x-Wert, y-Wert); 
u8g.print(Zeichenkette);

möglich. Dabei muss man natürlich darauf achten das man innerhalb des Displays bleibt da sonst der Text über den bereits bestehenden Text gelegt wird.

1,3" Display mit langem Text
1,3″ Display mit langem Text

Grafiken auf dem Display anzeigen

Wie man eine Grafik auf einem OLED Display anzeigt, habe ich bereits in dem Tutorial Arduino Projekt: Darstellen von Text und Grafik auf einem OLED Display erläutert. Dieses Display ist jedoch etwas größer und eignet sich daher besser um Grafiken darzustellen.

Damit wir eine Grafik auf dem Display anzeigen können muss diese zunächst in das XBM Format gebracht werden. Das XBM Format ist eigentlich ein Array welches die Punkte in der Grafik repräsentieren.

Mit dem OnlineTool https://convertio.co/de/png-xbm/ läßt sich ein PNG Bild in ein XBM Array convertieren. 

Das PNG darf jedoch keine Transparenz enthalten, damit kommt das Tool nicht zurecht!

Wenn das Bild heruntergeladen wurde, kann diese Datei mit einem beliebigen Texteditor geöffnet werden. Ich empfehle hier den PSPad oder den NotePad++ (beide sind kostenfrei nutzbar). 

Hat man diese Datei geöffnet so erschließt einem sich folgender Aufbau:

#define width 64
#define height 64
static char bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.....
}

Diesen Code übernehmen wir nun in unsen Sketch und Zeichnen mit der Funktion 

u8g.drawXBMP( 0, 0, width, height, bits);

beginnend an x = 0, y = 0  unser 64×64 Pixel großes Bild.

1,3" OLED Display mit XBM Grafik
1,3″ OLED Display mit XBM Grafik

Quellcode

#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //erzeugen des Display Objektes

static unsigned char image[] U8G_PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0xC0, 0x30, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 
  0x1E, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0C, 0x07, 0x00, 0x00, 
  0x00, 0x00, 0xE0, 0x30, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 
  0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x07, 0x00, 0x00, 
  0x00, 0x00, 0xE0, 0x30, 0x1E, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 
  0x0E, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x07, 0x00, 0x00, 
  0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 
  0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 
  0x00, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x01, 0x00, 
  0x00, 0x00, 0x0E, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 
  0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x00, 
  0x00, 0x00, 0x0E, 0x00, 0x00, 0x70, 0xC0, 0xFF, 0xFF, 0x03, 0x0E, 0x00, 
  0xF0, 0x7F, 0xF0, 0xFF, 0xFF, 0x0F, 0xFE, 0x0F, 0xF8, 0x7F, 0xF0, 0xFF, 
  0xFF, 0x0F, 0xFE, 0x1F, 0xF8, 0x7F, 0x78, 0x00, 0x00, 0x0E, 0xFE, 0x0F, 
  0x00, 0x70, 0x38, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0x00, 0x70, 0x70, 0x00, 
  0x00, 0x1C, 0x0E, 0x00, 0x00, 0x70, 0x78, 0x00, 0x00, 0x0E, 0x0E, 0x00, 
  0xD0, 0x7B, 0x38, 0x00, 0x00, 0x1C, 0xEE, 0x0D, 0xF8, 0x7F, 0x38, 0x00, 
  0x00, 0x1C, 0xFE, 0x1F, 0xF8, 0x7F, 0x38, 0x00, 0x00, 0x0E, 0xFE, 0x0F, 
  0x40, 0x74, 0x30, 0x00, 0x00, 0x1C, 0x1E, 0x0A, 0x00, 0x70, 0x78, 0x00, 
  0x00, 0x1C, 0x0E, 0x00, 0x00, 0x70, 0x78, 0x00, 0x00, 0x1C, 0x0E, 0x00, 
  0x20, 0x74, 0x30, 0x00, 0x00, 0x1C, 0x1E, 0x06, 0xF8, 0x7F, 0x38, 0x00, 
  0x00, 0x0E, 0xFE, 0x1F, 0xF8, 0x7F, 0x38, 0x00, 0x00, 0x1C, 0xFE, 0x0F, 
  0xD0, 0x7B, 0x38, 0x00, 0x00, 0x1C, 0x5E, 0x0B, 0x00, 0x70, 0x70, 0x00, 
  0x00, 0x0E, 0x0E, 0x00, 0x00, 0x70, 0x38, 0x00, 0x00, 0x1C, 0x0E, 0x00, 
  0x00, 0x70, 0x38, 0x00, 0x00, 0x1C, 0x0E, 0x00, 0xF8, 0x7F, 0x38, 0x00, 
  0x00, 0x0E, 0xFE, 0x1F, 0xF8, 0x7F, 0x78, 0x00, 0x00, 0x1C, 0xFE, 0x0F, 
  0xF0, 0x7F, 0xF0, 0xFF, 0xFF, 0x0F, 0xFE, 0x0F, 0x00, 0x70, 0xF0, 0xFF, 
  0xFF, 0x0F, 0x0E, 0x00, 0x00, 0x70, 0xE0, 0xFF, 0xFF, 0x07, 0x0F, 0x00, 
  0x00, 0x70, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0x70, 0x00, 0x00, 
  0x00, 0x80, 0x07, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x00, 
  0x00, 0x70, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 
  0xFF, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 
  0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 
  0x0E, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x07, 0x00, 0x00, 
  0x00, 0x00, 0xE0, 0x30, 0x0E, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 
  0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x1C, 0x07, 0x00, 0x00, 
  0x00, 0x00, 0xE0, 0x30, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x78, 
  0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x38, 0x0E, 0x07, 0x00, 0x00, 
  0x00, 0x00, 0x80, 0x10, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };


void draw(void) {
  u8g.drawXBMP( 0, 0, 64, 64, image);
}

void setup(void) {
}

void loop(void) {
  // picture loop
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(1000);
}

Zeichnen von geometrischen Formen

Das Zeichnen von einfachen, geometrischen Formen ist mit der Bibliothek „U8gLib“ sehr einfach.

1,3" OLED Display mit geometrischen Formen
1,3″ OLED Display mit geometrischen Formen

Es gibt für faste jede geometrische Form eine Funktion, möchte man also einen Kreis auf dem Display zeichnen so benötigt man die Funktion „drawCircle“. Dieser Funktion wird eine X & Y Koordinate des Mittelpunktes des zu zeichnenden Kreises übergeben sowie den Durchmesser.

 u8g.drawCircle(20, 20, 14);
#include "U8glib.h" //Bibliothek für das Display
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); //erzeugen des Display Objektes

void setup(void) {}

//Funktion zum zeichnen der Zeichenkette "Hello World!" 
//an der Position x=0 und y=20
void draw(void) {
 u8g.drawCircle(20, 20, 14);
 u8g.drawCircle(40, 40, 10);
 u8g.drawFrame(45,5,30,20);
 u8g.drawBox(65,35,10,10);
 u8g.drawLine(85, 10, 100, 45);
}

void loop(void) { 
  u8g.firstPage();  
  do {
    draw();
  } while( u8g.nextPage() );
  delay(100);
}

Fazit

Das 1,3″ OLED Display ist in der Programmierung (mit der Bibliothek U8gLib) sehr einfach auch der Anschluss an den Arduino UNO gestaltet sich über I2C sehr einfach. 

16 Kommentare

  1. hallo,

    ich hab alles genau so gemacht. das display bleibt dunkel. ich versuche schon seit wochen das ich irgend was hin bekomme und es macht nix. was ist falsch. ich schmeiß gleich alles zum fenster raus. jeder sagt es ist kein problem, alles ganz einfach. aber erkläre mal einem leihen das. ich hab keine ahnung von sowas. wie mache ich das dann.. können sie mir helfen ? ich zahle jeden betrag dafür. ich will was bauen aber ich bekomme nix als fehlermeldungen und alles bleibt dunkel. biblothek hier treiber da. ich hab keinen plan, und blicke auch nicht durch. wie das gegen soll. es gibt 1000de texte und programm bsp. und nix geht nur mal ansatzweise. was soll ich also tun…

  2. kleiner tipp, hatte das gleiche problem. schau auf die fehlermeldungen, checke vorher die richtige verdratung. manchmal baut man einen fehler, obwohl man sich ganz sicher ist, also glaubt, alles richtig gemacht zu haben. und schaue ob dein board und das display zu dem prog passt. habe ein 0,96 ic2 gegen ein 1,3er 1:1 getauscht…nix geht mehr! andere libarys waren notwendig, und anders angesprochen…echt doof!viel ausprobieren und sich aus allem den passenden teil suchen…kämpfe gerade auch noch ein wenig 🙂
    Grüße, Guzziralle

  3. Hallo Ich versuche schon seit Wochen meine Füllstandsanzeige zum Laufen zu bringen, leider Ohne pos. Ergebnis. Es scheitert daran dass mein Programm keine Integer-, float-Werte auf dem OLED-Display darstellen kann. Auch nach einer Umwandlung in char-Werte gibt es keine lesbare Wiedergabe. Die Darstellung mit Serial.print auf den Moniror ist OK. Hier mein Programm, vielleichtgibt mir jemand einen Tip.

    Füllstandsmessung einer Zisterne auf OLED-Display 1,3″

    https://pastebin.com/881JA0HG

  4. Hallo Stefan,

    vielen Dank, ich habe die Lösung jetzt selbst gefunden. Durch das Austauschen der „U8g2lib.h-Bibliuothek“ mit der „SSD1306Ascii.h-Bibliothek“ war das darstellen der Werte auf dem Oled-Display kein Problem mehr. Die Zisternenmessung läuft nun schon seit über 2 Wochen sehr exakt wie gewünscht. Nochmals Danke.

    Gruß Georg

  5. Hallo,
    vielen Dank, durch das lesen und verstehen deiner Lektion 78 hab ich gefunden, woran es bisher bei mir gescheitert ist.
    Plötzlich funktioniert meine Bitmap und dazu noch im Zusammenspiel mit nem Lauftext.
    Weiter so, viele Grüße Torsten.

  6. Hallo,

    Danke für die Informationen, die mir sehr geholfen haben. Ich habe aber das Problem, dass „Hello world“ erst erscheint, wenn ich Reset gedrückt habe.
    Wenn ich den USB-Stecker anschliesse (Wemos) bleibt alles dunkel. Mein Display (I2C noname) hat kein Reset-Pin.
    Woran könnte es liegen?

    Danke!
    Enzo

  7. Hallo, vergeblich versuche ich die Bibliotheken zu installieren. Da sind ja so viele Fehler drin! Bis ich die alle korrigiert habe, ist die Lust am Programmieren futsch! Das fängt damit an, dass in der .zip-Datei keine gültigen Bibliotheken vorhanden sind. Also von Hand entpackt und weiter geht’s mit den Fehlern. Sketchnamen mit einer Zahl am Anfang, oder ein falsch gesetzter Unterstrich im Namen…..Alles so Sachen, die bei gitHub eigentlich nicht vorkommen sollten. Endergenbnis: alles gelöscht und nach Alternativen gesucht. Und siehe da, auch gefunden. Hier ist eine tolle Bibliothek: Tiny4kOLED-master. Die ist klein und bringt alles mit, damit so ein kleines OLED auch funktioniert. Und sie hat überschaubare Befehle. Was willste mehr?

    1. Hi,

      für die Displays gibt es diverse Bibliotheken.
      Das Problem mit GitHub Zip-Dateien ist immer recht schwierig, aber
      über den internen Bibliotheksverwalter der Arduino IDE sollte es doch eigentlich funktionieren.

      Gruß

      Stefan Draeger

      1. Hi, ich will ja nicht gegen GitHub wettern, die sind schon o.k. Bei dem Umfang, den es dort gibt, können schon mal ein paar Fehler sich einschleichen. Aber im allgemeinen wird viel zu schnell irgendwas gepostet. Das Problem daran ist eigentlich, dass jeder Programmierer seine eigene Handschrift hat. Und da dahinter zu kommen dauert natürlich. Aber wenn schon die Arduino IDE beim Einpflegen der Bibliothek meckert, dass gar keine gültigen Bibliotheken drin sind, dann weiß ich nicht mehr weiter: Ist mir besonders bei der U8g2lib aufgefallen. Die ältere U8glib lief problemlos. Alles in allem, es ist ein bisschen schwierig….manchmal. Aber bei euch Bloggern findet man auch oft Rat und Tipps. Danke.

  8. Klappt einwandfrei wenn man alle Bibliotheken aus der Bibliothekenverwaltung installiert. Habe die U8g2-Bibliothek benutzt da die U8glib nicht mehr über die Bibliothekenverwaltung zu finden ist. Bei meinem NoName 128×64 I2C Display, welches einem Haufenweise bei ebay/Amazon angeboten wird, muss die Zeile „U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);“ auskommentiert werden (zB im „Hello World“ Beispiel). Als Einstiegspunkt hat mir diese Seite sehr geholfen.

    1. Hi,

      definiere bitte einfach?
      Bei Bildern wird es recht einfach sein, denn da hat man ja die Abmaße.
      Bei Text wird es etwas schwierig. Alternativ kann man da auf eine Nichtproportionale Schriftart zurückgreifen, bei dieser sind alle Buchstaben gleich breit.
      Dann brauch man nur wissen wie breit ein Buchstabe ist und die Buchstaben zählen.

      Gruß,

      Stefan

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert