BME Funkioniert nicht ab Lektion10

  • Sorry meinte den Busabschlusswiderstand gerne auch als Wellenwiderstand bezeichnet z.B. beim von mir oft eingesetzten Profibus.

    Wenn man eine Leitung nicht mit ihrem Wellenwiderstand abschließt, kommt es an deren Ende zu Reflexionen des Signals. Dieses zurückgeworfene Signal überlagert sich mit dem hingehenden Signal.

    Bei diesen Interferenzen kann es zu Auslöschungen des Signals kommen (Wellenberg trifft auf Wellental). Dies führt dann zu Signalverlaufsänderungen und Busstörungen. Um dies zu vermeiden, muß das Busende mit dem Wellenwiderstand der Leitung abgeschlossen werden.


    Dann ist es also richtig bei unserem I2C Bus den Pullup Widerstand einzuschalten.


    Gruß Frank

  • Ja Kai


    Der Schleifenwiderstand ist der ohmsche Gleichstromwiderstand eines Paares (Hin-und Rückleitung) und ist neben dem Wellenwidertstand eine entscheidende Einflußgröße für die Leitungsdämpfung. Vorsicht, der Gleichstromwiderstand ist nicht mit der Leitungsimpedanz zu verwechseln.

    Der Pullup stellt sicher dass auf der Leitung ein positives Potential vorherscht (keine Aktion). Wenn irgend ein Teilnehmer die Leitung nach 0 zieht (ein Strom fliesst) können die anderen Teilnehmer erkennen dass der Bus belegt ist.

  • Die Pullup-Widerstände „ziehen“ die SDA und SCL Leitungen auf HIGH und sollen sicherstellen, dass der HIGH-Level der Betriebsspannung entspricht. Die Signale zum Datenaustausch entstehen dadurch, dass die Spannung durch den Sender auf LOW gezogen wird. Darum soll durch die Pullup-Widerstände sichergestellt werden, dass der HIGH Pegel von allen angeschlossenen Geräten auch als solcher „erkannt“ wird.


    Ergibt sich der Schleifenwiderstand eines Busses nicht aus seiner Leitungslänge? Oder ist das was anderes?


    Gruß Kai

  • Hallo zusammen,

    kurze Frage : bei mir läuft nun auch der BME280 und das OLED.

    Am I2C Bus des OLED habe ich die Widerstände auf PULL UP eingestellt auf I2C Bus vom BME 280 nicht.

    Laut Spezifikation wie Helmut sagt ist das nicht richtig.

    Kann mir jemand erklären was nun diese Widerstände machen ?

    Sind das Schleifenwiderstände wie man sie aus anderen Bussystemen kennt ?


    Gruss Frank.

  • Danke Helmut,

    Ich schrieb ja schon das alles klappt. Wichtig war *gegen x zu vertauschen. Und den BME280 geht nur auf Pin 21 und 22. sonst immer Fehlermeldungen.

    Ich bin schon bei Kapitel 13. Da hänge ich rum und bekomme auch immer eine Fehlermeldung.

    Gruß Andreas

  • Hallo Handre,


    lasse doch den Sensor einfach parallel auf den GPIO's laufen, auf denen Du das Display hast. I2C sieht bis zu ~120 Devices auf einem Bus vor. Dan braucht man doch keine 2 Busse zu belegen. Bei mir klappt diese Konfiguration einwandfrei.

    Sofern dein Display sauber arbeitet kannst Du davon ausgehen dass dieser Bus einwandfrei arbeitet.

    Hast Du auf dem Bus, an dem Du den Sensor betreibst externe PullUp-Widerstände installiert? Die Aktivierung der Interen kann ich in deinem Code nicht erkennen. Falls nicht, kann dies zu unvorhersehbaren Nebenerscheinungen führen. Du betreibst 2 unabhängige I2C Busse und jeder muss für sich mit PullUp Widerständen versorgt werden.

    Die I2C Spezifikation verlangt PullUp Widerstände, sowohl auf SDA als auch auf SCL.:!:


    Gruß

    Helmut

  • Danke caargoo

    Ich bin heute erst wieder an das Projekt gekommen.

    Danke für den Hinweis. Einige andere Sachen passten auch nicht.

    Jetzt klappt es und es kann weiter gehen.

  • Hat alles nicht geklappt;(

    Ich habe auch alles mal auf einen anderen ESP23 mit einem externen Oled Display. Stopuhr und BME280 (Testprogramm, ausgabe auf dem Bildschirm) klappt wunderbar. Wenn alles zusammen kommen soll kommt die gleiche Fehlermeldung.

    Ich würde so gerne mit den Lektionen weiter machen.

  • Das sieht mir sehr nach einem Problem aus, welches hier schon einmal besprochen wurde. Es hatte sich auf mehr oder weniger wundersame Weise gelöst.

    So wie ich das verstanden habe besteht der Verdacht, dass die "bme280_i2c.py" nicht korrekt auf den Controller geladen wurde.


    Evtl. löschst Du die Datei nochmal vom Mikrocontroller und lädst sie neu hoch.


    Gruß Kai

  • Hallo Freunde und René, ich bräuchte Hilfe

    Bis Lektion 8 lief alles gut die Werte wurden ordentlich auf dem Bildschirm ausgegeben auch die Stoppuhr klappte. Jetzt wo der BME auf das Display ausgegeben werden soll, kommen die Fehlermeldung. Ich habe div Eingänge probiert. Das kleine Testprogramm lief bei vielen Pin gut außer bei 27 und 26 nicht da ging die LED auf dem Board an und es kam eine Fehlermeldung.

    Für Hilfe wäre ich sehr dankbar

    Gruß Andreas


    community.hobbyelektroniker.ch/index.php?attachment/247/          pasted-from-clipboard.png



    Die Fehlermeldung unten:

    >>> %Run -c $EDITOR_CONTENT

    Traceback (most recent call last):

    File "<stdin>", line 20, in <module>

    File "bme280_i2c.py", line 86, in __init__ Hier habe ich auch nachgeschaut und hat mich nicht weiter gebracht

    File "bme280_i2c.py", line 97, in _read_chip_id

    OSError: [Errno 19] ENODEV

    >>>


    Das Program:


    from machine import Pin, I2C

    import bme280_i2c

    import time

    from ssd1306 import SSD1306_I2C


    #BME280

    i2c_bme = I2C(scl=Pin(5), sda=Pin(21),freq=10000)

    bme = bme280_i2c.BME280_I2C(0*76, i2c_bme) Hier ist die Zeile 20

    bme.set_measurement_settings({

    'filter': bme280_i2c.BME280_FILTER_COEFF_OFF,

    'osr_h': bme280_i2c.BME280_OVERSAMPLING_1X,

    'osr_p': bme280_i2c.BME280_OVERSAMPLING_1X,

    'osr_t': bme280_i2c.BME280_OVERSAMPLING_1X})


    #Anzeige

    i2c_oled = I2C(scl=Pin(15, Pin.OUT, Pin.PULL_UP), sda=Pin(4, Pin.OUT, Pin.PULL_UP))

    pin16 = Pin(16,Pin.OUT)

    pin16.on()

    oled = SSD1306_I2C(128,64,oled)

    #Hilfe für das Display

    def text_line(text, line, pos = 0):

    x = 10 * pos;

    y = (line) * 11

    oled.text(text,x,y)


    def anzeigen(temp, feuchte,druck):

    oled.fill(0)

    text_line("Temp.: {:5.1f} C".format(temp),1);

    text_line("Feuchte: {:3.0f} %".format(feuchte),3);

    text_line("Druck: {:5.0f} hPa".format(druck),5);

    oled.show()


    #Messung

    def messung_bme():

    bme.set_power_mod(bme280_i2c.BME280_Forced_MODE)

    time.sleep_ms(40)

    resultat = bme.get_measurement()

    return resultat["temperature"], reultat["humidity"], resultat["pressure"] / 100




    while 1:

    temp, feuchte, druck = messung_bme()

    anzeigen(temp, feuchte, druck)

    time.sleep(10)

    # {'pressure': 101412.0, 'humidity': 39.5, 'temperature': 27.86}