Zeitmessung mit dem Raspberry

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
danit
User
Beiträge: 1
Registriert: Dienstag 8. Januar 2019, 00:46

Hallo Zusammen

Ich bin neu im Programmieren von Pygame. Ich habe auch vorher nie mit Python gearbeitet.

Für meine Firma habe ich jetzt eine Zeitmessung für unsere Wasserrutschen programmiert.

Gerne würde ich von euch wissen was Ihr von meinem Script haltet?
Er Funktioniert genau so wie ich es möchte. Ich habe aber das Gefühl das er sehr Kompliziert geschrieben wurde und das ich einiges wegglasen könnte.

Vielen Dank wen sich jemand die Zeit nimmt und meinen Script einmal durchliest.

Ich bin für alle Bemerkungen offen.
Wie erwähnt: Lasst Gnade mit mir walten. Ich bin neu im Programmieren.
Ich möchte einfach einmal ein ehrliches Feedback von Leuten die das Programmieren besser beherrschen als ich.

Vielen Dank für eure Hilfe.

Code: Alles auswählen

#!/usr/bin/python

#Import aller Funktionen
import RPi.GPIO as GPIO
import pygame, sys
import time
import logging
import os
from datetime import datetime
import pygame.font
from pygame.colordict import THECOLORS
from pygame.locals import *
from random import randint

