Zeiterfassung mit Small Time

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Hallo Python Freunde,

ich bin neu in der Programmierung und habe mich als erstes Projekt an eine Stempeluhr begeben.
Diese besteht aus folgender Hardware:
  • Raspberry Pi zero W
  • Mifare RC522 RFID leser
  • Display einer Rückfahrkamera
  • 3D gedrucktem Gehäuse
  • Active Buzzer
  • 5V 4A Netzteil
Software:
  • Raspbian Stretch with desktop
  • Small Time
Es soll mittels einer RFID Karte die Zeit erfasst werden. Dies wurde mit einem Python script realisiert.
Es läuft auch ganz hervorragend wenn es läuft. Allerdings hängt sich das ganze nach unbestimmter zeit einfach auf.
Kein Error oder sonstige Fehlermeldungen.
Wenn ich mich über ssh anmelde um den Fehler zu prüfen oder irgendwie mal zu schauen was sein könnte, so läuft wieder alles ganz normal.

Hier der code:

Code: Alles auswählen

#/usr/bin/env python
# -*- coding: utf8 -*-


import RPi.GPIO as GPIO
import MFRC522
import signal
import time
import os, sys
import urllib2, time

					
terminal = 'http://localhost/terminal.php?rfid='

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)


# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

mifare = MFRC522.MFRC522()
os.system('clear')
print 'ready to read:'

while continue_reading:
		# Scan for cards    
    		(status,TagType) = mifare.MFRC522_Request(mifare.PICC_REQIDL)
       
                (status,uid) = mifare.MFRC522_Anticoll()
		# If a card is found
    		if status == mifare.MI_OK:
        		print "Card detected"
			
                #time.sleep(0.1)
	
		# If we have the UID, continue
		if status == mifare.MI_OK:
			# Print UID
	        	print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])
			uid_str = ''.join(str(e) for e in uid)
			print terminal+uid_str
			
                	if uid_str <> '':
                        	print '-> verbinde mit Server .......'
                        	print ''
                        	try:
                                	info = urllib2.urlopen(terminal + uid_str).read()
                                	info = info.replace('Zeit fehlt!', '\033[1;31mZeit fehlt!\033[1;32m')
					print '\033[1;32m' + info + '\033[1;m'
                                	time.sleep(3)
                        	except:
					print ('\033[1;31m' + 'Stempel - Fehler!' + '\033[1;m')
					time.sleep(1)
					pass
			else:
				print ('\033[1;31m' + 'System- Fehler!' + '\033[1;m')
				time.sleep(1)
		       	os.system('clear')
                	print 'ready to read:'

        	time.sleep(0.1)
Ich hoffe Ihr könnt mir helfen oder habt eine Idee was ich tun kann.

Vielen Danke

Gruß
Olli
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe die Erfahrung gemacht, dass RPI.GPIO für sowas verantwortlich ist. Und verwende darum konsequent pigpio. Das auch zu tun wäre also nein Tipp an dich.
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Hallo _deets_

Vielen Dank für deine schnelle Antwort.
Kann ich "pigpio" denn einfach so installieren?

Gruß
Olli
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Wieso denkst, das geht nicht?
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Beim ersten Überfliegen von der Installation pigpio habe ich gelesen, dass die Pins anders angesprochen werden.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du redest von Installation, aber was du augenscheinlich meinst ist, ob du das ohne Code Änderung verwenden kannst. Natürlich nicht. Das ist eine andere Bibliothek, die nicht das Ziel verfolgt, ein drop-in-replacement zu sein. Du wirst also etwas umprogrammieren müssen. Die Konzepte sind aber gleich. Du musst natürlich auch die Klasse des RFID readers ändern. Oder schauen, ob das schon jemand für pigpio getan hat.
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Ja genau.
Also ändere ich den Import von RPI.GPIO auf pigpio und die Adressen der Pins?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja.
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Wo könnte ich die Klasse des RFID Readers für pi.gpio denn finden?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Im internet? Und ganz ehrlich: das sind 5 Zeilen Code oder so die man ändern muss. Das ist doch eine überschaubare Aufgabe. Außer man möchte dabei mit Einzelsatz-Fragen jeden Millimeter des Weges begleitet werden, statt es zu probieren und bei konkreten Fragen Code und Fehlermeldungen zu posten. Dann dauert das ein paar Monate.
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Danke!
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier haben wir wieder den selben katastrophal schlechten Code, der immer wieder kopiert wird. Statt Signale fängt man einfach eine KeyboardInterupt-Exception ab. <> nimmt seit Jahrzehnten niemand mehr zum Vergleiche, und an der Stelle kann die Zeichenkette auch niemals leer sein, nackte Excepts benutzt man nicht, weil so das finden von Fehlern unmöglich wird.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene und nicht mit einer beliebigen Mischung aus Leerzeichen und Tabs.
Olli
User
Beiträge: 7
Registriert: Montag 10. Juni 2019, 10:07

Vielen lieben Dank für eure konstruktive Hilfe.
Antworten