In diesem Tutorial möchte ich das 128×64 Pixel, 1.3″ OLED Display für den Arduino vorstellen.
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.
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.
Display | Arduino Leonardo |
---|---|
GND | GND |
VCC | 5V |
SCL | A4 oder SCL |
SDA | A5 oder SDA |
Der Arduino UNO und Leonardo verfügen neben den analogen Pins A4 & A5 auch über separat hinausgeführte SCL & SDA Pins.
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.
Zusätzlich wird die GFX Bibliothek von Adafruit benötigt.
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.
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
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.
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.
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.
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.
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…
Ist das Projekt noch Aktuell?
Hi,
dieses Projekt ist noch aktuell.
Gibt es bei dir Probleme bei der Umsetzung?
Gruß
Stefan
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
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
Hallo Georg,
ich habe deinen Quellcode einmal auf pastebin.com veröffentlicht so wird dein Kommentar nicht zu lang.
Gruß,
Stefan
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
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.
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
Hi,
gerne würde ich mal einen Blick in deinen Quellcode werfen wollen. Bitte sende mir diesen einmal zu.
Gruß,
Stefan Draeger
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?
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
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.
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.
Gibt es eine einfache Möglichkeit, Text oder Symbole auf dem Display zentriert darzustellen?
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