Forum: Mikrocontroller und Digitale Elektronik OLED 1306 128x64 Display an ESP32-WROOM board


von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Habe hier mit der Darstellung auf einem OLED Display Probleme, wenn ich 
es mit einer Demo-App ssd13ß6_128x64_i2c (Beispielprogramm aus der 
AdaFruit SSD1306 Library)  auf einem ESP32-WROOM Board laufen lasse.

Mit einem STM32F103 (Blue Pill) habe ich die Funktion parallel dazu 
heute noch mal verifiziert. Das allerdings mit einem anderen Treiber.

Auch schon 2k2 Pullup Widerstände an SCLK und SDA probiert. 3,3V liegen 
an Vcc des Displays an.

Sind aus Versehen zwei gleiche Anhänge hochgeladen worden. Weiß nicht, 
wie und ob man die doppelten löschen kann.

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


Lesenswert?

Mache mal einen Gegentest mit 
http://stefanfrings.de/arduino_oled/index.html

Wenn es damit geht, ist die Hardware wohl in Ordnung. Ich denke, diese 
Erkenntnis wäre hilfreich, auch wenn du weiterhin die Adafruit 
Bibliothek nutzen willst.

von Christoph K. (chriskuku)


Angehängte Dateien:

Lesenswert?

Steve van de Grens schrieb:
> Mache mal einen Gegentest mit
> http://stefanfrings.de/arduino_oled/index.html
>
> Wenn es damit geht, ist die Hardware wohl in Ordnung. Ich denke, diese
> Erkenntnis wäre hilfreich, auch wenn du weiterhin die Adafruit
> Bibliothek nutzen willst.

Abgesehen davon, daß es bei der jüngsten Version zeilenweise einen 
Versatz gibt, so daß es kein bündiges Bild ergibt, konnte ich eine 
ältere Version von OLED.zip finden, die ich früher mal gespeichert 
hatte. Da mußte ich noch in der ::display() Methode die 0x00 in 0x02 
ändern und dann ergab sich  ein vernünftiges Bild. In der Demo wird 
allerdings bei der Demonstration des horizontalen Scrollings der 
unterstrichene "Hello" Text ein paar Pixel zu hoch abgeschnitten und es 
scrollt dann noch ein bißchen "Müll" mit, aber im Prinzip kann ich das 
evtl. sogar nutzen oder ich muß den Code in C überführen.

Die nachfolgende Version von ::display benutze ich jetzt:
1
void OLED::display()
2
{
3
    size_t index = 0;
4
    for (uint_fast8_t page = 0; page < pages; page++)
5
    {
6
        // Set memory address to fill
7
        i2c.beginTransmission(i2c_address);
8
        i2c.write(0x00); // command
9
        if (isSH1106)
10
        {
11
            i2c.write(0xB0 + page); // set page
12
            i2c.write(0x02); // lower columns address =0 << hier 02 statt 00
13
            i2c.write(0x10); // upper columns address =0
14
        }
15
        else
16
        {
17
            i2c.write(0xB0 + page); // set page
18
            i2c.write(0x21); // column address
19
            i2c.write(0x00); // first column =0
20
            i2c.write(width - 1); // last column
21
        }
22
        i2c.endTransmission();
23
24
        // send one page of buffer to the display
25
        i2c.beginTransmission(i2c_address);
26
        i2c.write(0x40); // data
27
        for (uint_fast8_t column = 0; column < width; column++)
28
        {
29
            // Split the transaction into chunks of 32 bytes because that is a limitation of Arduino
30
            if (column>0 && (column % 31 == 0) )
31
            {
32
                i2c.endTransmission();
33
                i2c.beginTransmission(i2c_address);
34
                i2c.write(0x40); // data              
35
            }
36
            
37
            i2c.write(buffer[index++]);
38
        }
39
        i2c.endTransmission();
40
        yield(); // to avoid that the watchdog triggers
41
    }
42
}

: Bearbeitet durch User
von J. S. (jojos)


Lesenswert?

Na vielleicht funktionierte es nicht weil es ein SH1106 ist statt 
SD1306.

von Steve van de Grens (roehrmond)


Lesenswert?

Das Problem ist, dass es die Displays nicht nur mit unterschiedlicher 
Anzahl von Zeilen und Spalten gibt, sondern dass deren Zuordnung zum 
steuernden Chip (befindet sich auf dem Flachkabel) manchmal vom Standard 
abweicht. Wenn man das dann auch noch ohne passendes Datenblatt gekauft 
hat, ist die "trial-and-error" Methode angesagt.

Der Test hat dennoch gebracht, was ich beabsichtigt hatte. Du weißt nun, 
dass die Hardware funktionsfähig ist. Die Fehlersuche beschränkt sich 
damit auf die Software.

: Bearbeitet durch User
von Christoph K. (chriskuku)


Lesenswert?

J. S. schrieb:
> Na vielleicht funktionierte es nicht weil es ein SH1106 ist statt
> SD1306.

Das war's vermutlich. Hatte mich nur irritieren lassen, da ich in einem 
früheren Projekt (STM32) ein Paket benutzt hatte, das ssd1306.c hieß (* 
original author:  Tilen Majerle<tilen@xxxxx.eu>
 * modification for STM32f10x: Alexander Lutsai<xxlyra@xxxxx>)
Allerdings scrollt da immer noch ein Streifen im oberen Bereich während 
die Adafruit Demo läuft. Der stammt von der zuvor geflashten OLED app 
(stefanfrings.de), weil der flash gerade in dem Moment passierte, als 
die App den Scrollmode gesetzt hatte. Die Adafruit Demo setzt den Modus 
offenbar nicht zurück.

von Steve van de Grens (roehrmond)


Lesenswert?

Horizontal Scrollen ist eh blöd, würde ich auf solchen Displays nie 
ernsthaft benutzen.

von Christoph K. (chriskuku)


Lesenswert?

Steve van de Grens schrieb:
> Horizontal Scrollen ist eh blöd, würde ich auf solchen Displays nie
> ernsthaft benutzen.

Da hast Du völlig recht. Würde ich auch nicht. Aber die Demo macht's 
halt
und es zeigt dann auch wieder, daß die Adafruit SH1106-Demoapp das 
Display nicht vollständig und richtig initialisiert.

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.