Rfid rc522 на Raspberry перестает читать через долгое время

Я работаю над системой посещаемости с помощью считывателей 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') между двумя часами работы и после ночного обновления, но это мой последний вариант.


person Baggaiver    schedule 22.01.2021    source источник
comment
Не могли бы вы предоставить больше вашего сценария? Я столкнулся с той же проблемой давным-давно, но сейчас у меня недостаточно элементов, чтобы ответить вам ...   -  person Vincent Bénet    schedule 22.01.2021
comment
Добавлен полный код, я пропустил несущественный и отладочный код.   -  person Baggaiver    schedule 22.01.2021
comment
Я думаю, вам следует заменить ваш finally на Except, чтобы распечатать любую ошибку. Он может исходить от вашего RFID-ридера (я добавил много пробных исключений в библиотеке). Или из кода вашей базы данных. Здесь, если есть какая-то ошибка, завершение работы вашей программы вам ни о чем не говорит ...   -  person Vincent Bénet    schedule 22.01.2021
comment
Спасибо за совет, но сейчас программа не выдает ошибок и не останавливается, по сути уже почти неделю работает. Мне просто нужно перезагрузить его, потому что читатель перестает читать, но программа продолжает работать.   -  person Baggaiver    schedule 23.01.2021
comment
Вы хоть представляете, где программа перестает работать? Может, вы могли бы войти в систему для отладки ...?   -  person Vincent Bénet    schedule 24.01.2021
comment
Программа не перестает работать, только второй ридер перестает читать через долгое время.   -  person Baggaiver    schedule 25.01.2021
comment
Если вы перевернете читателей, что произойдет? Это может помочь вам узнать, является ли проблема аппаратной или программной.   -  person Vincent Bénet    schedule 25.01.2021
comment
Как я уже писал, замена считывателей не имеет значения, а также переключение между последовательным и параллельным подключением не имеет значения, так что это не аппаратное обеспечение. Думаю, это связано с библиотекой.   -  person Baggaiver    schedule 25.01.2021
comment
Вот мои собственные модифицированные библиотеки для сверхлегких автомобилей: github.com/REZALKIN/PICONFLEX2000- FONCTIONS / blob / master / RFID.py и github. com / REZALKIN / PICONFLEX2000-CLIENT / blob / master / MFRC522.py   -  person Vincent Bénet    schedule 25.01.2021
comment
Спасибо, я собираюсь взглянуть на это.   -  person Baggaiver    schedule 26.01.2021
comment
Хорошо, я добавил проверку карты перед чтением ее идентификатора и провел различные тесты, но проблема остается. Я подумываю использовать проверку статуса, чтобы запустить перезапуск службы.   -  person Baggaiver    schedule 01.02.2021
comment
Да, я не знаю, как помочь вам найти хорошее решение. Вам нужно запустить перезагрузку или продолжить поиск ...   -  person Vincent Bénet    schedule 01.02.2021