micropython: interrupt-handler routine in einem Programm mit Sensorabfrage nutzen

  • Moin,

    sorry für den Titel, aber die Stichworte sind zutreffend.

    In meinem Programm werden 3 Temperatursensoren ausgelesen und die Werte auf einer kleinen Website dargestellt. Ich möchte zusätzlich die Werte des Gaszählers über die Addition der Verbrauchsimpulse erfassen. Das funktioniert mit "Interrupt-Handler" gut Beide Programme funktionieren für sich, aber wie bekomme ich die Interrupt-Routine in das "Sensor" Programm integriert?

    Im "Sensor-Programm" habe ich teilweise schon die Definitionen des anderen eingefügt, aber ich komme nicht weiter:

    Das Programm für die Interrupt-Abfrage:

    Das Problem liegt mE darin, dass die Abfrage des IRQ laufend erfolgen muss, während die Aktualisierung der Temperaturdaten nur dann erfolgt, wenn Abfragewebsite aufgerufen/aktualisiert wird. Dabei ist eine laufende Aktualisierung der Website nicht notwendig, wenn ein IRQ ausgelöst wird. Hintergrund: Die Temperaturdaten lese ich mit einem Raspi häufiger aus, die Zählerdaten einmal am Tag.

    (Bitte keine anderen Fragestellungen z.B. w/ der HTML-Seite thematisieren ;) )

  • micropython: interrupt-handler routine in einem Programm mit Sensorabfrage nutzen? Schau mal ob du hier fündig wirst!

  • Sorry, Du hast recht. Daran habe ich nicht gedacht, weil ich auf meine Frage hier beim Beitrag direkt keine Antwort oder Reaktion aus dem Forum erhalten habe. "WillyR_aus_C" hat meine "Versuche" in mehreren Schritten µP konform aufbereitet. Ich muss nur ( ;) ) noch das Prellen des Kontakts lösen oder auf einen Hall-Sensor umstellen.

    Hier das Script:

    Einmal editiert, zuletzt von Hajulied (1. Februar 2023 um 19:36)

  • Hallo,

    du musst nach der ersten Erkennung eines Signals, für eine definierte Zeit, alle weiteren Signale ignorieren.

    Das geht wenn du den Zeitpunkt des ersten Signal nimmst und bei jedem weiteren Signal die Differenz betrachtest und entsprechend entscheidest.

    Grüße

    Dennis

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

  • Hallo,

    da das hier doch ein Projekt ist, von dem man öfters liest, wäre es nicht so toll, wenn oben gezeigter Code hierfür als Kopiervorlage dient.

    Meiner Meinung nach ist der sehr chaotisch und enthält auch viel überflüssigen Code.

    Ich schreibe heute dennoch keine Anmerkungen dazu, weil ich so gut wie alles anderes machen würde, deswegen poste ich einfach mal den Stand meiner überarbeiteten Version. Wenn jemand Interesse daran hat und den testen kann, helfe ich auch gerne weiter, bis er ordentlich funktioniert.

    Ich habe die Sensoren nicht und habe versucht mich am gezeigten Code, der ja macht was er soll, zu orientieren.

    Du brauchst W-Lan bevor alles losgeht, also würde ich den Teil mal hier raus werfen und in die boot.py schreiben:

    Das kann man in der Doku nachlesen.

    Der Rest würde bei mir bis jetzt so aussehen:

    Grüße

    Dennis

    Edit: Gerade zufällig gesehen, im weiteren Überarbeitungsschritt würde ich die 'with'-Statemantes für die Verbindung einbauen und auch die HTML-Seite könnte man wie hier von __blackjack__ umsetzen.

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

    Einmal editiert, zuletzt von Dennis89 (19. Februar 2023 um 16:27)

  • Moin,

    Deine Idee finde ich grundsätzlich gut.

    Da ich nur sehr wenig Kenntnisse über mpy habe, nehme ich mir immer erst eine Baustelle von mehreren vor, versuche sie zu lösen und widme mich dann der nächsten. Darunter leidet zwar für einen Profi die Strukturerwartung, aber mir hilft es ein wenig.

    Bei dem vorliegenden Script taucht folgender Fehler auf:

    Code
    24.1875    # habe ich eingefügt, um zu prüfen, ob die Definition aufgerufen wird 
    Traceback (most recent call last):
      File "<stdin>", line 120, in <module>
      File "<stdin>", line 111, in main
      File "<stdin>", line 50, in get_website
    ValueError: need more than 0 values to unpack
    
    der Fehler bezieht sich auf folgende Zeile :
    vorlauf, ruecklauf, aussen = position_to_temperature
  • Hallo,

    Beim zweiten Fehler habe ich ein Argument vergessen, Zeile 25 muss so aussehen

    Code
    def toggle_led(self, pin):

    Zum ersten Fehler, wie und wo hast du genau die 25.1875 eingetragen?

    Das muss in Form eines Dictonarys sein.

    Also so:

    Code
    position_to_temperature = {
        "vorlauf": 25,
        "ruecklauf": 20,
        "aussen": 30,
    }

    Grüße

    Dennis

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

  • Okay,

    kannst du mal die Funktion so ändern:

    und die Ausgabe posten?

    Grüße

    Dennis

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

  • hier die Ausgabe, habe wieder eine print - Anweisung eingefügt:

    bytearray(b'(\xffd\x0e\x7f\\0g')

    27.875

    Traceback (most recent call last):

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

    File "<stdin>", line 128, in main

    File "<stdin>", line 67, in get_website

    ValueError: need more than 0 values to unpack

    es scheint, als läge der Fehler in der darauf folgenden For-Schleife:

  • Das Problem ist, dass 'rom' nicht zu den gegebenen Bytearrays passt, die ich aus dem vorherigen Code übernommen habe.

    Dadurch ist die if-Abfrage nicht wahr, das Dictonary wird nicht befühlt und 'get_website' kann es auch nicht entpacken.

    Ich hätte auch mehr wie ein Bytearry erwartet oder ich habe den vorherigen Code falsch interpretiert.

    Was kommt den hier raus?

    Grüße

    Dennis

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

  • .... das Byte-Array für einen Sensor hatte ich angepasst. Für meine Tests habe ich nur einen Sensor angeschlossen, In der finalen Version benutze ich 4 Sensoren mit den angepassten Arrays .

    Hier die Ausgabe:

    ich habe noch nicht verstanden, warum das Design der Website geändert werden soll. Ich brauche sie nur als Hilfsmittel für das periodische Auslesen mit einem Raspi per WLAN. Dabei greife ich auf die festen Positionen der Werte zu, nicht über "parsen". Die bisherige Version hat hier gut funktioniert.

  • Für meine Tests habe ich nur einen Sensor angeschlossen

    Achso, okay das erklärt einiges.


    warum das Design der Website geändert werden soll

    Wer hat gesagt, dass die Webseite geändert werden soll?

    Jetzt muss man die richtigen Bytearrays noch eintragen. Wird ein Bytearray nicht gefunden, wird der Wert 'None' gesetzt. Welche Auswirkung das auf deine Webseite haben soll, muss man klären.

    Grüße

    Dennis

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

  • Moin,

    die Fehlermeldung lautet jetzt(ich habe wieder print eingefügt). Sie erscheint, sobald die Webseite aufgerufen wird.

    Code
    bytearray(b'(\xffd\x0e\x7f\\0g')
    23.375
    Traceback (most recent call last):
      File "<stdin>", line 121, in <module>
      File "<stdin>", line 112, in main
      File "<stdin>", line 66, in get_website
    TypeError: can't convert 'NoneType' object to str implicitly

    ist die if Abfrage so richtig?

     for key, value in POSITION_TO_SENSOR.items():
    position_to_temperature[key] = temperature if rom == key else None

  • Hallo,

    ja die Abfrage passt, das ist einfach kürzer geschrieben.

    Das Problem ist, das der Typ 'None' nicht in dem Html dargestellt werden kann. Zu Testzwecken kannst du einfach mal das 'None' in der gezeigten Abfrage dur eine 0 ersetzen.

    Dann zeigt dir die Webseite eine 0 an, wenn der Sensor nicht vorhanden ist oder das Bytearry nicht stimmt.

    Das finde ich nicht gut, vorallem nicht im Winter, wenn es um die 0° außen hat. Da müsste man noch überlegen, wie man Fehler dargestellt haben will und dass dann noch einbauen.

    Grüße

    Dennis

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

Jetzt mitmachen!

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