本来该文章与2021_5_21完成,由于我今天更新代码时候导致文章被我搞坏了,重新写一遍
一.材料:
1.arduino nano (最近涨价了,推荐大家去买esp32)
2.RFID读卡器
3.9宫格按键(软面板)
4.15kg舵机
5. 蜂鸣器
二 .主要实现功能,可以注册删除5张ID卡,实现刷卡,通信给arduino,控制舵机,完成机械动作来实现开门目的。
三.端口解析
1.和刷卡器之间用了rx,tx通信,貌似用其中一根线就可以使用 4号引脚接刷卡器的跳变电平
2.和舵机控制,使用了5号引脚(通过修改这句话来自定义#define PIN_SERVO 5)
3.键盘,x三个,y四个,分别使用 了(int x1=10,x2=11,x3=12; //按键定义)
(int y1=6,y2=7,y3=8,y4=9; //按键定义)因为这个案件键盘是一排查插的,我按着方便就这样使用了,
3.1 蜂鸣器用了13号引脚
4.采用了舵机库,擦写寄存器库,然后就没啥了,舵机库你们网上找一下吧,找不到再说嘛
程序内有很多详细的注释,
大致结构我说一下嘛,方便大家参考
4.1 setup定义接口
4.2 loop开始循环检测刷卡,和删除卡,注册卡
4.3 读卡解析代码段
4.4 读用户号码代码
4.5 写用户号码代码
4.6 删除用户代码段
4.7 AAA()按键的内容赋值解析
4.8 KM()开门关门舵机控制代码
4.9 蜂鸣器调用代码
四 .
这个代码在实际运用过程中,已经优化了三次左右了。偶尔会出现没人刷卡,系统监测返回卡号了,我也十脸懵逼
但是不至于打开门,希望能给大家带来帮助
//****************************************************************************以下是ID门禁卡测试程序*****************************************************************************
//此程序具有注册卡,删除卡功能,能存5张用户卡,配合刷卡通信模块,配合按键模块,配合一个蜂鸣器,还有一个舵机,机械开门来实现目的
//当没有按键盘的时候,循环检测刷卡,周期200毫秒,当有人按键盘,开始检测,是否注册或删除用户,当没人按键盘,时候检测刷卡,有人刷卡,马上读取储存的用户,开始1对一进行比较,从用户1对比到用户5,如正确与卡号无误
//开始执行开门,开门执行舵机开动作,随后延时关门,然后继续循环检测刷卡,和按键,(读卡细节:当收到有人刷卡的信号,才开始读卡,否侧处于循环检测按键面板程序,有利于高效通讯,不必每次循环都去读一遍串口)
#include <EEPROM.h>
#include <Wire.h>
#include <Servo.h>
#define PIN_SERVO 5
Servo myservo;
String comdata="";
int IP=4; //4号VT电平脚
int Buzzer=13;
int z,o,u,ba,bb,bc,bd; //循环时间变量
int a,b,c,d,e,f,g,h,i,j; //用来赋值读取门禁参数
int A,B,C,D,E,F,G,H,I,J; //用来读存储的用户参数
int AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ; //用来写入储存变量
int x1=10,x2=11,x3=12; //按键定义
int y1=6,y2=7,y3=8,y4=9; //按键定义
int user=0; //用户号
int readd=1; //读1-5位用户
int delate=0; //删除1-5位用户
int pp=0,po=0,pl=0;
int time1=7;
int DD=0;
int v;
//数据存储1-50,存储了5位用户的卡号,61-65储存了5位用户的状态,61=1,代表有用户,61=0代表没有用户。
void setup(){
Serial.begin(9600);
pinMode(IP,INPUT); //4
pinMode(y1,OUTPUT); //6
pinMode(y2,OUTPUT); //7
pinMode(y3,OUTPUT); //8
pinMode(y4,OUTPUT); //9
pinMode(x1,INPUT); //10
pinMode(x2,INPUT); //11
pinMode(x3,INPUT); //12
pinMode(Buzzer,OUTPUT); //13
myservo.attach(PIN_SERVO); //5
delay(10);
myservo.write(0);
}
void loop(){
AAA(); //用来检查面板是否被按 8毫秒检测面板
//以下注册用户,删除用户程序----------------------------------------------------------------------------------------------------------------------------
if(pp>=1&&pp<=10){ // 证明面板被按了
// Serial.print(" pp=");Serial.println(pp);
pp=0; //面板的数字
po=0; //#确认按键
pl=0; //*号按键
for(o=0;o<=80;o++)
{
AAA();// Serial.print(o); Serial.print("正在确认是否按了确认按键,此时pp,po分别为---");Serial.print(pp);Serial.print("---");Serial.println(po);
if(po==10){ //Serial.println("--------有人按了确认,现在开始检测添加还是删除");
//判断按1,再次按*号按键,准备写入用户,8秒循环
pp=0;po=0;pl=0;
for(bd=0;bd<=80;bd++){
AAA();
if(