用shell脚本+RFID RC522芯片+GPIO模拟门禁

实验目的:用shell脚本+RFID RC522芯片+GPIO控制一盏灯

前提:树莓派3B+一个(已经做好了开关灯),已装好MFRC522模块和读写环境

思路:

既然python read.py可以读取到IC卡/钥匙扣的唯一ID,那么就把这个ID写进脚本中,用if语句去判断python执行返回的数字是否与脚本的数字匹配,如果匹配就控制GPIO引脚输出高低电平来开关灯。

注意:本实验是在树莓派pi用户家目录下做的,因此很多命令不需要加sudo,同时由于我把家目录加入了环境变量,方法是操作.bashrc文件,未做此操作的运行脚本前面要加./

1 首先是一张卡或者一个钥匙扣

cd /home/pi/SPI-Py/MFRC522-python
nano kai.sh
chmod +x kai.sh
shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py`
a=625334885070
if [ $shuzi -eq $a  ];then
gpio -g mode 19 out
gpio -g write 19 1
else
echo 1
exit 0
fi

感应关

nano guan.sh
shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py`
a=625334885070
if [ $shuzi -eq $a  ];then
gpio -g write 19 0
gpio -g mode 19 in
else
echo 1
exit 0
fi

2 接着是两张卡任意一个都可以开关灯

感应开

shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py`
a=625334885070
b=828327625651
if [ $shuzi -eq $a -o $shuzi -eq $b ];then
gpio -g write 19 0
gpio -g mode 19 in
else
echo 1
exit 0
fi

感应关

shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py`
a=625334885070
b=828327625651
if [ $shuzi -eq $a -o $shuzi -eq $b ];then
gpio -g write 19 0
gpio -g mode 19 in
else
echo 1
exit 0
fi


3 进阶,让它打开5秒钟之后自动熄灭

自动熄灭之后就不用再运行关的脚本了,如同小区门禁一样自动上锁。

#!/bin/bash
shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py`
a=625334885070        #定义卡片的id为a
b=828327625651        #定义钥匙扣的id为b
if [ $shuzi -eq $a -o $shuzi -eq $b ];then     #如果shuzi等于a或者b,那么就
gpio -g mode 19 out    #GPIO引脚19号设为输出
gpio -g write 19 1    #GPIO引脚19号输出高电平
else
echo "未识别的设备!"     #打印信息到屏幕
exit                     #直接退出,不继续执行
fi 
sleep 5#休眠5秒钟
gpio -g write 19 0    #GPIO引脚19号输出低电平
gpio -g mode 19 in    #GPIO引脚19号设为输入

4 再进阶,开灯的同时打印出该卡片的所有人信息

前提就是你已经写入了信息到卡片里,此时卡片除了UID外还有你写入的新西,例如姓名,编号。

2.png

sudo nano aaa00.sh
#!/bin/bash
shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py | awk NR==1` #定义变量shuzi等于该卡片的第一行,也就是UID
a=625334885070                  #定义卡片a的id为...
b=828327625651                  #定义钥匙扣b的id为...
c=`python /home/pi/SPI-Py/MFRC522-python/read.py | awk NR==2` #定义变量c为被识别的卡片第二行,也就是写入信息
echo $c                         #打印变量C到屏幕上
if [ $shuzi -eq $a -o $shuzi -eq $b ];then #如果shuzi等于a或者b,那么就
        gpio -g mode 19 out     #GPIO引脚19号设为输出
        gpio -g write 19 1      #GPIO引脚19号输出高电平
else
        echo "未识别的设备!"    #打印信息到屏幕
        exit                    #直接退出,不继续执行
fi 
        sleep 5                 #休眠5秒钟
        gpio -g write 19 0      #GPIO引脚19号输出低电平
        gpio -g mode 19 in      #GPIO引脚19号设为输入

脚本加执行权限

sudo chmod +x aaa00.sh

接着运行脚本,此时不但灯会亮,还会打印出卡片信息。

QQ截图20190107170232.png

5 再进阶+1,开灯的同时打印出当前时间和卡片信息并将时间保存到time.txt

这样做的目的是以方便以后查看谁开了灯,又是在什么时间开了灯。

#!/bin/bash
shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py | awk NR==1` #定义变量shuzi等于该卡片的第一行,也就是UID
a=625334885070                  #定义卡片a的id为...
b=383060826631                  #定义钥匙扣b的id为...
c=`python /home/pi/SPI-Py/MFRC522-python/read.py | awk NR==2` #定义变量c为被识别的卡片第二行,也就是写入信息
echo `date +%F" "%T`            #打印当前日期,按年月日
echo $c                         #打印变量C到屏幕上
if [ $shuzi -eq $a -o $shuzi -eq $b ];then #如果shuzi等于a或者b,那么就
        gpio -g mode 19 out     #GPIO引脚19号设为输出
        gpio -g write 19 1      #GPIO引脚19号输出高电平
else
        echo "未识别的设备!"    #打印信息到屏幕
        exit                    #直接退出,不继续执行
fi 
        sleep 5                 #休眠5秒钟
        gpio -g write 19 0      #GPIO引脚19号输出低电平
        gpio -g mode 19 in      #GPIO引脚19号设为输入

6 再进阶+2 循环,让它变成24小时运行

此处用wihle循环语句

#!/bin/bash
while true#循环运行该脚本,以使其24小时工作
do
shuzi=`python /home/pi/SPI-Py/MFRC522-python/read.py | awk NR==1` #定义变量shuzi等于该卡片的第一行,也就是UID
a=625334885070                  #定义卡片a的id为...
b=383060826631                  #定义钥匙扣b的id为...
c=`python /home/pi/SPI-Py/MFRC522-python/read.py | awk NR==2` #定义变量c为被识别的卡片第二行,也就是写入信息
d=`date +%F" "%T`#定义变量d等于当前系统时间
#echo $d#打印当前日期,按年月日
#echo $c#打印变量C到屏幕上
echo $d "使用者" $c >> time.txt#保存刷卡信息到本地文本time.txt
if [ $shuzi -eq $a -o $shuzi -eq $b ];then #如果shuzi等于a或者b,那么就
        gpio -g mode 19 out     #GPIO引脚19号设为输出
        gpio -g write 19 1      #GPIO引脚19号输出高电平
else
        echo "未识别的设备!"    #打印信息到屏幕
        exit                    #直接退出,不继续执行
fi 
        sleep 3                 #休眠3秒钟
        gpio -g write 19 0      #GPIO引脚19号输出低电平
        gpio -g mode 19 in      #GPIO引脚19号设为输入
done

QQ截图20190108054050.png

此时运行脚本,由于加入了循环,他将会多次检测,当遇到正确的卡片时将执行开灯操作,3秒后关闭(5秒太长,测试时间太久,我该为了3秒),同时继续进入检测状态并不间断运行。当识别到错误的卡片,就会直接退出。如上图所示。

将脚本调入后台运行,即使关闭终端也不影响。

aaa00.sh &

注意:由于需要后台运行,我把打印时间和卡片信息的给注释掉了,以免报错。要结束当前后台脚本的话,拿一张卡片UID没有定义到脚本的卡片,脚本就会自动退出。


最后编辑于:2019/01/05作者: admin

发表评论