Auf und abzählen mit Switch an GPIO

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Benutzeravatar
Landixus
User
Beiträge: 49
Registriert: Mittwoch 26. April 2017, 09:38

Ja ich bin auch schon viel weiter, ich habe jetzt "meinen" Code in den RPM Reader eingebaut:

...

Code: Alles auswählen

if __name__ == "__main__":

   import time
   import pigpio
   import readRPM
   import RPi.GPIO as GPIO
   import time

   GPIO.setmode(GPIO.BCM)
   GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)
   GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP)
   count = 5

   RPM_GPIO = 4
   RUN_TIME = 9600.0
   SAMPLE_TIME = 2.0

   pi = pigpio.pi()

   p = readRPM.reader(pi, RPM_GPIO)

   start = time.time()

   while (time.time() - start) < RUN_TIME:

    input_state = GPIO.input(20)
    if input_state == False:
        if count < 24:
         count = count + 1
         RPM = p.RPM()
         print('Level', count, 'RPM={}'.format(int(RPM+0.5)))
         time.sleep(SAMPLE_TIME)

    input_state = GPIO.input(21)
    if input_state == False:
       if count > 1:
        count = count - 1
        RPM = p.RPM()
        print('Level', count, 'RPM={}'.format(int(RPM+0.5)))
        time.sleep(SAMPLE_TIME)


    RPM = p.RPM()
    time.sleep(SAMPLE_TIME)
    print("RPM={}".format(int(RPM+0.5)))

   p.cancel()

   pi.stop()
Die RPM tickern jetzt durch und bei Level + oder - switcht er halt den Level hoch oder runter, dann zeigt er wieder die RPM an.

Nun noch meine Werte aus der Tabelle verknüpfen das er anzeigt:
Du bist in Level "6" machst ">60" RPM das entspricht einer Leistung von "105" Watt

Muss ich da ein Array bauen, oder eine Matrix, oder kann ich gar eine *.csv einlesen?

Aber nu erstmal Feierabend und DANKE nochmal. :D
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Moin,
da ich momentan das gleiche Problem habe und einfach nicht weiterkomme wollte ich nachfragen ob mit wer helfen könnte.
Also das Programm soll nur durch die Eingänge ein Punktestand anzeigen und durch eine andere Taste soll soll das Scoreboard wieder zurückgesetzt werden.


Soweit bin ich:


#\pytone.exe
#cmd cd pfade
#python -m pip install --upgrade pip
#pip install keyboard

# Import libraries
from linecache import getline as lesen
import os, sys, time, tkinter as tk, operator, random, RPi.GPIO as GPIO, spidev, datetime, locale

import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
move=GPIO.input(18) # Pin 18
GPIO.setup(17,GPIO.IN,pull_up_down=GPIO.PUD_UP)
move=GPIO.input(17) # Pin 17
GPIO.setup(27,GPIO.IN,pull_up_down=GPIO.PUD_UP)
move=GPIO.input(27) # Pin 27

LeftPlayer = 0
RightPlayer = 0
LeftPlayer_str = str(0)
RightPlayer_str = str(0)

with open("/home/pi/clicks.txt", 'w') as f:
f.write(RightPlayer_str + ':' + LeftPlayer_str)
print(RightPlayer_str + ':' + LeftPlayer_str)
f.close()
while True:
move=GPIO.input(17)
if move == False:

RightPlayer += 1
with open("/home/pi/clicks.txt", 'w') as f:
RightPlayer_str = str(RightPlayer)
f.write(LeftPlayer_str + ':' + RightPlayer_str)
f.close()
print(LeftPlayer_str + ':' + RightPlayer_str)
time.sleep(0.5)

move=GPIO.input(18)
if move == False:

LeftPlayer += 1
with open("/home/pi/clicks.txt", 'w') as f:
LeftPlayer_str = str(LeftPlayer)
f.write(LeftPlayer_str + ':' + RightPlayer_str)
f.close()
print(LeftPlayer_str + ':' + RightPlayer_str)
time.sleep(0.5)


move=GPIO.input(27)
if move == False:

