GPIO Zähler in Datei speichern

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
dige
User
Beiträge: 2
Registriert: Dienstag 20. Dezember 2016, 21:53

[codebox=text file=Unbenannt.txt]Hallo ich möchte einen GPIO Zähler in eine Datei speichern funktioniert auch soweit gut nur nach einem Neustart fängt der Zähler jedoch wieder bei null an, möchte jedoch auch nach einem Neustart fortlaufend weiter zählen. Vielleicht kann jemand mal einen Blick auf den Code werfen und mir sagen wo der Fehler liegt.[/code]

Code: Alles auswählen

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

Counter = 0


GPIO.setmode(GPIO.BCM)  


GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)


# ISR
def Interrupt(channel):  

	global Counter

 

	datei = open('wasserzaehler.txt','r')
	datei.read()
	datei.close()
	
	Counter = Counter + 1	

	datei = open('wasserzaehler.txt','w')
	datei.write(str(Counter))
	datei.close()



GPIO.add_event_detect(24, GPIO.RISING, callback = Interrupt, bouncetime = 200)   
  

while True:
	time.sleep(1)
BlackJack

@dige: Du liest den Inhalt der Datei und *machst dann rein gar nichts damit*. Die `read()`-Methode hat den Dateiinhalt als Rückgabewert. Du möchtest die Zeichenkette in eine Zahl umwandeln und an den Namen `Counter` binden (eigentlich an `counter`, siehe Style Guide for Python Code) und bitte das ``global`` entfernen und vergessen das es dieses Schlüsselwort überhaupt gibt.

Die Funktion würde ich auch nicht `Interrupt` nennen, sondern einen Namen wählen der aussagt was diese Funktion tut. Dabei kann dann auch der `ISR`-Kommentar weg, denn das ist sicher keine „Interrupt Service Routine“. Selbst falls da irgendwo ein paar Ebenen näher an der Hardware eine solche involviert sein *sollte*, das ist nichts was es auf der Sprachebene von Python gibt.

Dateien sollte man zusammen mit der ``with``-Anweisung öffnen, dann ist das schliessen unter allen Umständen garantiert.

Code auf Modulebene sollte nur Konstanten, Funktionen, und Klassen definieren. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Unter Linux kann man effizienter mit `signal.pause()` aktiv nichts tun. Oder aber man macht das Warten auf die Flanke nicht asynchron wenn man gar nicht wirklich etwas anderes an der Stelle parallel machen will.
BlackJack

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import errno
from RPi import GPIO

WATER_METER_FILENAME = 'wasserzaehler.txt'
WATER_METER_PIN = 24


def count_edge():
    """Count the edge triggered by the water meter.

    The counter value is read from and written to
    :data:`WATER_METER_FILENAME`.  It starts at 0 if the file does not
    exist prior to calling this function.
    """
    try:
        with open(WATER_METER_FILENAME, 'r') as counter_file:
            counter = int(counter_file.read())
    except IOError as error:
        if error.errno != errno.ENOENT:
            raise
        counter = 0

    counter += 1

    with open(WATER_METER_FILENAME, 'w') as counter_file:
        counter_file.write(str(counter))
 
 
def main():
    """Set up the GPIOs and count rising edges triggered by the water
    meter on pin :data:`WATER_METER_PIN`.
    """
    try:     
        GPIO.setmode(GPIO.BCM)  
        GPIO.setup(WATER_METER_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
        while True:
            GPIO.wait_for_edge(WATER_METER_PIN, GPIO.RISING)
            count_edge()
    finally:
        GPIO.cleanup()


if __name__ == '__main__':
    main()
dige
User
Beiträge: 2
Registriert: Dienstag 20. Dezember 2016, 21:53

[codebox=text file=Unbenannt.txt]Hallo BlackJack vielen Dank für deine schnelle Hilfe funktioniert prima ohne deine Hilfe hätte es wahrscheinlich die ganzen Weihnachtstage gedauet bis ich das so am laufen hätte. Vielen Dank :D [/code]
Antworten