Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

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

Posted on 14. Januar 20196. März 2024 by Stefan Draeger

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

  • Bezug
    • Lieferumfang
  • Technische Daten des Displays
  • Anschluss & Schaltung
  • Quellcode
    • Beispiele zur Bibliothek „U8glib“
    • Einfaches Beispiel – „Hello World!“
      • Ergebnis
    • Grafiken auf dem Display anzeigen
      • Quellcode
    • Zeichnen von geometrischen Formen
  • Fazit

Bezug

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

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Lieferumfang

Zum Lieferumfang gehört neben dem Display noch eine kleine 4polige Stiftleiste.

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

Die kleine Stiftleiste ist jedoch in wenigen Minuten am Display angelötet.

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 thoughts on “Arduino Lektion 78: 128×64 Pixel, 1.3″ OLED Display”

  1. chris sagt:
    23. November 2019 um 20:22 Uhr

    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…

    Antworten
    1. kai sagt:
      10. Januar 2023 um 12:45 Uhr

      Ist das Projekt noch Aktuell?

      Antworten
      1. Stefan Draeger sagt:
        10. Januar 2023 um 21:04 Uhr

        Hi,

        dieses Projekt ist noch aktuell.
        Gibt es bei dir Probleme bei der Umsetzung?

        Gruß

        Stefan

        Antworten
  2. Ralf Richter sagt:
    2. Dezember 2019 um 19:40 Uhr

    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

    Antworten
  3. Georg Meier sagt:
    11. September 2020 um 15:57 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      12. September 2020 um 11:00 Uhr

      Hallo Georg,

      ich habe deinen Quellcode einmal auf pastebin.com veröffentlicht so wird dein Kommentar nicht zu lang.

      Gruß,

      Stefan

      Antworten
  4. Georg Meier sagt:
    5. Oktober 2020 um 16:19 Uhr

    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

    Antworten
  5. Torsten Kleinau sagt:
    13. Oktober 2020 um 22:10 Uhr

    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.

    Antworten
  6. Enzo Amato sagt:
    7. November 2020 um 17:14 Uhr

    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

    Antworten
    1. Stefan Draeger sagt:
      9. November 2020 um 08:08 Uhr

      Hi,

      gerne würde ich mal einen Blick in deinen Quellcode werfen wollen. Bitte sende mir diesen einmal zu.

      Gruß,

      Stefan Draeger

      Antworten
  7. Bernd Schulze sagt:
    15. Februar 2022 um 14:45 Uhr

    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?

    Antworten
    1. Stefan Draeger sagt:
      16. Februar 2022 um 07:59 Uhr

      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

      Antworten
      1. Bernd Schulze sagt:
        16. Februar 2022 um 20:47 Uhr

        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.

        Antworten
  8. Bartolomeus sagt:
    21. März 2022 um 11:39 Uhr

    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.

    Antworten
  9. Udo Klein sagt:
    8. April 2022 um 17:26 Uhr

    Gibt es eine einfache Möglichkeit, Text oder Symbole auf dem Display zentriert darzustellen?

    Antworten
    1. Stefan Draeger sagt:
      9. April 2022 um 11:01 Uhr

      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

      Antworten

Schreibe einen Kommentar Antworten abbrechen

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

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}