Ich habe heute mal keine Frage direkt, von ein paar Ungereimtheiten bei
der Initialisiereung des OLEDs abgesehen, die aber anderen hier auch
schon merkwürdig vorkamen. Egal - es läuft ja erstmal.
Ich verwende ein 1.3" 64x128 Pixel OLED über I2C am Arduino.
Läuft soweit, die üblichen Bibliotheken habe ich eingebunden. 1 | #include <Adafruit_GFX.h>
| 2 | #include <Adafruit_SH110X.h>
| 3 | #define SCREEN_WIDTH 64 // OLED display width, in pixels
| 4 | /*
| 5 | // #define SCREEN_HEIGHT 128 // OLED display height, in pixels
| 6 | */
| 7 | #define SCREEN_HEIGHT 122 // OLED display height, in pixels
| 8 | #define OLED_RESET 8 // can set an oled reset pin if desired
| 9 | Adafruit_SH1107 display = Adafruit_SH1107(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
im Setup(){}; 1 | void setup() {
| 2 | pinMode(8, OUTPUT); // RESET OLED
| 3 | digitalWrite(8, HIGH);
| 4 | display.begin(0x3C, true); // Address 0x3D default
| 5 | display.setTextSize(2);
| 6 | display.setRotation(3);
| 7 | display.setTextColor(SH110X_WHITE);
| 8 | display.clearDisplay();
| 9 | display.println(F("ABCDEFGIJKLMNOPQRSTUVWXYZ"));
| 10 | display.display();
| 11 | }
|
Soweit so gut:
nun hat mein Kollege ausm Musterbau mir einen kleinen Rahmen für das
Teil im Gehäuse gebaut, damit das alles etwas ordentlich aussieht. Nun
ist mein Display im Sichtfeld leider etwas eingeschränkt. Am Rahmen
feilen möchte ich nicht.
Was habe ich also gemacht:
eigentlch nur zwei Dinge ausprobiert
- #define SCREEN_HEIGHT 122 // OLED display height, in pixels
- in der Adafruit_SH1107.cpp in Zeile 166:
die Initsequenz 0xD3, 0x60 (Displayoffset) auf 0x5F geändert. Also nur
eine Zeile nach unten verschoben. 1 | static const uint8_t init[] = {
| 2 | SH110X_DISPLAYOFF, // 0xAE
| 3 | SH110X_SETDISPLAYCLOCKDIV, 0x50, // 0xd5, 0x51,
| 4 | //SH110X_MEMORYMODE, // 0x20
| 5 | SH110X_SETCONTRAST, 0x20, // 0x81, 0x4F // AR 02.05.2022 ->0x20
| 6 | SH110X_DCDC, 0x8A, // 0xAD, 0x8A
| 7 | SH110X_SEGREMAP, // 0xA0
| 8 | SH110X_COMSCANINC, // 0xC0
| 9 | SH110X_SETDISPSTARTLINE, 0, // 0xDC 0x00 // AR 02.05.2022 ->0x06
| 10 | SH110X_SETDISPLAYOFFSET, 0x5F, // 0xd3, 0x60,// AR 02.05.2022 ->0x5F
| 11 | SH110X_SETPRECHARGE, 0x22, // 0xd9, 0x22,
| 12 | SH110X_SETVCOMDETECT, 0x35, // 0xdb, 0x35,
| 13 | SH110X_SETMULTIPLEX, 0x3F, // 0xa8, 0x3f,
| 14 | // SH110X_SETPAGEADDR, // 0xb0
| 15 | // SH110X_SETCOMPINS, 0x12, // 0xda, 0x12,
| 16 | SH110X_DISPLAYALLON_RESUME, // 0xa4
| 17 | SH110X_NORMALDISPLAY, // 0xa6
| 18 | };
|
Mit dem _#define SCREEN_HEIGHT 122_, statt 128, hab ich alles n Stück
nach rechts rücken können.
Ganz Ehrlich habe ich auch keine Ahnung, wie die Initialisierung des
OLEDs so funktionieren kann, denn gemäß Datenblatt des verwendeten
Display-Controllers, stimmt da ein paar Kleinigkeiten nicht. Offenbar
ist das 128Pixel breite OLED genau mittig am 132pixel könnenden
Controller angeschlossen. Dabei ist ja nur 64Pixel "breit"... Also der
anzugebende Grafikbereich passt jetzt sehr gut, jedoch wird das
Adafruit-Logo nicht mehr angezeigt, weil der splash nur bei 64x128(Zeile
143ff.) oder 128x128(Zeile 149ff.) ausgegeben wird, aber keine
"DrawBitmap" für 64x122 definiert ist (huch).
Hinzufügen kann man noch, das das Display von Hause aus im Hochformat
und nur druch SetRotation(3) "richtig" im Querformat anzeigt.
Wahrscheinlich passt es deshalb zufällig mit der Konstanten
SCREEN_HEIGHT = 122, weil der DisplayBuffer am Rechten Rand rückwärts
schreibt, oderso...
Ich wünsche was, viele Grüße
Äxl, DG1RTO
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|