ich benötige mal wieder etwas Hilfe.
Ich versuche gerade ab und zu an einem Projekt mit einem Raspberry Pi mt zu helfen.
Es soll ein Feuchtigkeitssensor ausgelesen werden, dieser liefert je nach Feuchtigkeit eine unterschiedliche Frequenz.
Nun bin ich auf der Suche wie ich das mit 'gpiozero' umsetzen kann. Da ich den Sensor nicht da habe, aber noch einen ESP8622, habe ich mit diesem eine Frequenz von 1kHz (mehr geht nicht) erzeugt und konnte diese dann mit diesem Code auslesen:
Code: Alles auswählen
from gpiozero import Button
from time import monotonic
from gpiozero.pins.pigpio import PiGPIOFactory
# Giesomat is the name of the sensor
GIESOMAT_PIN = 21
class Counter:
def __init__(self):
self.edges = 0
def count_edge(self, pin):
self.edges += 1
def measure_frequency(counter):
start = monotonic()
while True:
if (monotonic() - start) >= 10:
duration = monotonic() - start
break
return counter.edges / duration
def main():
factory = PiGPIOFactory()
giesomat = Button(GIESOMAT_PIN, pin_factory=factory)
counter = Counter()
giesomat.when_activated = counter.count_edge
print(measure_frequency(counter))
if __name__ == "__main__":
main()
Ohne 'pin_factory' habe ich eine viel zu geringe Frequenz erhalten. Ich hatte das Gefühl, dass 'gpiozero' mit dem zählen nicht hinter her kommt.
Das ist jetzt ja schon etwas Code. Laut Doku kann man mit steigende oder fallende Flanken mit 'wait_for_press' bzw. 'wait_for_release' abfragen. Das wäre dann dieser Code:
Code: Alles auswählen
from gpiozero import Button
from time import monotonic
from gpiozero.pins.pigpio import PiGPIOFactory
# Giesomat is the name of the sensor
GIESOMAT_PIN = 21
MEASURE_POINTS = 4000
def measure_frequency(giesomat):
start = monotonic()
for _ in range(MEASURE_POINTS):
giesomat.wait_for_release()
return MEASURE_POINTS // (monotonic() - start)
def main():
factory = PiGPIOFactory()
giesomat = Button(GIESOMAT_PIN, pin_factory=factory)
print(measure_frequency(giesomat))
if __name__ == "__main__":
main()
Was mich etwas wundert (oder bin ich vielleicht etwas verwöhnt), das es dafür nichts fertiges von gpiozero' gibt.
In der Doku habe ich dann eine Basis Klasse von 'Pin' gefunden, auf der man frequency aufrufen kann. Mal abgesehen davon, das ich nicht weis ob dass dafür da ist, die eingestellte Frequenz eines PWM-Pins auszugeben oder ob das tatsächlich dafür da ist, eingehende Frequenz zu messen, wie nutze ich diese Pin-Klasse?
Wenn ich mal den Code der Pin-Klasse anschaue, dann sehe ich nur, dass die Klasse ein 'object' erwartet. Ich weis aber gar nicht wie ich damit umgehen soll.
In erster Linie wäre es mal sehr hilfreich für mich, unabhängig vom Problem, was ist das für eine Pin-Klasse? Was macht die und wie kann ich die nutzen? Meine Vermutung ist, dass die "intern" benutzt wird, wenn ich zum Beispiel einen Button oder ähnliches erstelle.
Zu letzt verwundert mich, das wenn ich meinen zweiten Code mit 'RPi' schreibe, dann funktioniert das. Das wäre dann soetwas (hoffe ich habe es noch richtig im Kopf):
Code: Alles auswählen
from RPi import GPIO
from time import monotonic
# Giesomat is the name of the sensor
GIESOMAT_PIN = 21
MEASURE_POINTS = 4000
def measure_frequency():
start = monotonic()
for _ in range(MEASURE_POINTS):
GPIO.wait_for_edge(GIESOMAT_PIN, GPIO.FALLING)
return MEASURE_POINTS // (monotonic() - start)
def main():
try:
GPIO.setmode(GPIO.BCM)
GPIO.setup(GIESOMAT_PIN, GPIO.IN)
print(measure_frequency())
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()
Danke schon mal für eure Hilfe.
Grüße
Dennis