ralphi: Gaszähler auslesen - Interrupt

Hallo Leute,

es gibt mit Sicherheit auch einige, die sich mit Interrupt – Handling auskennen :-)

Nun – ich möchte meinen Gaszähler auslesen. Dazu hab ich einen Reedschalter angepappt und einen Banana Pi (Raspinachfolger) drangehängt. GPIO 17 – Reed - +3,3V.

Installiert ist Debian und das Prog läuft mit DaemonTools im Hintergrund.
Leider hab ich für PHP nix gefunden und verwende jetzt Python.

#!/usr/bin/python  
import RPi.GPIO as GPIO  
import time  
import subprocess  
import shlex  
  
GPIO.setmode(GPIO.BCM)  
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  
  
  
while True:  
  
    GPIO.wait_for_edge(17, GPIO.RISING)  
    subprocess.call("php /myprogs/gas/gas.php", shell=True)  
  
GPIO.cleanup() 

Obwohl ich, wenn Gas strömt, mit dem Multimeter, ca 2 sec durchgeschalten und ca. 15 sec off messe, bekommt das Prog nur sporadisch Einige (20%) mit.
Hab auch schon einen Kondensator 33n dazwischen geklemmt, sollte es prellen.

Irgendeine Idee, was ich noch testen könnte? :-|

Viele Grüße aus LA

