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.

Schaltschrank

Hier der Schaltplan zu der Relaiskarte

Schaltplan Relaismodul

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"