ESP32 Fehlermeldung beim Aufruf von DS3231 : OSError: [Errno 116] ETIMEDOUT

  • Moin,

    vorweg eine Bitte: meine Variablennamen sind tlw. Abkürzungen, ich ändere das gelegentlich:)

    1. Boot-Datei mit Zeitabfrage über DS3231
    2. "Script" zur Überwachung und Steuerung meiner Akkuanlage für PV-Module

    Wenn ich das "Testprogramm" laufen lasse, wird regelmäßig die Zeit mit "zeit_setzen" ohne Probleme abgefragt.

    Mein "Script" erzeugt bei der zweiten Abfrage von "zeit_setzen" immer einen OSError: [Errno 116] ETIMEDOUT?

    i2c.scan() ergibt :

    >>> i2c.scan()
    [80, 81, 82, 83, 84, 85, 86, 87, 104]
    >>>

    1. Boot

    meine kleines Testprogramm:

    Code
    # test_zeitabfrage.py   
    stunde=()				#i
    minute = 0
    sekunde = 0
    
    stunde, minute, sekunde = zeit_setzen()		#stunde, minute, sekunde)
    while True:
        print ("8   ",stunde, minute, sekunde)
        sleep(1)


    mein Script:

    die Fehlermeldung:

  • ESP32 Fehlermeldung beim Aufruf von DS3231 : OSError: [Errno 116] ETIMEDOUT? Schau mal ob du hier fündig wirst!

  • Kann es sein, dass deine MQTT Verbindung schon wieder "aufgelegt" hat?

    Vor dem senden der Message sollte man immer prüfen, ob die Verbindung noch steht. Wenn nicht, neu aufbauen und dann sofort senden.

    MQTT Connections haben (Einstellung am Master) eine max. Lebensdauer, nach der offene, aber unbenutzte Connections abgebrochen werden (Ressourcen sparen am Master).

  • Zu deinem Code:

    Setze die I2C-Frequenz manuell, 100kHz (default) reichen vollkommen aus... und ist für längere (falls du die hast) Leitungen robuster.

    Hier kannst du ggf. auch schneller oder langsamer werden... ich habe meist 50-100kHz.

    Code
    i2c = I2C(
        0,
        scl=Pin(33),
        sda=Pin(32),
        freq=100000
    )


    Auffällig (falsche Klammersetzung) ist die folgende Zeile:

    Code
    stunde = bcd2dec(data[2]+zeitzone & 0x3f)

    richtig ist:

    Code
    stunde = bcd2dec(data[2] + zeitzone) & 0x3f

    Die Klammerung ist falsch bzw. zumindest missverständlich. Durch die Operatorpriorität wird zuerst addiert und danach mit 0x3f maskiert. Das ist bei der BCD-Zeit aber nicht korrekt. Die Stunde muss zuerst aus BCD umgewandelt und danach die Zeitzone addiert werden:

    Wozu dient (in deinem Code) in Zeile 38 das sleep(3) ?

  • Sry, hab da noch was (ist mir eben erst aufgefallen):


    Im try - Block kannst du auch versuchen, I2C neu zu initialisieren, falls sich I2C abhängt:

    (Unten im Except...)

    Allerdings würde ich das Ecxept da (noch) nicht durchlaufen lassen, sondern erst ein i2c_neu_starten versuchen und dann erst abbrechen.

    Dazu musst du ggf. diesen Teil anders schreiben...

  • Moin,

    Vielen Dank.

    Reduzierung der Frequenz hatte ich schon erfolglos versucht. Meine ganze Schaltung ist auf einer Platine, also ganz kurze Leitung.

    Seltsam ist, dass der Fehler immer beim 2. Aufruf passiert. Habe jetzt als Zwischenlösung eine geänderte boot.py genommen, bei der auf die lokale Zeit ohne ds3231 greift. So funktioniert es deutlich besser, der Fehler tritt nur alle paar Stunden auf😪

    Neuinitialisierung probiere ich aus.

    Wenn alles nicht nachhaltig funktioniert, werde ich bei zeit_setzen die ermittelte Stunde auch in stunde_alt speichern und beim Auftreten des Fehlers stunde=stunde_alt setzen. Das ist bei dem Programm nicht kritisch.

    Umrechnung der Zeit, insbesondere die Ergänzung um "Modulo %24 " kannte ich noch nicht.

    38 sleep(3) hat keine Bedeutung - wird gelöscht.

  • Setze print(i2c.scan()) mal vor data = i2c.readfrom_mem(DS3231_I2C_ADDR, 0x00, 7) anhand der Ausgabe siehst du ob dort schon ein Timeout entsteht.

    Ich würde eher auf Thonny mit Start/Stop tippen. Ob da jedes mal immer alles neu initialisiert wird oder nicht, hm da gab es immer mal wieder merkwürdige Sachen. An sich ist die W-Lan-Verbindung in der boot.py okay, der Rest gehört in die main.py. Dann ist das i2c-Objekt auch dort wo es benutzt wird. Mache den Test mal neu und zwar so, das i2c in der Datei erstellt wird, die den Test enthält.

    🎧 Hate the jocks, the preps, the hippie fuckin' scumbags.
    Heavy-metalers with their awful, pussy hairbands.
    Counting seconds until we can get away.
    Ditching school almost every single day, oh, yeah 🎧

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!