Drehzahlmessung realisieren

  • Hallo zusammen!

    Ich verfolge das Thema Raspberry Pi nun seit einigen Jahren und habe immer wieder kleinere Projekte umgesetzt.

    Nun komme ich allerdings an einen Punkt, an dem ich ohne Hilfe anscheinend nicht weiter komme.


    Ich muss die Drehzahl eines Anemometers auswerten. Das Anemometer besitzt zwei Reed-Kontakte.

    Ich habe an das erste Kabel des Anemometers 3.3V+ gegeben, das zweite Kabel an GPIO20 angeschlossen (inkl. PullDown-Widerstand).


    Ich programmiere in Python 3, das hier ist aktuell Stand der Dinge, so auch nicht richtig, dass ist mir bewusst.


    Mir fehlt einfach der richtige Ansatz, ich möchte die Interrupts (High's) zählen, welche ich in einer definierbaren Zeit(s) erhalte.


    Hier mein bisheriger Code:


    Jede ganze Zahl ist eine volle Umdrehung des Windrades, daher i = i + 0.5, sprich jede Ganzzahl in I ist eine Umdrehung.



    Ich muss unterm Strich ein tkinter-Fenster haben, in dem immer die Aktuelle Windgeschwindigkeit abzulesen ist.


    Die Umrechnungen zur Windgeschwindigkeit mache ich später selbst, ich benötige bitte nur Hilfe bei der Auswertung der Drehzahl.


    Vielen lieben Dank!:danke_ATDE:

  • Hallo,

    so hätt ich jetzt fast übersehen, da du das falsche Unterforum erwischt hast. Dein Thread wär besser im Forum Python aufgehoben gewesen ;)


    Ob ich dir bis ans Ziel helfen kann, mag ich vorab nicht versprechen. Allerdings folgende Tipps und Anmerkungen:


    Statt RPi.GPIO würde ich gpiozero verwenden.


    Python
    1. while s < 1:
    2. print (str(i))
    3. time.sleep (0.1)
    4. s = s + 0.1

    Anhand deines Kommentares oben soll s ms entsprechen. Was aber wenn der Interrupt ausgelöst wird? Die Zeit welche für die Abarbeitung in der Funktion vergeht wird nicht beachtet. Siehe folgendes Beispiel:


  • Hallo Hofei!


    Das war genau der Denkanstoß den ich gebraucht habe, mit folgendem Code habe ich die Anzahl der Umdrehungen einmal pro Sekunde ausgegeben.

    Diese werde ich nun in eine Textdatei schreiben und diese entweder mit matplotlib oder tkinter ausgeben.


    Deinen Ratschlag gpiozero zu verwenden werde ich zu einem anderen Zeitpunkt gerne auffassen, im Moment muss ich jedoch dieses Projekt beenden.


    Die Angabe ms war mein erster Gedanke zur Umsetzung, hatten im Code also nicht mehr zu suchen :)


    Sollte ich weitere Fragen haben werde ich mich melden :)


  • Das Wichtigste zuerst:

    Wenn eine Bedingung bekannt ist, dann nimmt man eine for-Schleife und keine while-Schleife.


    Du kannst zB mit itertools.count hoch zählen.

    Tasten betaetigungen in einem Zeitraum zaehlen. Z.b. 3 x in 2 Sekunden. gpiozero, Python3


    oder du schreibst eine Klasse:

    Tasten betaetigungen in einem Zeitraum zaehlen. Z.b. 3 x in 2 Sekunden. gpiozero, Python3

  • Hallo zusammen,

    so langsam fange ich an zu verzweifeln...


    Der übersichthalber habe ich meinen Ursprungscode mal ausgedünnt, alles was ich nicht benötige ist rausgeflogen:



    Mit diesem Code schreibe ich nun immer einen Wert t (Zeit in Sekunden) und meinen i-Wert (aktuelle Windgeschwindigkeit) in die Datei werte.json.


    Mit dem folgenden Code lese ich die Datei werte.json wieder aus und lasse sie als Graph darstellen.



    Beim Graphen treten allerdings viele Probleme gleichzeitig auf:


    -Die Datei werte.json wird immer voller, nach bereits ca. 20 Sekunden kommt der Graph mit dem plotten nicht mehr nach, er plottet dann immer mehr Werte gleichzeitig, die Zeit bis zum nächsten Plot wird immer größer.

    -Mit jedem neuen Wert ändert sich die Farbe des Graphen


    Versucht habe ich bereits:


    -Die Datei werte.json nach 10x Wert schreiben zu löschen, das funktioniert auch, jedoch setzt der Graph dann zwei werte aus, z.B. 10 und 11 bevor er wieder schreibt.


    Das schreiben des Graphen in den Hauptprogrammcode zu integrieren, hierbei bin ich jedoch insofern gescheitert, dass entweder nicht weiter gezählt wird, oder der Graph nichts darstellt.


    Die Ideallösung wäre nun den Code der den Graph darstellt in den Hauptcode zu integrieren, wenn möglich gänzlich ohne die werte.json, direkt aus der main() heraus.


    Vielen Dank für eure bemühungen!

  • Hallo,

    leider habe ich selbst noch nie mit mathplot gearbeitet. Gibt es hierbei eine Funktion, dass ich nicht den kompletten Graph neu erstellt sondern nur anfügt?

    Wenn ja, erstelle dir eine Funktion welche die neuen Daten entgegen nimmt als Parameter, diese Funktion startest du per seperaten Thread, dann sollte auch die Messung nicht beeinflusst werden.

  • In deinem Code sind diverse Dinge falsch.


    • Variablen werden initialisiert und nie genutzt
    • Nutzung von global sollte vermieden werden
    • Allgemein solltest du nicht auf Moduleben arbeiten, dort gehören nur imports, die Definitionen von Klassen und/oder Funktionen und das ifmain hin.
    • Man sollte für das öffnen von Dateien immer with verwenden
    • Du verwendest Python 3 print-Aufrufe als Funktion, aber einen Python 2 Shebang
    • Du schreibst eine Datei mit der Endung JSON, baust aber deinen eigenen String zusammen, sodass am Ende u.U. nicht mal gültiges JSON in der Datei landet – das verwirrt
    • Wie du bemerkt hast solltest du den Weg über die Datei komplett weg lassen, das ist ineffizient und fehleranfällig.
    • Wie man mit matplotlib ( Hofei : ohne h ;)) einen Plot erstellt und dessen Werte aktualisiert, ist hier gezeigt: https://stackoverflow.com/a/4098938/5952681
    • Schau' dir mal gpiozero an, im speziellen z.B. die Klasse Pin und deren Attribute when_changed und edges.
  • Hallo Hofei,

    die Messung wird nicht beeinflusst während der Graph schreibt, es wird immer brav in die werte.json geschrieben.

    So wie ich es verstanden habe, schreibt matplotlib jedes mal wenn ein neuer Wert kommt den kompletten Graphen neu.

    Da die werte.json aber mit jeder Sekunde um eine Zeile wächst, kommt der Graph nach kurzer Zeit nichtmehr hinterher.


    Da ich die Achsen des Graphes nicht cleare, könnte es reichen wenn ich nach z.B. 10 Werten beginne die Zeilen in der werte.json von 0 an zu löschen.

    Da bin ich aber bislang an der umsetzung gescheitert, der Graph hat nicht mehr geschrieben nachdem ich etwas versucht habe zu löschen...