OLED mit ESP32 (Befehle)

  • Hallo ESP32-Freunde

    Heutiges Erfolgserlebnis: für diejenigen, die wie ich (noch) in arduino-C programmieren, von ESP32 Heltec aus zwei OLEDs unabhängig ansteuern geht natürlich auch hier.

    Die alternativen I2C-Pins (SDA 21 und SCL 22) habe ich aus dem Pinout-Diagramm WiFi Kit 32

    Hinweis: man kann auch gleichzeitig(!) für beide I2C-Kanäle die Modul-Adressen scannen (halt auch in arduino-C sorry... vielleicht kann das jemand in kursgerechte MicroPhyton-Sprache übersetzen). Aber es funktioniert zumindest tadellos - man muss nur die massgebenden I2C-Pins eintragen:

    https://www.az-delivery.de/blo…-schnittstellen-verwenden

    Viel Spass!

    Andreas

  • Hallo Kai,

    ich verwende

    Auf den ESP32 die Firmware

    esp32-idf4-20191220-v1.12.bin geladen werden bzw. eine mit idf4

    Dann die Treiberdatei

    micropython-adafruit-ssd1306-master.zip

    und davon die Datei

    ssd1306.py mit der Größe von 6kB

    OK-werde mal die ...Idf3... versuchen

    melde mich

    Grüße und danke

    Siggi

  • Also nur der Vollständigkeit halber. Ich benutze auf meinem Board die Micropython Version esp32-idf3-20191220-v1.12.bin und die ssd1306.zip die René mit seinen Programmierbeispielen bereitstellt.


    Damit funktioniert es, zumindest mit meinem Board, einwandfrei.


    Gruß Kai

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • Hallo Kai, habe Danke erst einmal für Deine Mühe und das Beispiel.

    Steigt aber auch bei Zeile 7 aus (siehe Code)

    Dein"Zitat" -hatte ich im Programm verschiedene Varianten schon versucht-ging keine!

    Hallo Rene, folgende Fehlermeldung (die ich nicht interpretieren kann) kommt:

    ===================================================================

    Traceback (most recent call last):

    File "main.py", line 7, in <module>

    File "ssd1306.py", line 100, in __init__

    File "ssd1306.py", line 36, in __init__

    File "ssd1306.py", line 61, in init_display

    File "ssd1306.py", line 105, in write_cmd

    OSError: [Errno 19] ENODEV

    MicroPython v1.12 on 2019-12-20; ESP32 module with ESP32

    Type"help()"for more Information.


    =====================================================================

    Viele Grüße

    Siggi

    Quellcode wurde 1:1 von Kai übernommen.

  • Hallo Siggy,


    definiere display1 und display2 wie folgt:


    display2 = I2C(scl=Pin(19), sda=Pin(18))
    display1 = I2C(scl=Pin(22), sda=Pin(21))


    dann geht es.



    2OLEDS.jpg


    Die Default-ID muss -1 sein .... und die wird gesetzt, wenn Du beim initialisieren die 0 und 1 weglässt.

    Weitere Infos hier.


    Mit besonderem Augenmerk auf folgenden Absatz:


    Zitat

    The default value of -1 selects a software implementation of I2C which can work (in most cases) with arbitrary pins for SCL and SDA. If id is -1 then scl and sda must be specified. Other allowed values for id depend on the particular port/board, and specifying scl and sda may or may not be required or allowed in this case.

    Gruß Kai

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • Hallo Rene,

    habe es hin und her probiert. Auch mit einem größeren Display (sh1106). Irgend etwas beachte ich noch nicht.

    Wenn ich Zeile 10 (fängt jetzt an mit oled2 ...)(unten im code mit ## ausgeklingt) dazu nehme, kommt das System mit Fehler und stoppt.

    Enizeln funktioniert die I2C-Verbindung mit den verschiedensten Pins.

    Das sind die "Stolpersteine". Ich habe auch kein adäquates Beispiel gefunden (außer mit Arduino-IDE)

    Vielleicht kannst Du mir helfen oder jemand aus dem Forum???

    Danke

    Siggi

  • Hallo Siggi,


    falls beide Displays mit derselben I2C-Adresse arbeiten, geht das nicht am selben I2C-Bus. Für das zweite Display müssen dann andere Pins für scl und sda verwendet werden. Gemäss Micropython-Dokumentation sind dafür alle Output-fähigen Pins geeignet, die nicht zu anderen Zwecken benötigt werden.


    https://docs.micropython.org/e…p32/quickref.html#i2c-bus


    In der Praxis wird es vermutlich noch kleine Stolpersteine geben, aber immerhin ist es eine Grundlage zum Experimentieren.


    Gruss

    René

  • Hallo Rene,

    wie kann ich 2 Oled-Displays am i2c-Bus adressieren (ssd1306 und sh1106) . Beide funktionieren am ESP32 einzeln einwandfrei.

    Ich kann aber an den Oleds keine Adresse einstellen. Habe das im Programm mit "oled1.text... und oled2.text... versucht, geht aber nicht.

    Beide zeigen amsda, scl die gleichen Bilder.

    Wenn man einen I2C expander einsetzt nützt das auch nichts, da man ja keine Adresse hat. Muss ich mir andere Displays beschaffen?

    Hatte aber einen Beitrag im Netz gefunden, der mit der Arduino IDE genau das zuläßt.:/

    Besten Dank im voraus

    Siggi

  • Lösung für OLED-Display mit ESP32

    Hallo René, hallo an alle: LÖSUNG ist gefunden ;)

    Auf den ESP32 muss die Firmware

    esp32-idf4-20191220-v1.12.bin geladen werden bzw. eine mit idf4 :!:

    Dann die Treiberdatei

    micropython-adafruit-ssd1306-master.zip

    und davon die Datei

    ssd1306.py mit der Größe von 6kB

    Damit gehen dann alle Funktionen für das OLED-Display. HURRA Geschaft

    Viele Grüße an Alle

    Siggi 8)

  • Hallo René, danke für Deinen Hinweis. Ich habe bereits 3 verschiedene ssd1306 ausprobiert. Sind alle unterschiedlich und

    eine ging gar nicht. Jetzt werde ich mal die von Dir vorgeschlagene nehmen.

    Danke nochmals - ich melde mich wieder bei Erfolg.

    VG Siggi

  • Hallo Siggi,


    üblicherweise ist die Micropython - Version nicht besonders kritisch. Ich habe bei mir die Version 1.12 vom 21.01.2020 geladen. Es handelt sich dabei um eine GENERIC - Version (nicht GENERIC-SPIRAM oder TinyPICO). Ich kann allerdings nicht mehr sagen, ob es eine Version basierend auf IDF3 oder IDF4 ist.


    Kritischer könnte die Version von ssd1306.py sein. Wenn du die Begleitunterlagen zu dieser Lektion herunterlädst, findest du die Version, die ich verwende.


    Gruss

    René

  • Hallo Rene, am Pin4 habe ich über Optokoppler ein Relais angeschaltet (zu Versuchszwecken), um mal zu sehen,

    wie der Ablauf hardwareseitig funktioniert. Es funktioniert einwandfrei. In Zeile 13 wird es eingeschaltet und in Zeile 24 wieder aus.

    Das dient nur zu Versuchszwecken - habe da jetzt eine LED dran, da das "klappernde Relais" bei 1000 Durchläufen mir auf den Wecker ging.

    VG Siggi

  • Hallo Rene, sollte ich evtl. eine "ältere" Firmware laden? Ich habe das Problem

    auf zwei ESP32(Hardware) von unterschiedlicher Herkunft. Bei beiden tritt mit dem

    OLED1306 aber der gleiche Fehler auf. Wenn ich mir das spanische Tutorial ansehe

    müsste das alles funktionieren. Ich weiss aber nicht , was bei den vielen Bsp. im Internet

    für eine Firmware verwendet wurde. Ich denke, nicht die neueste. Da ich aber gerade neu

    mit MicroPython angefangen habe, habe ich natürlich auch die neueste draufgeladen.

    Danke VG Siggi

  • Hallo Siggi,


    ich kann die Fehlermeldungen nicht interpretieren.


    mect has no attribut 'rect' soll vermutlich aussagen, dass das Object mect keine Methode rect kennt. Was ist mect???

    Ebenso ist mir unklar, was in der zweiten Fehlermeldung mono sein soll.


    Wozu dient eigentlich Pin 4 (Variable relay)?


    Gruss

    René

  • Hallo René,

    Danke für die Antwort. Rechteck bleibt aber genau vor dem Befehl oled.rect stehen. (siehe Bildausschnitt mit Fehlermeldung)

    hline, line usw. muss ich erst noch nach deinem vorgeschlagenen Muster testen - Danke

    VG Siggi

  • Hallo Siggi,


    ich kann das Problem mit hline bestätigen, weiss aber momentan noch nicht, warum es nicht geht.

    Erstaunlicherweise funktioniert hline() im Innern der Schleife, anschliessend dann aber nicht mehr.

    Code
    1. for k in range(120, 20, -2):
    2. oled.fill(1)
    3. oled.text("Hallo Welt", k, 20, 0)
    4. oled.hline(k, 30, 80, 0)
    5. oled.show()
    6. sleep_ms(50)


    Die Fehlermeldung bei den Zeilen 36, 37 kann ich leider nicht reproduzieren.


    Bei oled.rect() ist ein Programmfehler vorhanden.

    Du schreibst:

    Code
    1. oled.rect(0,38,128,20,1)
    2. oled.show()
    3. oled.fill(1)
    4. oled.text("Hallo Siggi", 20, 20, 0)

    Das Rechteck wird unmittelbar nach dem Zeichnen wieder mit .fill(1) überschrieben.

    Code
    1. oled.fill(1)
    2. oled.rect(0,38,128,20,0)
    3. oled.show()
    4. oled.text("Hallo Siggi", 20, 20, 0)

    zeichnet das Rechteck.


    Gruss

    René


  • Hallo Rene, hier die technischen Daten und das Programm.

    - auf ESP32 geladen:

    esp32-idf3-20200210-v1.12-154-gce40abcf2.bin (1401kB)

    ssd1306.py (5kB)

    uPyCraftV1.0 (siehe Anhang "uPyCraftV.1.jpg")

    main.py (siehe Quellcode)

    In Zeile 22,23,24 sollte eine hlinie erzeugt werden

    in Zeile 36,37 sollte ein Rechteck erzeugt werden

    Die Zeilen 22,23,24 habe ich erstmal wieder auskommentiert

    Die Zeilen 36,37 bewirken, das das Programm bis dorthin läuft und dann

    stehenbleibt mit der Fehlermeldung: "Traceback moas no attribute 'rect' >>>

    VG Siggi

    Anmerkung: Ohne die Zeilen 22,23,24 und 36,37 läuft das Programm einwandfrei