RightPlayer=0
LeftPlayer=0
with open("/home/pi/clicks.txt", 'w') as f:
LeftPlayer_str = str(LeftPlayer)
RightPlayer_str = str(RightPlayer)
f.write(LeftPlayer_str + ':' + RightPlayer_str)
f.close()
print(LeftPlayer_str + ':' + RightPlayer_str)
time.sleep(0.5)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Jeder Import gehört in eine eigene Zeile. 10 Importe in einer Zeile sind definitiv nicht lesbar.
Deshalb wird wohl auch time 2x importiert; os, sys, tkinter, operator, random, spidev, datetime und locale werden importiert, aber nicht benutzt.

Variablennamen schreibt man generell komplett klein. Man speichert nicht die Stringrepresentation einer Zahl in einer eigenen Variable, sondern konvertiert bei der Ausgabe. Dazu benutzt man Format-Strings.
Bei with braucht man kein close. Du hast viermal den identischen Code zum Schreiben in eine Datei.
Am Ende des Programms muß man verlässlich GPIO.cleanup aufrufen.

Code: Alles auswählen

from RPi import GPIO
import time

def write_clicks(left_player, right_player):
    with open("/home/pi/clicks.txt", 'w') as file:
        text = f"{left_player}:{right_player}"
        file.write(text)
        print(text)

def initialize():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)
    GPIO.setup(17,GPIO.IN,pull_up_down=GPIO.PUD_UP)
    GPIO.setup(27,GPIO.IN,pull_up_down=GPIO.PUD_UP)

def main():
    try:
        initialize()
        left_player = right_player = 0
        while True:
            move = GPIO.input(17)
            if move == 0:
                right_player += 1
                write_clicks(left_player, right_player)
                time.sleep(0.5)

            move = GPIO.input(18)
            if move == 0:
                left_player += 1
                write_clicks(left_player, right_player)
                time.sleep(0.5)

            move = GPIO.input(27)
            if move == 0:
                left_player = right_player = 0
                write_clicks(left_player, right_player)
                time.sleep(0.5)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Und wo ist nun Dein konkretes Problem? Was funktioniert nicht so, wie Du es willst?
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Dankeschön für die schnelle Antwort, also wenn ich das Programm starte auf dem PI dann schreibt er immer

0:1
1:1
0:0
und das wiederholt sich dann immer.

Leider habe ich noch nicht ganz verstanden wieso er das macht.
Da ich noch nicht so viel Erfahrung habe und es trotzdem gerne verstehen möchte würde es mich freuen wenn mir wer ein bissen hilft :)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Na, dann stehen halt Deine Eingänge immer auf HIGH. Wir kennen hier ja Deine Hardwareverdrahtung nicht.

Man sollte keine magischen Zahlen im Code verstreuen, sondern nutzt statt dessen Konstanten.
Statt Polling benutzt man entsprechende Funktionen um Änderungen am Eingang zu detektieren.
So blockieren sich auch die einzelnen Tasten nicht gegenseitig.

Code: Alles auswählen

from RPi import GPIO
from queue import Queue
import time

PIN_LEFT_PLAYER = 17
PIN_RIGHT_PLAYER = 18
PIN_RESET = 27

def write_clicks(left_player, right_player):
    with open("/home/pi/clicks.txt", 'w') as file:
        text = f"{left_player}:{right_player}"
        file.write(text)
        print(text)

def initialize():
    queue = Queue()
    GPIO.setmode(GPIO.BCM)
    for pin in [PIN_LEFT_PLAYER, PIN_RIGHT_PLAYER, PIN_RESET]:
        GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(pin, GPIO.FALLING, callback=queue.put, bouncetime=200)
    return queue

def main():
    try:
        queue = initialize()
        left_player = right_player = 0
        while True:
            pin = queue.get()
            if pin == PIN_LEFT_PLAYER:
                left_player += 1
            elif pin == PIN_RIGHT_PLAYER:
                right_player += 1
            elif pin == PIN_LEFT_PLAYER:
                left_player = right_player = 0
            write_clicks(left_player, right_player)
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen,

@Sirius3 sollte dein zweite 'elif' in der Dauerschleife nicht eher nach 'PIN_RESET' abfragen?


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja genau. Hoffentlich liest der OP den Code auch so gründlich.
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Das habe ich auch schon vermutet, Dankeschön für den Lösungsvorschlag.
Macht ja auch so mehr sinn😅.