--
ralphi
  1. So wie ich einen Interrupt verstehe ist das eine Subroutine die aufgerufen wird sobald ein Signal anliegt. Ich gestehe die Python Syntax nicht zu kennen aber dein Code sieht nicht nach Interrupt aus denn du legst das Programm schlafen bis etwas passiert. Vielleicht ist das dein Problem, dass du den Pin als Interrupt-Trigger schaltest und ihn dann aber doch anders abrufst?

    Hab auch schon einen Kondensator 33n dazwischen geklemmt, sollte es prellen.

    Das würde ich per Software entprellen. Wenn ein Signal kommt, ignoriere den Eingang für die nächsten paar Sekunden und schalte ihn dann erst wieder scharf. Darfst halt kein olympisches Feuer betreiben das den Zähler schneller dreht als dein Programm ihn abfragt.
    Ob der Kondensator wirklich alles entprellt müsstest du am besten am Oszi anschauen. Wie hast du den Wert bestimmt?

    Hast du das als erstes mit einem einfachen Schalter versucht? Damit testet es sich viel einfacher.

    1. Hast du das als erstes mit einem einfachen Schalter versucht? Damit testet es sich viel einfacher.

      Mit brücken futzts.
      Ich schau mir mal den Spannungsverlauf an, vielleicht schließt der Reed ja nicht richtig.

      Viele Grüße aus LA

      --
      ralphi
      1. Am einfachsten brückst du eine Taschenlampe mit dem Reed. Dann siehst du sofort ob der richtig schaltet oder nicht.
        Hast du ihn richtig rum angebracht? Ein Reedkontakt will in eine bestimmte Richtung gezogen werden damit er schließt. Ist er nahe genug dran? Du hast ihn hoffentlich nicht in einem Metallgehäuse verbaut :-)

        1. was steht überall - „man sollte vorsichtig mit dem Glasröhrchen sein!“
          grrr- hab ihn kapputt gemacht (war auch noch aus meinem alten Fundus ca. 25 Jahre alt)
          Bestell mir neue (bei Pollin hab ich welche gesehen)

          Nun beim Einbau hab ich nicht viel Möglichkeiten:
          Ich kann ihn leicht versetzt zum Zahlenrad mit Magnet kleben. Damit geht das Magnetfeld schräg durch. Müsste reichen - zumindest hatte mein Durchgangsprüfer gepeept.

          Photo - Zähler von unten

          Der Magnet ist in der Ziffer 6. Der Reed wird unten montiert (Ist ne Aussparung längs).

          Photo - Zähler metrix

          Viele Grüße aus LA

          --
          ralphi
          1. falsche URL für Bilder genommen :-(

            Photo - Zähler

            Der Magnet ist in der Ziffer 6. Der Reed wird unten montiert (Ist ne Aussparung längs).

            Photo - Zähler von unten

            Photo - Zähler von unten

            Viele Grüße aus LA

            --
            ralphi
            1. Hallo ralphi,

              Der Magnet ist in der Ziffer 6. Der Reed wird unten montiert (Ist ne Aussparung längs).

              wie hast du denn den Magneten da rein gekriegt?

              Gruß, Jürgen

              1. Hi,

                Angeblich haben ALLE Metrix-Zähler mit Typ-Bezeichnung L hinten einen Magneten im letzten Rädchen.
                Da ist ein silberner Punkt in der 6.
                D.h. 1 Umdrehung = 10 Liter

                Auch angeblich, ist der, den ich hab - 8G4L, am meisten verbreitet.
                Es gibt auch ein fertiges Modul (NI-3 Impulsnehmer) zu kaufen (ca. 30 teuros).
                Kannst du hier kucken.

                Viele Grüße aus LA

                --
                ralphi
          2. Ich kann ihn leicht versetzt zum Zahlenrad mit Magnet kleben.

            Der Vollständigkeit halber, nachdem du ja sagst der Piepser piept:
            Ich meinte die Drehung um die Achse der Anschlüsse. Sieh dir hier Reed-Wiki das oberste Bild an. Der Schalter schließt wenn das Magnetfeld in der Achse oben-unten liegt und einen der Kontakte auf den anderen zieht.
            Wenn das Magnetfeld stattdessen in Blickrichtung verläuft kann es nichts schließen. Dann müsstest du den Schalter um 90° drehen. Die Anschlüsse sind dann immer noch auf der selben Seite. Auf dem Bild sieht man nicht wie der Kontakt liegt.

            Da bleibt nicht viel übrig als die Komponenten nochmal einzeln zu testen. Reed am Zähler funktioniert? Sicherer Kontakt am Banana funktioniert mit selben Impulszeiten wie der Zähler liefert?
            Dann wüsste ich nicht warum das Zusammenspiel plötzlich nicht funktionieren sollte :-(

            1. So dala – Reedschalter sind von Pollin eingetroffen.
              Sind auch wesentlich empfindlicher als der Uralte.

              Hab jetzt den GPIO einen externen Pullup verpasst und schalte auf GND. Trotz Kondensator, zählt er ab und zu (ca. alle 10 mal) doppelt. D.h. beim Schließen und beim Öffnen.
              Ist aber kein großes Problem. Ein Durchlauf dauert ca. 18 sec. Die Schließdauer ca. 6 sec. D.h. ich zähle nur wenn Intervall > 10 sec.

              Bis jetzt erfasse ich alle Durchgänge korrekt - hehe :-)

              Was ich bislang nicht wusste:
              Der Brenner hat eine Intervallschaltung. Ca. 6 min an und 7 min aus. In der An-Phase strömen ca. 200 lit. => ca. 10 Cent.
              Bin gespannt, ob ich Zeiten finde, wo ich einsparen kann (Brenner aus).

              Viele Grüße aus LA

              --
              ralphi
              1. Hallo,

                Hab jetzt den GPIO einen externen Pullup verpasst und schalte auf GND. Trotz Kondensator, zählt er ab und zu (ca. alle 10 mal) doppelt. D.h. beim Schließen und beim Öffnen.

                dieses Kontaktprellen wirst du wahrscheinlich immer haben - es sei denn, du machst das RC-Glied so "lang", dass der Pegel am GPIO-Eingang nur noch ganz langsam von 0 nach 1 schleicht (oder umgekehrt). Dann haben aber die Gatter am Eingang oft Probleme, sauber zu schalten.
                Wenn man es richtig machen will, müsste man ein RC-Glied _und_ einen "Schmitt-Tiger mit Hysterie" einsetzen.

                Ist aber kein großes Problem. Ein Durchlauf dauert ca. 18 sec. Die Schließdauer ca. 6 sec. D.h. ich zähle nur wenn Intervall > 10 sec.

                Also Entprellung per Software. Auch 'ne Möglichkeit. ;-)

                Der Brenner hat eine Intervallschaltung. Ca. 6 min an und 7 min aus. In der An-Phase strömen ca. 200 lit. => ca. 10 Cent.

                Das ist vermutlich vom Leistungsbedarf abhängig. Möglicherweise hat der Brenner kein Regelventil, mit dem die Gasmenge reguliert wird, sondern wird nur über diese Taktzeiten in der Leistung reguliert. Die meisten Backöfen, Bügeleisen, Heizlüfter etc. machen das auch so.

                Bin gespannt, ob ich Zeiten finde, wo ich einsparen kann (Brenner aus).

                Was mich bei Heizungsanlagen oft stört: Wenn sie über Nacht komplett abgestellt werden. Denn wann ist das Gefälle zwischen Innen- und Außentemperatur besonders groß? Genau, nachts wenn's kalt ist. Dann ist morgens die Wohnung ausgekühlt, und man braucht erstmal für kurze Zeit eine wesentlich höhere Heizleistung, um wieder auf "Betriebstemperatur" zu kommen.
                Eine Absenkung (nicht Komplett-Abschaltung) halte ich für wesentlich sinnvoller.

                In vielen Haushalten wäre sogar eine Absenkung der Heizung tagsüber sinnvoll, wenn niemand zuhause ist.

                So long,
                 Martin

                --
                Bis du einen Prinzen findest, musst du viele Frösche küssen.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hallo,

    es gibt mit Sicherheit auch einige, die sich mit Interrupt – Handling auskennen :-)

    nein, aber vielleicht mit Interrupt-Handling. ;-)
    Merke: Ein Bindestrich soll binden, nicht trennen. Deshalb hat er niemals Leerzeichen davor oder danach.

    Nun – ich möchte meinen Gaszähler auslesen. Dazu hab ich einen Reedschalter angepappt und einen Banana Pi (Raspinachfolger) drangehängt. GPIO 17 – Reed - +3,3V.

    Klingt gut.

    Installiert ist Debian und das Prog läuft mit DaemonTools im Hintergrund.
    Leider hab ich für PHP nix gefunden und verwende jetzt Python.

    Nun habe ich von Python (noch) nicht viel Ahnung, aber ich vermute, dass es als typische Scriptsprache nicht wirklich Interrupts nutzt, sondern eher eine zyklische Abfrage (Polling).

    Obwohl ich, wenn Gas strömt, mit dem Multimeter, ca 2 sec durchgeschalten und ca. 15 sec off messe, bekommt das Prog nur sporadisch Einige (20%) mit.

    Das heißt, die Impulse sind eigentlich sehr langsam. Dauern gefühlte Ewigkeiten und noch mehr Ewigkeiten bis zum nächsten Impuls. Hast du schon mal versucht, in der Schleife einfach stur den aktuellen Eingangswert des GPIO-Pins zu lesen und mit dem Wert des vorherigen Schleifendurchlaufs zu vergleichen? Weil ... keine Ahnung, wie zuverlässig die Methode wait_for_edge() arbeitet.

    Hab auch schon einen Kondensator 33n dazwischen geklemmt, sollte es prellen.

    Wenn du Impulse verlierst, anstatt unverhofft mehr als erwartet zu registrieren, ist Prellen nicht dein Problem.

    So long,
     Martin

    --
    Schildkröten können mehr über den Weg berichten als Hasen.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi Martin,

      Nun – ich möchte meinen Gaszähler auslesen. Dazu hab ich einen Reedschalter angepappt und einen Banana Pi (Raspinachfolger) drangehängt. GPIO 17 – Reed - +3,3V.

      Klingt gut.

      Man glaubt gar nicht, was man da alles googeln kann:
      Einige stellen Cams auf und versuchen mit Texterkennung den Zählerstand zu ermitteln ;-)
      Bin eigentlich durch Zufall auf den Magneten gestoßen.

      Das heißt, die Impulse sind eigentlich sehr langsam. Dauern gefühlte Ewigkeiten und noch mehr Ewigkeiten bis zum nächsten Impuls. Hast du schon mal versucht, in der Schleife einfach stur den aktuellen Eingangswert des GPIO-Pins zu lesen und mit dem Wert des vorherigen Schleifendurchlaufs zu vergleichen? Weil ... keine Ahnung, wie zuverlässig die Methode wait_for_edge() arbeitet.

      Normalerweise müsste ja ein kleiner 8-pin µC mit Sender und Akku, dass leisten, anstatt einen kompletten Linuxserver abzustellen.

      Hab nur noch kein Rezept zum Nachbauen gefunden?

      Viele Grüße aus LA

      --
      ralphi