Schrankensteuerung V1.0
Ich habe mein erstes Projekt mit dem Raspberry Pi (ich nenne ihn eigentlich nur noch PI) beendet. Es ist eine Schrankensteuerung.
Ziel war es eine recht kostspielige Lösung mit RFID-Einzugslesern zu ersetzen. Das Problem hier war das die Einzugsleser für diesen Einsatzfall mechanisch zu empfindlich waren. Die Leser mussten regelmäßig getauscht werden. Es wurde nun eine Lösung mit Barcodes vorgeschlagen. Diese können günstig gedruckt werden. Nach der Benutzung werden die Ausdrucke dann entsorgt.
Hier die Aufgabenstellung:
Es sollte eine Schrankensteuerung entwickelt werden bei der die Ausfahrt nur eine begrentze Zeit erlaubt war und bei der das Ticket nur einmalig benutzbar war. Es wurde zu erst ein Industrie PC vorgesehen der die Daten des Barcodelesers auswerten sollte. Da ich aber kurz vorher meinen PI bekommen habe kam von mir der Vorschlag einen PI dafür zu verwenden.
Ich bekam dann den Auftrag eine Lauffähige Version zu erstellen. Dazu gehörte die PC Software die den Barcode erstellt und die Daten in die Mysql Datenbank schreibt sowie der PI.
Es wurde dann ein Barcodeleser an den Pi gekoppelt.An die GPIO's des Pi wurden zwei Relais angeschlossen die dann die Kontrollleuchten und die Schranke ansteuern. Der Pi greift zu diesem Zweck auf einen Server zu auf dem in einer Mysql Datenbank die Ticket Daten liegen.
Hier der Schaltplan zu der Relaiskarte
Hier ein Auszug aus dem Script
#!/usr/bin/python
# Hier die Libs einbinden
import MySQLdb
import urllib
import time
import datetime
import RPi.GPIO as GPIO
"""
************************************************************************************
** Hier die Datenbank Verbindung eintragen
************************************************************************************
"""
MYSQL_Host = "..."
MYSQL_User = "..."
MYSQL_Passwd = "..."
MYSQL_DB = "...."
"""
************************************************************************************
** Ab Hier nichts mehr aendern
************************************************************************************
"""
GPIO.setmode(GPIO.BCM)
# set up the GPIO channels - one input and one output
# OK Meldung
GPIO.setup(24, GPIO.OUT)
# Fehler Meldung
GPIO.setup(23, GPIO.OUT)
# IOS auf Low setzen
GPIO.output(23, GPIO.LOW)
GPIO.output(24, GPIO.LOW)
#0.5 Sek warten
time.sleep(0.5)
"""
************************************************************************************
** Funktionsdeklarationen
************************************************************************************
"""
"""
Hier die Datenbank verbindung erstelle. Fehlertolerant
"""
def ConnectMYSQL(MyHost,MyUser,MyPass,MyDB):
lok = 0
while lok == 0 :
try:
conn = MySQLdb.connect(host=MyHost,user=MyUser, passwd=MyPass,db=MyDB)
lok = 1
except:
lok = 0
return conn
"""
Logging Informationen ausgeben Parameter : logtext (zu loggender Text),key (0-Systemfehler,1-StatusInfo), connection (DB Connection)
"""
def Logging(logtext,key,connection):
try:
cur = connection.cursor()
cur.execute("insert into logging (text,`key`) values (%s,%s)",(logtext,key))
cur.close()
connection.commit()
except:
connection = ConnectMYSQL(MYSQL_Host,MYSQL_User,MYSQL_Passwd,MYSQL_DB)
conn = connection
cur = connection.cursor()
cur.execute("insert into logging (text,`key`) values (%s,%s)",(logtext,key))
cur.close()
connection.commit()
"""
Barcode inaktiv Schalten : code (Barcode) , connection (Datenbank Connection)
"""
def DisableBarcode(code,connection):
...
"""
Laufzeit des Barcodes Pruefen : bar (Barcode), connection (Datenbank verbindung) -> Rueckgabewert 0 - Fehler / nicht ok 1 - Alles Ok
"""
def PruefeBarcodeLaufzeit(bar,connection):
nret = 0
try:
t = time.strftime("%Y-%m-%d")
print t
sql = "select gueltig from barcode where barcode=%s and datum=%s"
cursor = conn.cursor()
cursor.execute(sql,(bar,t))
row = cursor.fetchone()
...
return nret
"""
************************************************************************************
**
************************************************************************************
"""
# Datenbank oeffnen
conn = ConnectMYSQL(MYSQL_Host,MYSQL_User,MYSQL_Passwd,MYSQL_DB)
while 1:
try:
bar = raw_input("")
print bar
Logging("Barcode gelesen : " + bar,1,conn)
t = time.strftime("%Y-%m-%d")
#print t
sql = "select aktiv from barcode where barcode=%s and datum=%s"
cursor = conn.cursor()
cursor.execute(sql,(bar,t))
row = cursor.fetchone()
#print row
except:
Logging("Fehler beim Lesen des Barcodes",0,conn)
print "Fehler beim Lesen des Barcodes"
try:
if row:
#print "Daten gefunden"
if row[0] == 1:
print "Barcode Aktiv"
if PruefeBarcodeLaufzeit(bar,conn):
Logging("Schranke oeffnen " + bar,1,conn)
# Schranke oeffnen
print "Disable Barcode"
DisableBarcode(bar,conn)
# Schranke ansteuern
GPIO.output(24, GPIO.HIGH)
# 5 Sek warten
time.sleep(5)
GPIO.output(24, GPIO.LOW)
else:
Logging("Barcode abgelaufen : " + bar,1,conn)
print "Barcode abgelaufen : " + bar
DisableBarcode(bar,conn)
# Fehler ansteuern
GPIO.output(23, GPIO.HIGH)
# 10 Sek warten
time.sleep(10)
GPIO.output(23, GPIO.LOW)
else:
...
else:
...
cursor.close()
except:
Logging("Fehler beim verarbeiten",0,conn)
print "Fehler beim verarbeiten"