Momentan habe ich nur die Leitungen an den Raspberry angeschlossen und führe sie zusammen damit er hochzählt.
Also müsste ich ja nur den PIN 17 mit Ground antippen damit der LEFT_PLAYER hochzählt oder?
Leider klappt es immer noch nicht, ich weiß nicht ob das damit zusammenhängt, dass die PIN Abfrage Probleme macht.
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Wenn an dem Pin keine Strom anliegt ist er auf 0, legst du dann Strom an, geht er von 0 auf 1 -> steigende Flanke.
Nimmst du den Strom wieder weg, geht er von 1 auf 0 -> fallende Flanke.

Es wäre sinnvoll wenn man das zählen abhängig von den Flanken macht, schau doch noch mal in den Code, dann müsstest du erkennen was zu tun ist, damit gezählt wird.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Habe ich tatsächlich schon ausprobiert, leider zählt er nicht.
Ist das Programm nicht so geschrieben das er so lange hochzählt mit den Eingängen bis man den Reset betätigt?
Ich hatte eigentlich vorgehabt ein Scoreboard zu programmieren was die zahlen speichert bis ich den Reset betätige um alles zurückzusetzen.

Leider bin ich noch nicht so vertraut mit dem Thema und versuche es noch zu lernen.
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich kann einfach nicht rauslesen, was du probiert hast.
Ich weis auch nicht, wie du was an die GPIO's angeschlossen hast.

Wenn du das Programm startest und dann dafür sorgst, dass der Pin 17 mit Strom versorgt wird und danach wieder den Strom wegnimmst, dann zählt das Progrmm eins hoch. Wenn du das wiederholst dann zählt es eins weiter hoch.
Immer bei einer fallenden Flanke wird hoch gezählt. Wenn das Programm nicht hochzählt, dann würde ich ehrlich gesagt, als erstes überprüfen, ob alles richtig angeschlossen ist.

Vielleicht kannst du uns mal zeigen, wie du das angeschlossen hast?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Moin,
danke das ihr mir helft.

im YT Video sieht man hoffentlich ganz gut was mein Problem ist.
Link: https://youtu.be/Ic87grRaWFI
__deets__
User
Beiträge: 14481
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das sieht nach einem Hardware-Problem aus. Die internen Pullups mit 50-60K sind nicht besonders stark, aber *eigentlich* sollten die gut genug sein. Wenn du da aber mit dem Daumen solche Stoerungen erzeugen kannst, sieht das nicht so aus.

Ohne Oszi kann man das leider nicht besser analysieren, ich wuerde aber mal probieren, einen normalen Pullup mit etwa 10KOhm oder so anzuklemmen, und dann nochmal schauen, was das macht.
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Danke für die Antwort, aber was soll ich mit den Widerständen ermitteln?
habe jetzt mal probehalber einen 10K widerstand an den Pin gehalten und er hat hochgezählt.
__deets__
User
Beiträge: 14481
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du sollst die fest verbauen. Nicht irgendwie ranrödeln, natürlich zählt der dann. Pullups eben. Den Begriff kannst du ja mal recherchieren.
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Und da habe ich wieder etwas dazugelernt Dankeschön, ich habe jetzt am GPIO-Eingang mit einen Pulldown-Widerstand 10K Ohm gearbeitet.

Jetzt bin ich nur noch am überlegen wie ich die das Problem mit dem Rücksetzten behebe, immer wenn ich den Pin 17 auf 1 setze dann schreibt er die letzte zahl neu.

z.B.

1:8
1:9
1:9 <----- Reset
__deets__
User
Beiträge: 14481
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das wurde doch hier diskutiert, dass Sirius3 hier einen Fehler gemacht hat. Hast du das gelesen?
Benutzeravatar
Dennis89
User
Beiträge: 1121
Registriert: Freitag 11. Dezember 2020, 15:13

Hast du das gelesen?
Machte den Eindruck, als ob es gelesen und verstanden wurde:
Danoo hat geschrieben: Dienstag 19. April 2022, 11:03 Das habe ich auch schon vermutet, Dankeschön für den Lösungsvorschlag.
Macht ja auch so mehr sinn😅.
Wenn nicht, @Danoo schau dir den Code und meinen Beitrag danach an.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Danoo
User
Beiträge: 14
Registriert: Dienstag 12. April 2022, 12:50

Ups, mein Fehler... hatte das alte Programm benutzt jetzt Funktioniert alles, Dankeschön an euch alle. 🤗
Antworten