本来该文章与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);   //4pinMode(y1,OUTPUT);  //6pinMode(y2,OUTPUT);  //7pinMode(y3,OUTPUT);  //8pinMode(y4,OUTPUT);  //9pinMode(x1,INPUT);  //10pinMode(x2,INPUT);  //11pinMode(x3,INPUT);  //12pinMode(Buzzer,OUTPUT);  //13myservo.attach(PIN_SERVO);  //5delay(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(pp==1){//  Serial.println("已进入添加用户");delay(300);for(u=0;u<=80;u++){                  //判断按*号,确认,准备进入写入用户AAA();if(pp==1&&po==10){//    Serial.println("请在8秒钟内刷卡");//开始写入用户for(ba=0;ba<=80;ba++){if(digitalRead(IP)==1){READ_ID();       //开始读ID卡号,准备写入delay(50);AA=a;AB=b;AC=c;AD=d;AE=e;AF=f;AG=g;AH=h;AI=i;AJ=j;   //把读的卡号赋值给写入变量Write_user(); //写入用户卡号delay(50);u=100;        //退出确认按键循环o=100;        //退出按键命令循环                 pp=50;                     po=0;pl=0;                    ba=100;       //退出写入循环  BA();bd=100;//    Serial.println("写卡已成功,准备退出循环");delay(1000);              }delay(92);//为刷卡循环8秒}delay(92); //为按*号确认等待8秒u=100;o=100;}//    Serial.print(ba&&"---"&&pp); Serial.println("请点击确认,进入添加用户"); }//   Serial.print(ba); Serial.println("进入添加用户循环"); }else if(pp==2){ //删除用户  主要逻辑:先进入循环8秒选择删除用户几,选择之后循环8秒按确认按键,开始删除,删除后,直接结束循环。//  Serial.println("执行删除用户"); //进入循环;当按下*号按键;进入选择用户,清空变量;进入循环,先选择用户号,再点击*号确认,执行删除,删除后退出所有循环po=0;pl=0;delay(500);for(int bb=0;bb<=80;bb++){AAA();          delay(5);if (pp==2&&po==10){   pp=0; po=0;delay(1000);for(int bc=0;bc<=80;bc++){ AAA();if(po==10){  //     Serial.print("   -------正在删除用户号");    Serial.println(pp);            delate=pp;  delay(5);Delete_user(); delay(5);delate=0;pp=50;po=0;pl=0;bb=100;o=100;bc=100;BA();bd=100;delay(1000);}delay(82);   //    Serial.print("循环时间中--");Serial.print(bc);Serial.print("----");//   if(pp==0){Serial.println("请输入用户号,再点击确定"); }//      else  if(pp>=0){//     Serial.print("当前需要删除用户号为—");Serial.print(pp);  Serial.println("—请按确定");//     }}bb=100;o=100;bd=100;}delay(87);// Serial.print(bc); Serial.println("请点击确定,进入删除用户,"); }o=100;bd=100;}po=0;pp=0;pl=0;//    Serial.print(bd); Serial.println("进入循环,添加请按1,删除请按2");   }o=100;delay(92); //为检测按键输入数值是什么命令等待8秒 } delay(80);//Serial.print(o); Serial.println("请按确认");   }           }//以上注册用户,删除用户程序----------------------------------------------------------------------------------------------------------------------------//以下检测刷卡开门程序---------------------------------------------------------------------------------------------------------------------------------if(digitalRead(IP)==1){readd=1;READ_ID();  //读开门卡号 v=a+b+c+d+e+f+g+h+i+j ; Serial.println(v);if( v > 3)//0时差检测刷卡,如果检测卡号不等于0 则通过开始比较用户,防止多次刷卡造成读卡异常开门{delay(10);Serial.println("有人刷卡已经完成读取");// time1=0;for(z=1;z<=5;z++)  //循环读5个卡号{READ_USER();     //读用户卡号 delay(5);         if(f==F&&g==G&&h==H&&i==I&&j==J){Serial.println("后五位没问题");delay(3);if(a==A&&b==B&&c==C&&d==D&&e==E){Serial.println("前五位没问题");delay(100);Serial.print("开门,这是尊贵的用户:"); Serial.println(readd);Serial.print("用户卡号为");//  Serial.print(A);Serial.print(B);Serial.print(C);Serial.print(D);Serial.print(E);Serial.print(F);Serial.print(G);Serial.print(H);Serial.print(I);Serial.println(J);KM();delay(3000);//执行开门,然后等待5秒BA();GM();delay(500);//执行关门,然后等待2秒BB();readd=1;z=10;DD=1;v=0;}}readd=readd+1;   //读下一个用户}}if(DD==1){DD=0;}else {BC();//  Serial.println("不认识这个卡,请滚蛋,或者给这个卡授权");v=0;delay(500);}a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0;A=0;B=0;C=0;D=0;E=0;F=0;G=0;H=0;I=0;J=0;v=0;}//以上检测刷卡开门程序----------------------------------------------------------------------------------------------------------------------------------pp=0;po=0;pl=0;delay(184);//  Serial.print("-----------------------------------------正常循环中,请随意触发按键");Serial.println(time1);
}void READ_ID(){      //读ID卡参数while(Serial.available()>0){comdata+=char(Serial.read());delay(2);}if(comdata.length()>0){a=comdata[6]; a=a-48; b=comdata[7]; b=b-48;c=comdata[8]; c=c-48; d=comdata[9]; d=d-48;e=comdata[10]; e=e-48; f=comdata[11]; f=f-48;g=comdata[12]; g=g-48; h=comdata[13]; h=h-48;i=comdata[14]; i=i-48; j=comdata[15]; j=j-48;//    Serial.print(comdata[6]); Serial.print(comdata[7]); Serial.print(comdata[8]); Serial.print(comdata[9]);//   Serial.print(comdata[10]); Serial.print(comdata[11]); Serial.print(comdata[12]); Serial.print(comdata[13]);//   Serial.print(comdata[14]); Serial.print(comdata[15]); //   Serial.println("--------------------------------------------------刷卡卡号");delay(50);comdata="";}
}
void READ_USER(){  //用read码来判断读用户几if(readd==1){A=EEPROM.read(1);B=EEPROM.read(2);C=EEPROM.read(3);D=EEPROM.read(4);E=EEPROM.read(5);F=EEPROM.read(6);G=EEPROM.read(7);H=EEPROM.read(8);I=EEPROM.read(9);J=EEPROM.read(10);delay(10); }else if(readd==2){A=EEPROM.read(11);B=EEPROM.read(12);C=EEPROM.read(13);D=EEPROM.read(14);E=EEPROM.read(15);F=EEPROM.read(16);G=EEPROM.read(17);H=EEPROM.read(18);I=EEPROM.read(19);J=EEPROM.read(20);delay(10); }else if(readd==3){A=EEPROM.read(21);B=EEPROM.read(22);C=EEPROM.read(23);D=EEPROM.read(24);E=EEPROM.read(25);F=EEPROM.read(26);G=EEPROM.read(27);H=EEPROM.read(28);I=EEPROM.read(29);J=EEPROM.read(30);delay(10); }else if(readd==4){A=EEPROM.read(31);B=EEPROM.read(32);C=EEPROM.read(33);D=EEPROM.read(34);E=EEPROM.read(35);F=EEPROM.read(36);G=EEPROM.read(37);H=EEPROM.read(38);I=EEPROM.read(39);J=EEPROM.read(40);delay(10); }else if(readd==5){A=EEPROM.read(41);B=EEPROM.read(42);C=EEPROM.read(43);D=EEPROM.read(44);E=EEPROM.read(45);F=EEPROM.read(46);G=EEPROM.read(47);H=EEPROM.read(48);I=EEPROM.read(49);J=EEPROM.read(50);delay(10); }
}
void Write_user(){  //用来把卡号存在系统中if(EEPROM.read(61)==0){user=1;}else if(EEPROM.read(62)==0){user=2;}else if(EEPROM.read(63)==0){user=3;}else if(EEPROM.read(64)==0){user=4;}else if(EEPROM.read(65)==0){user=5;}if(user==1){EEPROM.write(1,AA);EEPROM.write(2,AB);EEPROM.write(3,AC);EEPROM.write(4,AD);EEPROM.write(5,AE);EEPROM.write(6,AF);EEPROM.write(7,AG);EEPROM.write(8,AH);EEPROM.write(9,AI);EEPROM.write(10,AJ);EEPROM.write(61,1);//Serial.println("已写入用户1");delay(50);user=0;}else if(user==2){EEPROM.write(11,AA);EEPROM.write(12,AB);EEPROM.write(13,AC);EEPROM.write(14,AD);EEPROM.write(15,AE);EEPROM.write(16,AF);EEPROM.write(17,AG);EEPROM.write(18,AH);EEPROM.write(19,AI);EEPROM.write(20,AJ);EEPROM.write(62,1);//Serial.println("已写入用户2");delay(50); user=0;}else if(user==3){EEPROM.write(21,AA);EEPROM.write(22,AB);EEPROM.write(23,AC);EEPROM.write(24,AD);EEPROM.write(25,AE);EEPROM.write(26,AF);EEPROM.write(27,AG);EEPROM.write(28,AH);EEPROM.write(29,AI);EEPROM.write(30,AJ);EEPROM.write(63,1);//Serial.println("已写入用户3");delay(50); user=0;}else if(user==4){EEPROM.write(31,AA);EEPROM.write(32,AB);EEPROM.write(33,AC);EEPROM.write(34,AD);EEPROM.write(35,AE);EEPROM.write(36,AF);EEPROM.write(37,AG);EEPROM.write(38,AH);EEPROM.write(39,AI);EEPROM.write(40,AJ);EEPROM.write(64,1);//Serial.println("已写入用户4");delay(50); user=0;}else if(user==5){EEPROM.write(41,AA);EEPROM.write(42,AB);EEPROM.write(43,AC);EEPROM.write(44,AD);EEPROM.write(45,AE);EEPROM.write(46,AF);EEPROM.write(47,AG);EEPROM.write(48,AH);EEPROM.write(49,AI);EEPROM.write(50,AJ);EEPROM.write(65,1);//Serial.println("已写入用户5");delay(50); user=0;}
}
void Delete_user(){   //删除用户if(delate==1&&EEPROM.read(61)==1){EEPROM.write(1,0);EEPROM.write(2,0);EEPROM.write(3,0);EEPROM.write(4,0);EEPROM.write(5,0);EEPROM.write(6,0);EEPROM.write(7,0);EEPROM.write(8,0);EEPROM.write(9,0);EEPROM.write(10,0);EEPROM.write(61,0);//Serial.println("已删除用户1");delay(50);delate=0;}else if(delate==2&&EEPROM.read(62)==1){EEPROM.write(11,0);EEPROM.write(12,0);EEPROM.write(13,0);EEPROM.write(14,0);EEPROM.write(15,0);EEPROM.write(16,0);EEPROM.write(17,0);EEPROM.write(18,0);EEPROM.write(19,0);EEPROM.write(20,0);EEPROM.write(62,0);//Serial.println("已删除用户2");delay(50); delate=0;}else if(delate==3&&EEPROM.read(63)==1){EEPROM.write(21,0);EEPROM.write(22,0);EEPROM.write(23,0);EEPROM.write(24,0);EEPROM.write(25,0);EEPROM.write(26,0);EEPROM.write(27,0);EEPROM.write(28,0);EEPROM.write(29,0);EEPROM.write(30,0);EEPROM.write(63,0);//Serial.println("已删除用户3");delay(50); delate=0;}else if(delate==4&&EEPROM.read(64)==1){EEPROM.write(31,0);EEPROM.write(32,0);EEPROM.write(33,0);EEPROM.write(34,0);EEPROM.write(35,0);EEPROM.write(36,0);EEPROM.write(37,0);EEPROM.write(38,0);EEPROM.write(39,0);EEPROM.write(40,0);EEPROM.write(64,0);//Serial.println("已删除用户4");delay(50); delate=0;}else if(delate==5&&EEPROM.read(65)==1){EEPROM.write(41,0);EEPROM.write(42,0);EEPROM.write(43,0);EEPROM.write(44,0);EEPROM.write(45,0);EEPROM.write(46,0);EEPROM.write(47,0);EEPROM.write(48,0);EEPROM.write(49,0);EEPROM.write(50,0);EEPROM.write(65,0);//Serial.println("已删除用户5");delay(50); delate=0;}else{//  Serial.println("没有当前用户");}
}void AAA(){   //按键赋值程序digitalWrite(y1,1);digitalWrite(y2,0);digitalWrite(y3,0);digitalWrite(y4,0);delay(2);if(digitalRead(x1)==1){ pp=1;}else if(digitalRead(x2)==1){ pp=2;}else if(digitalRead(x3)==1){ pp=3;} delay(2);digitalWrite(y1,0);digitalWrite(y2,1);digitalWrite(y3,0);digitalWrite(y4,0);delay(2);if(digitalRead(x1)==1){ pp=4;}else if(digitalRead(x2)==1){ pp=5;}else if(digitalRead(x3)==1){ pp=6; }delay(2);digitalWrite(y1,0);digitalWrite(y2,0);digitalWrite(y3,1);digitalWrite(y4,0);delay(2);if(digitalRead(x1)==1){ pp=7;}else if(digitalRead(x2)==1){ pp=8;}else if(digitalRead(x3)==1){ pp=9;}delay(2);digitalWrite(y1,0);digitalWrite(y2,0);digitalWrite(y3,0);digitalWrite(y4,1);delay(2);if(digitalRead(x3)==1){po=10;}else if(digitalRead(x2)==1){pp=0;}else if(digitalRead(x1)==1){pl=11;}delay(2); }
void KM(){for(int y=0;y<50;y++){myservo.write(y);delay(3);}Serial.println("开门");delay(500);
}
void GM(){for(int x=50;x>=0;x--){myservo.write(x);delay(3);}Serial.println("关门");delay(500);
}
void BA(){   //1秒长鸣digitalWrite(Buzzer,1);delay(1000);digitalWrite(Buzzer,0);delay(200);
}
void BB(){  //2次短鸣digitalWrite(Buzzer,1);delay(300);digitalWrite(Buzzer,0);delay(200);digitalWrite(Buzzer,1);delay(300);digitalWrite(Buzzer,0);delay(200);
}
void BC(){   //1次长鸣digitalWrite(Buzzer,1);delay(350);digitalWrite(Buzzer,0);delay(200);
}

Arduino nano ID门禁卡相关推荐

  1. id门禁卡复制到手机_门禁卡复制到苹果手机

    NFC手机一枚 Root Explorer NFC Taginfo 方法/步骤 1,读取卡的ID.安装"NFC TagInfo",打开手机的NFC设置,门禁卡贴到手机后盖NFC部分 ...

  2. id门禁卡复制到手机_门禁卡复制到手机苹果

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 门禁卡复制到苹果手机的步骤如下: 1.首先读取卡的ID,并安装"NFC TagInfo",打开手机的NFC设置 ...

  3. id门禁卡复制到手机_门禁卡怎么复制到苹果手机?

    NFC手机一枚 Root Explorer NFC Taginfo 方法/步骤 1,读取卡的62616964757a686964616fe78988e69d8331333363396461ID.安装& ...

  4. Delphi复制HID、ID门禁卡源码

    T5557卡是美国Atmel公司生产的多功能非接触式射频芯片卡,属于125KHz的低频卡,在国内有广大的应用市场,如很多酒店的门禁卡都是使用T5557卡.该芯片共有330bit(比特)的EPROM(分 ...

  5. id门禁卡复制到手机_手机NFC有哪些功能?怎么设置手机门禁卡?别浪费了手机的NFC功能...

    NFC功能早前都运用一些手机旗舰机中,随着手机技术的发展,现在有许多的手机都有NFC的功能,那手机中的NFC只是个摆设吗?NFC不仅仅有不依靠数据网络.安全稳定的特点,其实还有许多你不知道的功能!比如 ...

  6. id门禁卡复制到手机_怎么将手机当做门禁卡使用?给大家详解手机设置门禁卡功能...

    随着科技的发展,手机的功能是越来越强大了 . 门禁卡,相信大家都不陌生.进出小区都需要刷卡,自从手机可以使用微信跟支付宝支付功能以来,很少人携带钱包出门,一部手机便可以打车.吃饭付钱 等.银行卡跟身份 ...

  7. arduino控制RFID门禁卡

    一.实物连接 二.代码实现 #include"rfid.h" #include <LiquidCrystal_I2C.h> #include <Wire.h> ...

  8. 如何区分电梯卡为id卡ic卡_怎么看小区门禁卡是ic还是id

    门禁卡,在我们生活中常常都会使用到,只要轻轻一刷门就打开了.市面上常见的门禁卡分为ic卡和id卡两种,那么该如何区分它们呢?二者有哪些区别呢?我们马上来看看相关知识吧. 一.怎么看小区门禁卡是ic还是 ...

  9. 开门的磁卡在哪里配_门禁卡可以配吗

    现在的人安全意识都会比较高,所以很多小区的大门或者单元门口都会有设置门禁,需要专门的卡才能进入,这样可以避免外来人员的随意进入,大大的提高了我们小区的财产安全,那么如果不小心门禁卡丢了可不可以另外配呢 ...

最新文章

  1. 递归函数练习——累乘
  2. ElasticSearch wildcard查询(英文检索)
  3. Cocos2d-x中常用宏的作用
  4. anaconda查看conda主环境、虚拟环境的python执行路径
  5. centos 中如何将python更新到最新的版本
  6. JavaMail API详解
  7. boost升压电路原理
  8. 电脑连手机热点找不到服务器的ip地址,电脑开热点手机连不上怎么连接
  9. [feather]StarlingUi框架——feather抱怨
  10. ensp 防火墙 一对一映射
  11. alt复制选区就会卡 ps_ps怎么把选区复制出来
  12. Verify the connector‘s configuration, identify and stop any process that‘s listening on port 80, or
  13. 跟着柴毛毛学Spring(1)——纵观Spring
  14. split-horizon产生的路由欺骗
  15. Druid的segment
  16. [typescript]请使用“以管理员身份运行”选项启动 Windows PowerShell。要更改当前用户的执行策略,请运行 “Set-ExecutionPolicy -Scope Curren
  17. 四川省通江中学2021年高考成绩查询,「通江中学」2021年年通江中学升学率高不高?...
  18. 利用ArcGIS做一张三调土地利用现状图
  19. windows 2008 R2 64位系统杀毒软件
  20. 导入tomcat源码:程序包aQute.bnd.annotation.spi不存在

热门文章

  1. python自然语言处理实战 | NLP中用到的机器学习算法学习笔记
  2. OTP语音芯片是用什么软件来编程,以及如何烧录的?
  3. 然然的烦恼(同余方程)
  4. VITAL视频目标跟踪源码运行笔记——Testing模式
  5. react native 红屏
  6. PWNOS: 1.0 解法一
  7. Kaggle上传数据时出现错误,且不是网络问题
  8. 在conda下的sklearn库安装
  9. 科赫曲线python解析_实施科赫曲线?
  10. python中sendmessage的使用_SendMessage用法实例