实验目的:用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外还有你写入的新西,例如姓名,编号。
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
接着运行脚本,此时不但灯会亮,还会打印出卡片信息。
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
此时运行脚本,由于加入了循环,他将会多次检测,当遇到正确的卡片时将执行开灯操作,3秒后关闭(5秒太长,测试时间太久,我该为了3秒),同时继续进入检测状态并不间断运行。当识别到错误的卡片,就会直接退出。如上图所示。
将脚本调入后台运行,即使关闭终端也不影响。
aaa00.sh &
发表评论