#GPIO Setup und Definition
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
switch = 8  # pin 24
switch1 = 7 # pin 26
GPIO.setup(switch,GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(switch1,GPIO.IN, pull_up_down=GPIO.PUD_UP)

#Prüfen ob benötigte Ordner existieren, wenn nicht erstellen
if not os.path.exists('/home/pi/Rutschenstatistik'):
    os.makedirs('/home/pi/Rutschenstatistik')
    
if not os.path.exists('/home/pi/Rutschenstatistik/Rekorde'):
    os.makedirs('/home/pi/Rutschenstatistik/Rekorde')
    
if not os.path.exists('/home/pi/Rutschenstatistik/Jahresrekord'):
    os.makedirs('/home/pi/Rutschenstatistik/Jahresrekord')

#Definition der Dateinamen und Ordner
file = datetime.now().strftime('Rutschenstatistik %Y_%m_%d')
file2 = datetime.now().strftime('/home/pi/Rutschenstatistik/Rutschenstatistik %Y_%m_%d.log')
file3 = datetime.now().strftime('Rekorde %Y_%m_%d')
file4 = datetime.now().strftime('/home/pi/Rutschenstatistik/Rekorde/Rekorde %Y_%m_%d.log')
file5 = datetime.now().strftime('/home/pi/Rutschenstatistik/Jahresrekord/Jahresrekord %Y.log')
file6 = datetime.now().strftime('Jahresrekord %Y')

#Definition der Logdateien
logger = logging.getLogger(file)
logger1 = logging.getLogger(file3)
logger2 = logging.getLogger(file6)
hdlr = logging.FileHandler(file2)
hdlr1 = logging.FileHandler(file4)
hdlr2 = logging.FileHandler(file5)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
hdlr1.setFormatter(formatter)
hdlr2.setFormatter(formatter)
logger.addHandler(hdlr)
logger1.addHandler(hdlr1)
logger2.addHandler(hdlr2)
logger.setLevel(logging.INFO)
logger1.setLevel(logging.INFO)
logger2.setLevel(logging.INFO)

#Einlesen des Jahresrekord aus Logdatei, wenn keine Datei vorhanden Rekord auf 59s setzen
try:
    logfile = open(file5)
    file_lines = logfile.readlines()[-1]
    x = file_lines
    x.split(" ")
    a,b,c,d,e = x.split(" ")
    e = e[:-2]
    msg10 = e
    logfile.close()
except (IOError, IndexError):
    e = "59.000"

#Definition der Farben, Bildschirmgrösse, Schrift und Surface Objekten
redColor = pygame.Color(255,0,0)
greenColor = pygame.Color(255,255,0)
blueColor = pygame.Color(0,255,255)
yellowColor = pygame.Color(255,255,0)
greyColor = pygame.Color(0,0,0)
pygame.init()
width = 1920
height = 1080
windowSurfaceObj = pygame.display.set_mode((width,height))
windowSurfaceObj1 = pygame.display.set_mode((width,height))
windowSurfaceObj2 = pygame.display.set_mode((width,height))
windowSurfaceObj3 = pygame.display.set_mode((width,height))
pygame.display.set_caption('Black Hole')
font_path = '/usr/share/fonts/truetype/lato/Lato-Bold.ttf'
fontObj1 = pygame.font.Font(font_path,545)
fontObj2 = pygame.font.Font(font_path,219)
fontObj3 = pygame.font.Font(font_path,202)
fontObj = pygame.font.Font(font_path,202)
fullscreen = True
video_flags = fullscreen and FULLSCREEN
resolution = pygame.display.list_modes()[0]
surface = pygame.display.set_mode(resolution, video_flags)
pygame.mouse.set_visible(0)

#Bild laden für Bildschirmschoner
BA = pygame.image.load('BA3.png')
BA2 = pygame.image.load('BA3.png')
BA2 = pygame.transform.scale(BA2, (742, 514))

#Verzögerung des Bildschirmschoners
timesc = 90

#Festlegen der Länge der Rutsche
distanz = 100 #in Meter
factor = 3.6 #Rechnungsfaktor

#Laden des Grundbildes
msg6 = "s"
msg9 = "s "
#Aktuelle Zeit
msg = "00.000"
msgSurfaceObj = fontObj1.render(msg+msg6, 1,redColor)
msgRectobj = msgSurfaceObj.get_rect()
msgRectobj.center =(960,200)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
windowSurfaceObj.blit(msgSurfaceObj, msgRectobj)
#Gestoppte Zeit und Geschwindikeit
msg1 = "00.000"
msg3 = "00.00"
msg5 = "km/h"
msg1SurfaceObj = fontObj2.render(msg1+msg9+msg3+msg5, 1,blueColor)
msg1Rectobj = msg1SurfaceObj.get_rect()
msg1Rectobj.center =(960,550)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
windowSurfaceObj1.blit(msg1SurfaceObj, msg1Rectobj)
#Tagesrekord
msg2 = "59.000"
msg4 = "Tagesrekord "
msg2SurfaceObj = fontObj.render(msg4+msg2+msg6, 1,greenColor)
msg2Rectobj = msg2SurfaceObj.get_rect()
msg2Rectobj.center = (960,760)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
windowSurfaceObj2.blit(msg2SurfaceObj, msg2Rectobj)
#Jahresrekord
msg10 = e
msg11 = "Jahresrekord "
msg3SurfaceObj = fontObj3.render(msg11+msg10+msg6, 1,greenColor)
msg3Rectobj = msg3SurfaceObj.get_rect()
msg3Rectobj.midbottom = (960,1080)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
windowSurfaceObj3.blit(msg3SurfaceObj, msg3Rectobj)
  
pygame.display.update()

logger.info('Stopwatch gestartet')

#Grundwerte einstellen
save = 0
scsaver = 1
down = 1       
reset = 1
go = 0
s = 59
now2 = 0
start = 0
start2 = time.time()
  

while True:
    event = pygame.event.poll() 
	
	if GPIO.input(switch1)==0 and s>10 and go==1:
        go = 0
        save = 1                             
                
    if GPIO.input(switch)==0 and s>=10:
        down = 0
        go = 1
		
    if go==1:
        scsaver = 0
        if down == 0:
            start = time.time()
        now = time.time() - start
        speed = time.time() - start
        m,s = divmod(now,60)
        h,m = divmod(m,60)
        msg= "%02d" % (s)
        psec = str(now-int(now))
        pstr = psec[1:5]
        msg = msg + str(pstr)
		
        pygame.draw.rect(windowSurfaceObj,greyColor,Rect(0,0,width,height))
        msgSurfaceObj = fontObj1.render(msg+msg6, 1,redColor)
        msgRectobj = msgSurfaceObj.get_rect()
        msgRectobj.center =(960,200)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        windowSurfaceObj.blit(msgSurfaceObj, msgRectobj)

        msg1SurfaceObj = fontObj2.render(msg1+msg9+msg3+msg5, 1,blueColor)
        msg1Rectobj = msg1SurfaceObj.get_rect()
        msg1Rectobj.center =(960,550)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        windowSurfaceObj1.blit(msg1SurfaceObj, msg1Rectobj)
            
        msg2SurfaceObj = fontObj.render(msg4+msg2+msg6, 1,greenColor)
        msg2Rectobj = msg2SurfaceObj.get_rect()
        msg2Rectobj.center =(960,760)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        windowSurfaceObj2.blit(msg2SurfaceObj, msg2Rectobj)
            
        msg3SurfaceObj = fontObj3.render(msg11+msg10+msg6, 1,greenColor)
        msg3Rectobj = msg3SurfaceObj.get_rect()
        msg3Rectobj.midbottom = (960,1080)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
        windowSurfaceObj3.blit(msg3SurfaceObj, msg3Rectobj)

        pygame.display.update()
        down = 1
            
    if s>=59:
        go = 0
        scsaver = 1
        start2 = time.time()
        x = randint(630,2000)
        y = randint(460,1100)
        s = 50
           
    if save==1:
        time.sleep(0.5)
        msg1 = msg
        msg8 = ((distanz)/(speed)*(factor))
        msg7 = round(msg8, 2)
        msg3= str(msg7)
        if msg2 >= msg1:
            msg2 = msg1
            logger1.info(msg4+msg2+msg6)
        if msg10 >= msg2:
            msg10 = msg2
            logger2.info(msg11+msg10+msg6)
                
        pygame.draw.rect(windowSurfaceObj1,greyColor,Rect(0,0,width,height))
        msg1SurfaceObj = fontObj2.render(msg1+msg9+msg3+msg5, 1,blueColor)
        msg1Rectobj = msg1SurfaceObj.get_rect()
        msg1Rectobj.center =(960,550)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        windowSurfaceObj1.blit(msg1SurfaceObj, msg1Rectobj)

        msgSurfaceObj = fontObj1.render(msg+msg6, 1,redColor)
        msgRectobj = msgSurfaceObj.get_rect()
        msgRectobj.center =(960,200)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        windowSurfaceObj.blit(msgSurfaceObj, msgRectobj)
            
        msg2SurfaceObj = fontObj.render(msg4+msg2+msg6, 1,greenColor)
        msg2Rectobj = msg2SurfaceObj.get_rect()
        msg2Rectobj.center =(960,760)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        windowSurfaceObj2.blit(msg2SurfaceObj, msg2Rectobj)
            
        msg3SurfaceObj = fontObj3.render(msg11+msg10+msg6, 1,greenColor)
        msg3Rectobj = msg3SurfaceObj.get_rect()
        msg3Rectobj.midbottom = (960,1080)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
        windowSurfaceObj3.blit(msg3SurfaceObj, msg3Rectobj)
            
        logger.info(msg1+msg9+msg3+msg5)
            
        scsaver = 1
        start2 = time.time()
        x = randint(630,2000)
        y = randint(460,1100)
            
        pygame.display.update()

        save = 0
        reset = 0
            
    if scsaver==1:
        now2 = time.time() - start2
        if now2>=timesc and now2<=timesc + 30:
             #Logo anzeigen
            surface.fill((greyColor))
            msgRectobjBA = BA.get_rect()
            msgRectobjBA.center =(960,540)
            windowSurfaceObj.blit(BA, msgRectobjBA)
            pygame.display.update()
                
        if now2>=timesc + 30 and now2<=timesc + 60:
            #Logo anzeigen
            surface.fill((greyColor))
            sgRectobjBA = BA2.get_rect()
            msgRectobjBA.center =(x,y)
            windowSurfaceObj.blit(BA2, msgRectobjBA)
            pygame.display.update()
               
        if now2>=timesc + 60:
            start2 = time.time()
            start2 = start2 - 90
            x = randint(630,2000)
            y = randint(480,1100)
            pygame.display.update()  
			
    if event.type == pygame.KEYDOWN: 				#Tastatureingabe
        if event.key == pygame.K_ESCAPE: 			#ESC um das Programm zu schliessen
            sys.exit()
        if event.key == pygame.K_f: 				#Taste F um den Vollbildmodus zu aktivieren
            fullscreen = True
            video_flags = fullscreen and FULLSCREEN
            resolution = pygame.display.list_modes()[0]
            surface = pygame.display.set_mode(resolution, video_flags)
            pygame.mouse.set_visible(0)
        if event.key == pygame.K_q: 				#Taste Q um den Vollbildmodus zu beenden
            fullscreen = False
            video_flags = fullscreen and FULLSCREEN
            resolution = pygame.display.list_modes()[0]
            surface = pygame.display.set_mode(resolution, video_flags)
            pygame.mouse.set_visible(1)
	if event.key == pygame.K_s: 				#Taste S um den Startimpuls zu simulieren
            down = 0
	    go = 1
	if event.key == pygame.K_z: 				#Taste Z um den Stopimpuls (Ziel) zu Simulieren
            go = 0
	    save = 1	
			
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da sind mehrere Zeilen mit 2000+ Leerzeichen am Ende. Wie bekommt man den so etwas hin? Ausserdem ist mindestens ein Tabulatorzeichen drin was bei mir die Einrückung kaputt gemacht hat. Eingerückt wird in Python vier Leerzeichen pro Ebene. Keine Tabulatorzeichen.

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

Wobei das hier bedeuten würde *alles* in eine fast 300 Zeilen lange Funktion zu verschieben. Das ist viel zu lang und unstruktriert. Mit sehr vielen sehr schlechten Namen. Keine Abkürzungen und keine Nummerierungen! Und keine so furchtbar generischen und nichtssagenden Namen. `msg10` scheint die Bedeutung „Jahresrekord“ zu haben. Also den Jahresrekord, eigentliche eine Zahl, als Zeichenkette zu enthalten, die auch in der Form mit anderen Zeichenketten mit Zahldarstellungen verglichen wird. Das ist extrem undurchsichtig und ziemlich wahrscheinlich auch fehlerhaft oder zumindest sehr fehleranfällig. Wenn man Zahlen hat, sollte man damit auch als Zahlen arbeiten. Denn sonst ist '2' auch gerne mal grösser als '10'.

Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Der Namenszusatz `obj` ist komplett sinnfrei, denn *alles* was man an einen Namen binden kann ist ein Objekt. Also schreib das entweder in *jeden* Namen, oder lass es einfach weg. Es bringt dem Leser absolut keinen Mehrwert.

Kommentare sollten nicht beschreiben *was* der Code macht, denn das beschreibt ja bereits der Code selbst, sondern *warum* der das so macht. Sofern das nicht offensichtlich ist. Also vor den Importen zu kommentieren das da alle Funktionen importiert werden, ist wenig hilfreich. Und Kommentare sollten *stimmen*, sonst ist nicht nur der jeweilige Kommentar nutzlos, sonder irgendwann vertraut der Leser dann keinem Kommentar mehr, dann kann man es sich auch gleich sparen. So etwas wie ``switch = 8 # pin 24`` ist hochgradig verwirrend.

`sys.exit()` ist nur sinnvoll wenn man damit auch explizit einen Wert an den Aufrufer liefern will. Sonst ist das in vielen Fällen ein Hack weil man sich nicht mit einem sauberen Programmablauf beschäftigen möchte.

Die Warnungen vom GPIO-Modul sind nicht dazu da um sie zu ignorieren, sondern um deren Ursache zu beheben. Oft einfach nur ein sauberer Programmablauf an dessen Ende auf jeden Fall `GPIO.cleanup()` aufgerufen wird. Dazu bietet sich ``try``/``finally`` an.

Pinnummern und Pfade bindet man üblicherweise an Konstanten. Und welche mit sinnvollen Namen. Nicht `FILE1` bis `FILE6`.

Dateien die man öffnet, sollte man auch wieder schliessen. Hier lohnt sich ein Blick auf die ``with``-Anweisung.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Dass os.path.exists False liefert, heißt nicht, dass es bis zum nachfolgenden Aufruf von makedirs immer noch nicht exisitiert. Besser Exception abfangen und korrekt verarbeiten. datetime.now darf nur einmal aufgerufen werden, sonst hast Du inkonsistente Log-Files. strftime ist auch nicht dazu da beliebigen Konstanten Text mit hineinzuschreiben. Benutze str.format.
Bei "log-File Lesen" werden munter Variablen in andere umbenannt. Warum? Einbuchstabe und durchnummerierte Variablennamen sind schlecht. Variablennamen sollten aussagekräftig sein. Ein x.split ohne Zuwiesung ist unsinnig.

Der Rest des Codes ist viel zu lang, um ihn wirklich lesen zu können.
Antworten