OLED/BME280 - OLED zeigt nichts an

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    ich baue gerade parallel zu meinem Projekt am RPi4 noch mit an einem Klima-Daten-Logger auf Basis eines Picos. Ich habe dort via I2C neben einem BME280 auch ein OLED Display SSD1306 verbaut. Folgendes Problem: Der Code läuft ohne Fehler durch, die BME280 Werte werden auch ausgelesen, nur das Display zeigt nichts an. Verwende ich die gleichen Parameter für ein Skript, welches nur nur das Display anspricht, werden Daten angezeigt. Ich habe euch mal ein paar Aufnahmen von der "Verdrahtung" gemacht. Und hier noch der Code, welcher leider keine Ausgabe auf dem OLED macht:

    Bitte nicht daran stören, dass ich den Code noch nicht ordentlich kommentiert habe. Ich wollte das machen sobald die Komponenten alle verbaut sind und dann auch eine ordentliche Projektvorstellung machen.

    Folgender Code funktioniert bei gleicher Verkabelung wunderbar (sinnfrei, habe ich nur für Testzwecke erstellt bzw. "ergoogled"):

    Ich denke es hat damit zu tun, das ich einmal den Kanal 0 und einmal den Kanal 1 anspreche (wird das Kanal genannt?)? Eigentlich sollte man die Bauteile bei I2C doch auch "Bus-mäßig" schalten können, oder?

    Vielleicht hat jemand von euch eine Idee dazu...

    Schönen Abend noch!

    Christian

  • Hallo TH,

    spontan fällt mir auf, dass in deinem Code in Zeile 37 nur oled.show steht und nicht oled.show().

    Ich hatte an meinem Pico auch Probleme. An manchen I2C Anschlüssen funktionierte das Display nicht.

  • Vielleicht hat jemand von euch eine Idee dazu...

    fehlende falsche pullups!

    falsche Ansteuerung, Pegelwandler vergessen, der BME arbeitet mit 5V und Spannungsregler, also kann falsche Einspeisung ein Problem werden.

    ferner Adressenkonflikt, evtl. auf anderen I2C ausweichen.

    Dummerweise weiss ich viel über I2C aber nicht am PI

    1. Grundregel pullups prüfen

    2. Grundregel I2C Scanner laufen lassen

    3. Grundregel prüfen ob die richtige Adressnotation gewählt ist 8 Bit oder 7 Bit

    4. Grundregel LIBs nicht wild mischen

    uvam.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo, ich habe gerade die Klammer hinter oled.show() und jetzt geht es! Hipp Hipp Hurra!! Danke euch!

    Ich lasse des Pico jetzt mal bis morgen, losgelöst vom Rechner, laufen und schaue ob es Probleme gibt. Wenn nicht, würde ich morgen dann auch in Fritzing mein Glück versuchen und die Schaltung dort aufbauen. Vom Platinendesign in Fritzing habe ich überhaupt keine Ahnung. Ich werde euch aber mal meine Ergebnisse zeigen. Das Fehlerpotenzial ist mit Sicherheit hoch in dem Bereich.

  • Hallo

    Die I2C Adresse des BME 280 ist 0x76 oder 0x77 die Adresse des OLED Display 0x3C für beides reicht ein I2C Kanal locker, warum dann Kanal 0 oder 1

    Um ehrlich zu sein weiss ich nicht, wie ich die Schalten müsste. GRD und Spannung ist klar. Aber darf ich SDA und SCL einfach zwischen den Komponenten verbinden (vergleichbar mit der Datenleitung eines DS18B20? Ich meine mich erinnern zu können, dass ich das sogar probiert hatte, aber dann wegen einer Fehlermeldung auf den zweiten Bus gewechselt bin.

    Spricht abgesehen davon dass ein Bus "unnötig" verbraucht wird, etwas dagegen, zwei Busse zu verwenden?

  • Spricht abgesehen davon dass ein Bus "unnötig" verbraucht wird, etwas dagegen, zwei Busse zu verwenden?

    nö für unbenutzte Busse gibt es kein Geld zurück!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo,

    zu deinem Code. MicroPython hat kein 'time', dafür ein 'utime'. Das wird auch verwendet, wenn du 'time' in deinen Code schreibst. SIeh dir print(time) an.

    Du solltest keine Namen verwenden, die nichtssagend sind und/oder erfundene Abkürzungen sind. Wähle sprechende Namen, das macht für alle den Code leichter lesbar, auch für dich, wenn du in einem halben Jahr etwas ändern willst.

    Funktionsnamen sollen beschreiben was die Funktion macht. 'ps' und 'linien' tut das nicht. Ich weis auch nicht was die Pferdestärken in deinem Programm zu suchen haben oder steht das 'ps' doch für was anderes? ;)

    Variablen schreibt man komplett klein und auch sie sollten nicht aus einzelnen Buchstaben bestehen.

    Auf der Modulebene, da wo deine Funktionen stehen, sollten nur Konstanten, Funktionen und Klassen stehen und kein ausführbarer Code. Du hast normalerweise eine Funktion 'main' aus der du den Programmablauf steuerst und Funktionen aufrufst. Was die Funktionen benötigen bekommen sie als Argumente übergeben, wenn es sich nicht um Konstanten handelt.

    Wenn du 'Pin' importierst ist es nicht nötig machine.Pin(16) zu schreiben.

    So im groben könnte die Programmstruktur wie folgt aussehen. Ich habe versucht deine Programmlogik weitest gehend bei zu behalten. Ob meine Namen richtig gewählt sind weis ich nicht, ich konnte auch den Code nicht testen, mit dem Beispiel will ich dir nur zeigen was ich mit meiner Erklärung gemeint habe. Das ist keines Falls eine Musterlösung:

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Ein Bild sagt oft mehr. Am I2C Bus des D1 Minis sind 5 Module und am SPI Bus des D1 nochmals 2 Module angeschlossen.

    Das ist der Sinn von I2C und SPI Bus. Der zweite I2C Bus wird benutzt wenn zwei gleiche Module mit der gleichen I2C Adresse gebraucht werden.

    Das ist ein älteres Projekt zeigt aber die Bus Idee mit den Anschlüssen gut.

  • Hallo zusammen,

    hier, wie versprochen, die Fritzing Darstellung und noch mal zwei Bilder mit laufendem Display und Detailaufnahme vom Display. Ich hatte leider noch keine Zeit, dem Programmcode zu hübschen. Das ist meine nächste Aufgabe. Vorher möchte ich noch das Logging im Skript integrieren. Sobald ich den Code in hübsch habe, zeige ich euch mein "Kunstwerk". Leider waren in Fritzing nicht genau die Bauteile enthalten, die ihr im Bild seht. Mir ging es dabei vor allem um die Anschlüsse. Parallel werde ich anfangen, die Platine zu entwerfen. Gibt es dazu für Fritzing eine "Best-Practise-Empfehlung" oder ein Tutorial, welches ihr empfehlen könnt?

    Gruß

    Christian

  • Hallo Dennis,

    nochmals Danke für die Korrekturen am Code. Ich war der Meinung, dass ein " if __name__ == '__main__':"- Block bei rein funktionaler Programmierung nicht erforderlich ist. Aber wahrscheinlich sollte man sich sowas grundsätzlich angewöhnen - dürfte wohl der bessere Stil sein. Die schlampigen Variablen-Bezeichnungen sind dem geschuldet, dass ich die Woche immer nur Abends für ein paar Minuten Zeit hatte an dem Projekt zu arbeiten. Für den Fall, dass du wissen möchtest, für was das Teil eigentlich gut sein soll:

    Problem-Ausgangsstellung: Du hast Fensterelemente, an denen im Randbereich im Winter Kondensat und/oder Schimmel entsteht, bist aber der Meinung dass du ausreichend Lüftest und im Raum herrschen meistens nur um die 40% relative Luftfeuchtigkeit im Winter. Du fragst dich, liegt es am schlechten Bauteil Fenster/Fensterleibung oder Lüftest du vielleicht tatsächlich zu wenig.

    Lösung: Den Pico möglichst mitten im Raum aufstellen und den DS18B20 im Bereich des Schimmels befestigen und laufen lassen.

    Was macht das Skript: Der BME liefert die relevanten Raumklimadaten, nämlich Temperatur und (relative) Luftfeuchtigkeit. Je nach Temperatur kann die Luft unterschiedlich viel Wasserdampf aufnehmen (jedoch nie mehr als bis zur Sättigung). Der Sättigungsdampfdruck einer Temperatur lässt sich in den üblichen Temperaturbereichen verhältnismäßig gut ausrechnen (Formel nach Magnus Tetens). ps bedeutet druck p und s ist Sättigung :)

    Jetzt wissen wir, dass zum Beispiel bei 20°C er Sättigungsdampfdruck bei ca. 2330 Pa liegt. Gleichzeitig kennen wir die relative Luftfeuchtigkeit. Beträgt diese zum Beispiel 50%, so beträgt der tatsächliche Dampfdruck (pt) 2330 * 0,5 = 1165 Pa.

    Man kann davon ausgehen, das der Dampfdruck im Raum relativ gleichmäßig verteilt ist. Das bedeutet, die 1165 Pa liegen auch am Schimmelbereich an. Wir kennen die Temperatur am Schimmelbereich (die liefert uns der DS18B20 am Kabel) und können dort ebenfalls den Sättigungsdampfdruck ausrechnen. Liegt der Ps im Schimmelbereich aufgrund der niedrigeren Temperatur zum Beispiel bei 1456 Pa, kann man die beiden Drücke ins Verhältnis setzen, sprich den tatsächlichen Druck (=Wasserdampf im Raum) mit 1165 / 1456 Pa max möglicher Druck an der Schimmelstelle = 0,8. Sprich im Schimmelbereich ist die Luft zu 80 % gesättigt. Und das langt zum Beispiel schon für Schimmelwachstum. Die Zahlen zeigen, das im vorliegenden Fall, trotz "Normklima" im Raum, Schimmel nicht zu vermeiden ist -> Das Problem liegt im Fenster/Wandbereich.

    Sinn machen solche Messungen logischerweise nur im Winter. Damit das ganze auch noch nachvollziehbar ist und nicht nur eine Momentaufnahme darstellt, sollen die Werte noch im 5 Minuten Takt geloggt werden.

    Ist vielleicht eine relativ spezielle Anwendung und mit Sicherheit nicht für jeden interessant. Wer schon mal Diskussionen über die Kostenbeteiligung einer Schimmelbeseitigung geführt hat, wird sich aber vielleicht dafür interessieren.

    Ich würde das Projekt grundsätzlich gerne voran treiben und auch der Öffentlichkeit zur Verfügung stellen wollen. Ich halte sehr viel vom Open Source Gedanken...

    just my 2 cents...

    Christian

    PS Sollte nicht belehrend klingen, wollte nur anständig erklären was das ganze soll, wenn du dir schon die Mühe machst, den Code zu korrigieren ;)

  • Hallo liebe freunde der Sonne :)

    Ich hab zwar nur nen Temperatursensor an meinem Pico hängen, aber ich hoffe das der thread trotzdem passt. Nach längerem bsteln und probieren zeigte sich das gleiche Problem wie mit dem Zero, das kurze Kabel klappt, das lange nicht. Nun kam gestern ein neues Problem hinzu, ohne das ich was am Code geändert hatte. Erst der Code, dann die Fehlermeldung.

    Code
    Found DS devices:  []
    Traceback (most recent call last):
      File "<stdin>", line 20, in <module>
    IndexError: list index out of range

    Hat erst funktioniert, jetzt will es nicht mehr :denker:

    Jemand eine Idee??

    VG, bruzilla

  • Code
    Traceback (most recent call last):  File "<stdin>", line 20, in <module>
    IndexError: list index out of range

    Zeile 20:

    Code
    print("I2C Address      : "+hex(i2c.scan()[0]).upper())

    Bist du dir sicher, dass das Display auch richtig angeschlossen ist und SDA/SCL nicht vertauscht sind?

    Wenn kein I2C-Slave erkannt wird, dann ist die Liste leer und ein Index-Zugriff auf die Liste führt dann zu einem IndexError.


    Lösen könnte man das so:

    Getestet habe ich das jetzt nicht. Die f-strings werden auch seit irgendeiner Micropython-Version unterstützt.

  • Bist du dir sicher, dass das Display auch richtig angeschlossen ist und SDA/SCL nicht vertauscht sind?

    Ziemlich sicher, es hat ja erst funktioniert und dann auf einmal nicht mehr ;(

    Am Anfang hatte ich die SDA/SCL vertauscht und dann noch dem falschen I2C zugeordnet, aber das hab ich mit Try and error herausbekommen.

    Code
    Found DS devices:  []
    I2C Addresses    : 
    I2C Configuration: I2C(1, freq=200000, scl=15, sda=14)
    Kein Display gefunden. Mache ohne Display weiter.
    Traceback (most recent call last):
      File "<stdin>", line 36, in <module>
      File "ds18x20.py", line 20, in convert_temp
      File "onewire.py", line 23, in reset
    OneWireError: 

    naja, da hab ich wohl ein größeres Problem <X

    display weg, one wire weg

    Hab jetzt auch andere Pins ausprobiert für den DS18B20, für das Display und für GND. Ich tippe auf die Spannung 8|

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!