Hallo,
Erstmal muss ich sagen, dass ich erst 12 bin und mich erst seit ungefähr 3 Jahren mit Raspberrypis beschäftige. Also erwartet bitte nicht zu viel von mir.
Aber jetzt fange ich mal mit der Projektvorstellung an:
Die Idee ist folgende:
Es wird eine RFID Karte an den Leser gehalten. Es kommt eine persönliche Willkommensnachricht auf dem Display und die Tür wird geöffnet In der Logdatei wird ein Eintrag mit Datum, Uhrzeit und Name (von dem, der die Tür geöffnet hat) erstellt. Falls aber eine Falsche Karte an den Leser gehalten wird, wird auf dem Display angezeigt, dass die Karte nicht die richtige ist. Es wird in der Logdatei ein Eintrag mit Datum, Uhrzeit, und der UUID (nennt man das so?) des falschen Chips erstellt. Nachdem 4 mal hintereinander ein falscher Chip an den Leser gehalten wird, wird die Tür für 5min gesperrt. Es ist nun auch nicht mehr möglich die Tür mit einem Richtigen Chip zu öffnen. Auf dem Display wird angezeigt, wie viel Zeit man noch übrig hat. In der Logdatei wird ein Eintrag erstellt, mit Datum, Uhrzeit, dass die Tür gesperrt wurde und von welchem Chip bzw. von welcher UUID sie gesperrt wurde. Nach den 5 min warten hat man dann aber nur noch 2 Versuche bevor die Tür wieder gesperrt wird. Wenn man eine Richtige Karte an den Leser hält, wird der Zähler wieder zurückgesetzt und man hat wieder 4 Versuche.
So hab ich das ganze Verkabelt:
Zusätzlich wird noch an Pin 8 ein Piepser und an Pin 10 ein Relais für die Tür angeschlossen.
Der Code:
Es ist vielleicht nicht die beste oder einfachste Variante aber sie funktioniert. Das ist für mich am wichtigsten.
Die **** und Namen in Zeile 22-24 sind nur Beispiele.
# coding=utf-8
import RPi.GPIO as GPIO
import MFRC522
import signal
from time import *
from lib_oled96 import ssd1306
from smbus import SMBus
from PIL import ImageFont
from RPi import GPIO
import os
continue_reading = True
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT)
GPIO.setup(10, GPIO.OUT)
GPIO.output(8, True)
GPIO.output(10, False)
x=0
ort=('/home/pi/Schloss/log/' + asctime())
logdatei = open(ort, 'w')
#vertraute UID's
vertraut = {'*********':'Max',
'********':'Dieter'
'********':'Peter'}
# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
global continue_reading
continue_reading = False
GPIO.cleanup()
#Schriftarten
FreeSans20 = ImageFont.truetype('FreeSans.ttf', 20)
FreeSans17 = ImageFont.truetype('FreeSans.ttf', 17)
# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
#Display einrichten
i2cbus = SMBus(1) # 0 = Raspberry Pi 1, 1 = Raspberry Pi > 1
oled = ssd1306(i2cbus)
# Ein paar Abkuerzungen, um den Code zu entschlacken
draw = oled.canvas
oled.cls()
oled.display()
draw.text((0, 10), "Bitte Chip" , font=FreeSans20, fill=1)
draw.text((0, 31), "auflegen" , font=FreeSans20, fill=1)
oled.display()
# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
# Scan for cards
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# Get the UID of the card
(status,uid) = MIFAREReader.MFRC522_Anticoll()
# If we have the UID, continue
if status == MIFAREReader.MI_OK:
# Print UID
GPIO.output(10, True)
sleep(0.125)
GPIO.output(10, False)
card_id ='%s%s%s%s' % (uid[0], uid[1], uid[2], uid[3])
if card_id in vertraut:
x=0
oled.cls()
oled.display()
draw.text((0, 1), "Willkommen" , font=FreeSans20, fill=1)
draw.text((0, 22), vertraut[card_id] , font=FreeSans20, fill=1)
print(strftime('%Y/%m/%d %H:%M:%S'), 'Tür geöffnet von ', vertraut[card_id], file=logdatei, flush=True)
oled.display()
sleep(1.5)
oled.cls()
oled.display()
draw.text((0, 1), "Tuer wird" , font=FreeSans20, fill=1)
draw.text((0, 22), "geoeffnet" , font=FreeSans20, fill=1)
oled.display()
GPIO.output(8, False)
sleep(2)
GPIO.output(8, True)
oled.cls()
oled.display()
draw.text((0, 10), "Bitte Chip" , font=FreeSans20, fill=1)
draw.text((0, 31), "auflegen" , font=FreeSans20, fill=1)
oled.display()
else:
if x>2:
print(strftime('%Y/%m/%d %H:%M:%S'), 'Tür gesperrt. ID: ', card_id, file=logdatei, flush=True)
oled.cls()
oled.display()
draw.text((0, 10), "Tuer gesperrt" , font=FreeSans20, fill=1)
draw.text((0, 31), "noch 5min" , font=FreeSans20, fill=1)
oled.display()
sleep(60)
oled.cls()
oled.display()
draw.text((0, 10), "Tuer gesperrt" , font=FreeSans20, fill=1)
draw.text((0, 31), "noch 4min" , font=FreeSans20, fill=1)
oled.display()
sleep(60)
oled.cls()
oled.display()
draw.text((0, 10), "Tuer gesperrt" , font=FreeSans20, fill=1)
draw.text((0, 31), "noch 3min" , font=FreeSans20, fill=1)
oled.display()
sleep(60)
oled.cls()
oled.display()
draw.text((0, 10), "Tuer gesperrt" , font=FreeSans20, fill=1)
draw.text((0, 31), "noch 2min" , font=FreeSans20, fill=1)
oled.display()
sleep(60)
oled.cls()
oled.display()
draw.text((0, 10), "Tuer gesperrt" , font=FreeSans20, fill=1)
draw.text((0, 31), "noch 1min" , font=FreeSans20, fill=1)
oled.display()
sleep(60)
print(strftime('%Y/%m/%d %H:%M:%S'), 'Tür entsperrt', file=logdatei, flush=True)
x=2
oled.cls()
oled.display()
draw.text((0, 10), "Bitte Chip" , font=FreeSans20, fill=1)
draw.text((0, 31), "auflegen" , font=FreeSans20, fill=1)
oled.display()
else:
x+=1
oled.cls()
oled.display()
draw.text((0, 10), "falsche Karte" , font=FreeSans20, fill=1)
draw.text((0, 31), "Zugang verweigert!" , font=FreeSans20, fill=1)
oled.display()
print(strftime('%Y/%m/%d %H:%M:%S'), 'falsche Karte. ID: ', card_id, file=logdatei, flush=True)
GPIO.output(10, True)
sleep(0.25)
GPIO.output(10, False)
sleep(0.25)
GPIO.output(10, True)
sleep(0.25)
GPIO.output(10, False)
sleep(0.25)
GPIO.output(10, True)
sleep(0.25)
GPIO.output(10, False)
oled.cls()
oled.display()
draw.text((0, 10), "Bitte Chip" , font=FreeSans20, fill=1)
draw.text((0, 31), "auflegen" , font=FreeSans20, fill=1)
oled.display()
Alles anzeigen
Es sind noch Zusätzliche Dateien für den Reader und das Display in diesem Ordner.
Hier noch ein Beispiel für eine Logdatei:
2019/03/06 20:17:37 Tür geöffnet von Chip1
2019/03/07 16:38:08 Tür geöffnet von Chip1
2019/03/07 16:38:24 Tür geöffnet von Chip1
2019/03/07 16:38:30 falsche Karte. ID: 1154418446
2019/03/07 16:38:34 Tür geöffnet von Chip1
2019/03/07 16:51:05 Tür geöffnet von Chip1
2019/03/07 16:51:27 Tür geöffnet von Chip1
2019/03/07 16:51:39 falsche Karte. ID: 1154418446
2019/03/07 16:51:45 Tür geöffnet von Chip1
2019/03/07 16:52:22 Tür geöffnet von Chip2
2019/03/07 16:52:34 Tür geöffnet von Chip2
2019/03/07 16:52:42 Tür geöffnet von Chip2
2019/03/07 16:52:52 falsche Karte. ID: 1154418446
2019/03/07 16:52:56 Tür geöffnet von Chip1
2019/03/07 16:53:10 Tür geöffnet von Chip2
2019/03/07 17:01:38 Tür geöffnet von Chip1
2019/03/07 17:02:29 Tür geöffnet von Chip1
2019/03/07 17:02:35 Tür geöffnet von Chip1
2019/03/07 18:55:57 Tür geöffnet von Chip1
2019/03/07 18:56:12 Tür geöffnet von Chip1
2019/03/07 18:56:35 Tür geöffnet von Chip2
2019/03/07 18:56:52 Tür geöffnet von Chip2
2019/03/07 18:57:04 Tür geöffnet von Chip2
Alles anzeigen
Bild vom Aufbau:
Fortsetzung folgt...