Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使系统实现第二次读取RFID卡进行注销?_Python_Mariadb_Rfid - Fatal编程技术网

Python 如何使系统实现第二次读取RFID卡进行注销?

Python 如何使系统实现第二次读取RFID卡进行注销?,python,mariadb,rfid,Python,Mariadb,Rfid,我是初学者,需要一些帮助/指导! 所以基本上,我正在尝试使用Raspberry Pi 4和RFID读写器制作一个考勤系统。到目前为止,一切正常,但我正在努力发送数据以供注销。目前,sign_in中的时间戳也会在数据库中标记为sign_out,但这里我想在第二次读取RFID卡时,在sign_out列中填写数据。 如果你有任何其他建议,我很乐意听取/了解,谢谢。 编辑:“此问题的全部代码已删除”您是否考虑将登录/注销视为一个开关?默认状态为登录设置为0或false,注销设置为1或true。然后,当读

我是初学者,需要一些帮助/指导! 所以基本上,我正在尝试使用Raspberry Pi 4和RFID读写器制作一个考勤系统。到目前为止,一切正常,但我正在努力发送数据以供注销。目前,sign_in中的时间戳也会在数据库中标记为sign_out,但这里我想在第二次读取RFID卡时,在sign_out列中填写数据。 如果你有任何其他建议,我很乐意听取/了解,谢谢。
编辑:“此问题的全部代码已删除”

您是否考虑将登录/注销视为一个开关?默认状态为
登录
设置为0或false,
注销
设置为1或true。然后,当读卡时,它检查登录的值。如果为0/false,则会将其翻转为1/true,并执行相反的翻转以注销。当第二次读取卡时,它将读取sign out,如果为0/false,则将其设置为1/true,并执行相反的登录操作

为清楚起见:

current state: 
    sign-in = 0
    sign-out = 1

---> card is read for the first time
sign-in = (sign-in + 1) % 2 
sign-out = (sign-out + 1) %2

state now:
    sign-in = 1
    sign-out = 0

---> card is read for the second time, consider previous state
sign-in = (sign-i + 1) % 2
sign-out = (sign-out + 1) % 2

state:
    sign-in = 0
    sign-out = 1
通过将这两个状态减少为一个状态,
登录
,这一切都可以进一步简化

initial state:
    signed-in = 0

---> card is read for entry
signed-in = (signed-in + 1) % 2

state:
    signed-in = 1

---> card is read for exit
signed-out = (signed-in + 1) % 2

state:
    signed-in = 0

简单地说,你想把它看作是一个简单的状态机,有两个转换:从<<代码> <代码> > <代码>输出> />代码>从<代码>输出>代码> <代码> < <代码>

这是否有助于为您指明正确的方向

时间戳问题 因此,在进入循环之前,您似乎初始化了时间戳一次。 试着移动

ts=time.time()
timestamp=datetime.datetime.fromtimestamp(ts).strftime(“%Y-%m-%d%H:%m:%S”
在以下行之后:

id,text=reader.read()
这能解决你的问题吗

一般风格评论 您可以简化以下内容:

如果sign_in==0:
签到=(签到+1)%2
注销=(注销+1)%2
#id,text=reader.read()
cursor.execute(“插入考勤(用户id,时钟输入)值(%s,%s)”,(结果[0],时间戳,)
lcd.lcd\u显示\u字符串(“登录”+结果[1])
elif sign_in==1:
注销=(注销+1)%2
签到=(签到+1)%2
#id,text=reader.read()
cursor.execute(“插入考勤(用户id,打卡)值(%s,%s)”,(结果[0],时间戳,)
lcd.lcd\u显示\u字符串(“注销”+结果[1])
更像

sign_-in=(sign_-in+1)%2
注销=(注销+1)%2
#id,text=reader.read()
字段_in_或_out='in'如果登录=1,则为'out'
cursor.execute(f“插入考勤(用户id,时钟{字段{u in}或{u out})值(%s,%s)”,(结果[0],时间戳,)
lcd.lcd_显示_字符串(f“Sign{field_in_或_out}”+结果[1])
我如何进一步简化逻辑
!/usr/bin/env python
导入时间
导入日期时间
将RPi.GPIO导入为GPIO
从mfrc522导入SimpleMFRC522
导入mysql.connector
导入I2C_LCD_驱动程序
db=mysql.connector.connect(
host=“localhost”,
user=“admin”,
passwd=“*******”,
database=“attendancesystem”
)
cursor=db.cursor()
读卡器=SimpleMFRC522()
lcd=I2C_lcd_驱动程序.lcd()
#红色=4
#黄色LED=17
#绿色=27
#GPIO.setmode(GPIO.BCM)
有符号输入=0
尝试:
尽管如此:
lcd.lcd_clear()
lcd.lcd\u显示字符串('将卡放置到')
lcd.lcd\u显示字符串('记录考勤',2)
id,text=reader.read()
ts=时间。时间()
timestamp=datetime.datetime.fromtimestamp(ts).strftime(“%Y-%m-%d%H:%m:%S”)
cursor.execute(“从rfid_uid=“+str(id))所在的用户中选择id、名称”)
结果=cursor.fetchone()
lcd.lcd_clear()
如果cursor.rowcount>=1:
lcd.lcd\u显示字符串(“欢迎”)
lcd.lcd\u显示字符串(“+结果[1],2”)
#GPIO.输出(绿色LED,GPIO.高)
#时间。睡眠(3)
#GPIO.输出(绿色LED,GPIO.低)
cursor.execute(“插入考勤(用户id)值(%s)”,(结果[0],)
有符号输入=(有符号输入+1)%2
#id,text=reader.read()
cursor.execute(f“插入考勤(用户id,读取时间)值(%s,%s)”,(结果[0],时间戳,)
lcd.lcd\u显示字符串(f“读卡”+结果[1])
db.commit()
其他:
lcd.lcd\u显示字符串(“用户不”)
lcd.lcd\u显示\u字符串(“存在!!”,2)
#GPIO.输出(黄色LED,GPIO.高)
#时间。睡眠(3)
#GPIO.输出(黄色LED,GPIO.低)
时间。睡眠(2)
最后:
GPIO.cleanup()
并将数据库架构更新为只有
用户id
读卡时间列。将
登录
/
注销
逻辑更改为只有一个
已登录
字段,该字段表示两种状态,用户登录时为1,未登录时为0

代码中的另一个变化是将时间戳逻辑拉入
while
循环


然后,每次将卡接触到读卡器时,您的预期数据库都会有一行记录事件发生的时间,您不必更新已经存在的条目。

目前我不了解数据库结构以及如何在数据库中记录注销。这是您的问题吗?然后您应该显示SQL命令用于表格创建的ds(如问题中格式正确的文本)@MichaelButscher数据库名为attendancesystem,有一个名为attendance的表,该表由id和rfid_id组成,签到作为时间戳,签出作为时间戳。到目前为止,当我将rfid卡放在读卡器上时,它会注册时间,并用相同的时间填充签到和签出time@MichaelButscher我在努力寻找我能做的执行一个代码,该代码将识别何时第一次和第二次读取rfid卡,或者执行一个代码,该代码显示已填写登录,并且下次读取rfid卡时,数据将被删除