Forum: Mikrocontroller und Digitale Elektronik 128 x 64 SH1107 OLED mit eingeschränktem Sichtfeld


von Axel R. (axlr)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.