Я работаю над системой посещаемости с помощью считывателей Raspberry pi 4 и 2 rc522 rfid. Когда значок считывается, если идентификатор присутствует во внутренней базе данных, модуль реле со светодиодом активируется на 1 секунду.
Все работает нормально, но по прошествии длительного времени (более 6 часов) второй rc522 перестает читать.
Я использую эту библиотеку: https://github.com/pimylifeup/MFRC522-python/tree/master/mfrc522 скопирован в два каталога с разными именами. Один остался нетронутым, но другой редактировался в строке 128 (mfrc522 / MFRC522.py): device = 0 = ›device = 1.
Пробовал параллельную и последовательную проводку, разницы нет. Тоже пробовал менять ридеры, разницы нет. Так что это не аппаратная проблема.
У меня есть цикл while, чтобы проверить фактическое время, чтобы читатели могли читать только в установленные часы работы.
Вот мой код:
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
import mfrc522Lib.mfrc522
import mfrc522Lib2.mfrc522
import mysql.connector
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
#variables
reader1 = mfrc522Lib.mfrc522.SimpleMFRC522()
reader2 = mfrc522Lib2.mfrc522.SimpleMFRC522()
open1 = '08:15:00'
close1 = '11:45:00'
open2 = '13:30:00'
close2 = '17:45:00'
update = '23:00:00'
now = '%H:%M:%S'
on = 0
off = 0
upload = 0
db_con = 0
server_con = 0
relay = 18
GPIO.setup(relay,GPIO.OUT)
#functions
def db_connect():
global db
global db_con
global dbcursor
try:
db = mysql.connector.connect(
host="localhost",
user="user",
password="password",
database="database"
)
except:
db_con = 0
print("Database not accessible")
else:
dbcursor = db.cursor()
db_con = 1
print("Database accessible")
def server_connect():
global dbserver
global server_con
global cursorserver
try:
dbserver = mysql.connector.connect(
host="serverIP",
port="serverPort",
user="user",
password="password",
database="server"
)
except:
server_con = 0
print("Server offline")
else:
cursorserver = dbserver.cursor()
server_con = 1
print("Server online")
def read_badge(action, rfid):
db_connect()
if db_con == 1
select = "SELECT RFID FROM Users WHERE RFID = " + str(rfid)
dbcursor.execute(select)
result = dbcursor.fetchone()
if dbcursor.rowcount >= 1:
insert = "INSERT INTO Accesses (RFID, Action) VALUES (%s, %s, %s)"
values = (str(rfid), action,)
dbcursor.execute(insert, values)
db.commit()
db.close()
if action == 'In':
print("User authorized, recorderd ingress")
elif azione == 'Out':
print("User authorized, recorded exit")
GPIO.output(relay,GPIO.HIGH)
time.sleep(1)
GPIO.output(relay,GPIO.LOW)
time.sleep(10)
else:
db.close()
print("User not authorized")
time.sleep(2)
#main program, this is for checking if program started without terminal prompt as the program run after boot with sysem.d
GPIO.output(relay,GPIO.HIGH)
time.sleep(1)
GPIO.output(relay,GPIO.LOW)
try:
while True:
while time.strftime(now) >= open1 and time.strftime(now) <= close1 or time.strftime(now) >= open2 and time.strftime(now) <= close2:
if on == 0:
print("Access open")
on = 1
off = 0
upload = 0
id1 = reader1.read_id_no_block()
id2 = reader2.read_id_no_block()
if id1 != None:
read_badge('In', id1)
if id2 != None:
read_badge('Out', id2)
else:
if off == 0:
print("Access close")
off = 1
on = 0
if time.strftime(now) >= update and upload == 0:
db_connect()
server_connect()
if server_con == 1:
#upload all registered accesses to server and clean accesses table on local database
upload = 1
dbserver.close()
db.close()
finally:
GPIO.cleanup()
Я думаю об использовании * os.system ('sudo reboot') между двумя часами работы и после ночного обновления, но это мой последний вариант.
finally
наExcept
, чтобы распечатать любую ошибку. Он может исходить от вашего RFID-ридера (я добавил много пробных исключений в библиотеке). Или из кода вашей базы данных. Здесь, если есть какая-то ошибка, завершение работы вашей программы вам ни о чем не говорит ... - person Vincent Bénet   schedule 22.01.2021