1. 前言

当今社会是科学技术日新月异、飞速发展的信息时代。人们正感受着高科技给他们带来的极大方便和益处,同时,人们对于高科技服务于生活的要求也越来越高。但随着科技的发展,也带来了许多不安全的方面。例如,运用高科技手段进行盗窃、抢劫和间谍等万巳罪行为与日增多。怎样才能使人们的安全防范措施跟得上科技的发展、更有效的阻止这些犯罪行为的侵犯呢? 仅仅依靠普通的门锁、防盗门或者监控、报警等系统是不够的。于是基于物联网的智能门禁考勤签到系统在千呼万唤中应运而生。

传统的门锁仅仅是单纯的契合性机械装置,无论它的结构如何复杂坚固,一把在街头就可以配制的钥匙就能打开,并且不留痕迹。如果钥匙遗失连带门锁也要一起更换。为了弥补这些缺点,又产生了磁卡门禁系统。用磁卡控制锁,各种性能均有所提高,但由于磁条存储的信息量小,磁卡与读卡器之间容易产生机械磨损,并且读卡器的刷卡口容易被人为破坏,它的安全性和可靠性便受到限制。随着现代化经济建设和管理的发展,各种酒店、宾馆、写字楼、智能大厦、政府机关和企事业单位、高级物业管理部门等,对门禁系统的需求正发生着重大的变化,其核心是对门锁及其开启、关闭实现智能化管理。

深入分析了国内安防门禁签到系统的发展现状和社会需求后,并在物联网的春风沐浴下,从低成本和低功耗出发,利用STM32芯片搭建一个基于物联网的门禁与签到管理系统,帮助人们在惜时如金的生活中快速解决门禁开锁、签到身份记录问题。

如果需要项目资料可以在这里去下载:
https://download.csdn.net/download/xiaolong1126626497/85898161

2. 功能总结

本课题设计一款基于物联网的门禁与考勤管理系统,有门禁控制和考勤两个方面。

1.实现指纹、射频卡、密码开门,同时数据可以上报给云端

2.通过微信实现远程查看开门时的信息,对门禁的出入情况进行记录

3.小程序端也可以远程控制开门

4.环境检测,显示门禁位置的温湿度等环境信息

5.实现签到功能,微信端显示签到信息

技术实现思路以及功能总结:

单片机选择STM32F103RCT6最小系统板,整个系统支持4种开锁方式:指纹开锁、IC卡刷卡开锁、矩阵键盘输入密码开锁、网页端远程按钮开锁等4种方式,开锁和关锁采用继电器吸合方式来模拟。为了方便远程了解门禁的出入情况,采用阿里云物联网平台作为云平台服务器,本地设备通过ESP8266将采集的温湿度信息、门禁出入的身份ID上传到阿里云网页进行实时显示。

需要的硬件:

(1)STM32F103RCT6最小系统板+一块LCD显示屏

(2)AS608光电指纹模块

(3)继电器模块

(4)矩阵键盘

(5)DHT11温湿度模块

(6)ESP8266串口WIFI

(7)RC522刷卡模块

3. 硬件选型

3.1 电容键盘

3.2 STM32开发板

STM32F103RCT6的芯体规格是32位,速度是72MHz,程序存储器容量是256KB,程序存储器类型是FLASH,RAM容量是48K。

3.3 PCB洞洞板

3.4 母对母杜邦线

3.5 ESP8266 WIFI

ESP8266是一款物联网WiFi芯片,基于ESP8266可以开发物联网串口WiFi模块,像SKYLAB的WG219/WG229专为移动设备和物联网应用设计,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。

ESP8266,专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了超低功耗。ESP8266EX 具有的省电模式适用于各种低功耗应用场景。ESP8266内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,支持实时操作系统 (RTOS) 和 Wi-Fi 协议栈,可将高达 80% 的处理能力留给应用编程和开发。

3.6 继电器模块

3.7 DHT11温湿度模块

3.8 AS608指纹模块

此款指纹模块带七彩呼吸灯,接口为SH1.0-6P,指纹容量有3种,分别是50枚,100枚,300枚。容量不同,价格也不同。

具有体积小、 功耗低、 接口简单、可靠性高、 识别速度快、 干湿手指适应性好, 指纹搜索速度快的特点。 指纹图像读取时, 对干湿手指都有灵敏的反应和判断, 获得最佳的成像质量, 适用人群广泛。也可定制自学习适应功能, 根据使用者的习惯、气候等的变化自动调整参数, 做到更好的匹配。 具备自学习功能, 指纹识别过程中, 提取新的指纹特征值识别成功后将该特征值融合到之前的指纹特征中, 实际使用过程中越用越好用。模块还具备感应手指功能, 当手指按压到指纹采集面时, 模块 Touch 脚输出高电平。模块通讯接口为UART通信接口, 本模块作为从设备, 由主设备发送相关命令对其进行控制。该模块具有可调节的安全等级功能、 指纹特征数据的读/写功能。

**注意: **指纹模块有两路电源输入,Vsen 是给传感器供电,VDD 是给主控芯片 DSP 供电,即指纹模组主要是由指纹传感器 Sensor 和主控芯片 DSP 组成。在给整个系统上电之初(如电池供电),必须同时给这两路电源供电,让 DSP 对 Sensor 进行初始化,持续时间至少 200ms,随后再关断主控芯片电源 VDD。该初始化,有一个主要的步骤,就是对传感器触摸感应功能进行初始化,以便触摸信号 Touch 能够正常输出。

4. 创建阿里云设备

4.1 创建产品

官网地址: https://iot.console.aliyun.com/lk/summary/new

没有账号需要先注册账号,实名认证之后登录。

先开通公共实例。

4.2 定义物模型

地址:https://iot.console.aliyun.com/product/createProduct

物模型就是设备上传数据的类型,自己设备有哪些需要上传的属性加上即可。

点击添加自定义功能,加入自己需要的属性。

**目前设备上传的数据有4个:**分别是环境温度、环境湿度、签到或者开门人的指纹ID、签到或者开门人的刷卡ID。

最后点击发布上线。

物模型:

{  "properties": [    {      "identifier": "DHT11_T",      "dataType": {        "type": "int"      }    },    {      "identifier": "DHT11_H",      "dataType": {        "type": "int"      }    },    {      "identifier": "TOUCH_ID",      "dataType": {        "type": "int"      }    },    {      "identifier": "CARD_ID",      "dataType": {        "type": "text"      }    },    {      "identifier": "motor",      "dataType": {        "type": "int"      }    }  ]}

4.3 创建设备

保存设备的信息,接下来生成MQTT登录参数需要使用。

{  "ProductKey": "h7s8JDdEcH3",  "DeviceName": "133K0VSu2G9y6XEFBlUb",  "DeviceSecret": "b2449f7fbc02c92fbbf7f86d7bac84cd"}

4.4 MQTT客户端上报数据

关于MQTT协议登录所需要的参数官方说明文档: https://help.aliyun.com/document_detail/140507.html” />

(1)MQTT登录地址

MQTT登录域名的格式:${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com其中:${YourProductKey}:请替换为设备所属产品的ProductKey${YourRegionId}:请替换为物联网平台设备所在地域代码。下面是阿里云国内的服务器地域和可用区详情: 地域名称所在城市Region ID可用区数量华北 1青岛cn-qingdao    2华北 2北京cn-beijing    10华北 3张家口cn-zhangjiakou3华北 5呼和浩特cn-huhehaote2华北 6乌兰察布cn-wulanchabu3华东 1杭州cn-hangzhou    8华东 2上海cn-shanghai  8华南 1深圳cn-shenzhen   6华南 2河源cn-heyuan    2华南 3广州cn-guangzhou2西南 1成都cn-chengdu    2端口号是:1883经过上面的格式解释,我的阿里云服务器登录的域名就是(选择的是上海服务器):h7s8JDdEcH3.iotas-mqtt.cn-shanghai.aliyuncs.com域名对应的IP地址(动态解析出来的):  101.133.196.97在线解析域名网站:https://site.ip138.com/a1cMlEwEwjg.iot-as-mqtt.cn-shanghai.aliyuncs.com/

(2)MQTT登录参数

(1) MQTT_ClientID固定格式:${ClientID}|securemode=${Mode},signmethod=${SignMethod}|。参数说明:${ClientId}:  设备ID,一般填设备的硬件编号。我这里就直接填当前的设备名称,后面的密码里也要填这个ID,必须一样就行。(设备名称就是创建设备的时候复制出来3个参数里的设备名称)securemode=3:TCP直连模式,无需设置SSL/TLS信息。securemode=2:TLS直连模式,需要设置SSL/TLS信息。${SignMethod}:算法类型,支持hmacmd5和hmacsha1。示例:当前我的设备名称是:133K0VSu2G9y6XEFBlUb ,选择TCP直连模式,选择hmacsha1算法类型。那么我的ClientID就是:133K0VSu2G9y6XEFBlUb|securemode=3,signmethod=hmacsha1|(2) MQTT_UserName固定格式:${DeviceName}&${ProductKey}参数解释:${DeviceName} 是设备的名称(就是创建设备的时候复制出来3个参数里的设备名称)${ProductKey} 是设备的ProductKey(就是创建设备的时候复制出来3个参数里的ProductKey)示例:当前我的设备名称是:133K0VSu2G9y6XEFBlUb ,我的ProductKey是:h7s8JDdEcH3那么我的UserName就是:133K0VSu2G9y6XEFBlUb&h7s8JDdEcH3(3) MQTT_PassWord下载密码生成小工具:https://help.aliyun.com/document_detail/140507.html" />

计算MQTT签名-密码:https://help.aliyun.com/document_detail/292635.htm?spm=a2c4g.11186623.0.0.5aaf3686v36VUs#section-jx3-u57-pmm

根据设备证书信息,填入参数,然后生成MQTT登录密匙。

生成的信息如下:这3个数据就是接下来,MQTT登录使用的密匙信息

填入设备信息:productKey:  h7s8JDdEcH3deviceName:  133K0VSu2G9y6XEFBlUbdeviceSecret:  b2449f7fbc02c92fbbf7f86d7bac84cdtimestamp:  1652074854015clientId:  133K0VSu2G9y6XEFBlUb计算结果:mqttClientId: 133K0VSu2G9y6XEFBlUb|securemode=2,signmethod=hmacsha1,timestamp=1652074854015|username: 133K0VSu2G9y6XEFBlUb&h7s8JDdEcH3password: CB182C6AE45CF2529AD91ADE2C5886EA7A67FC7E

(3)使用MQTT客户端登录

按照软件提示的参数填入进去,点击登录即可。

软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012

登录阿里云端可以看到设备已经在线了。

(4)主题订阅、发布测试

在产品页面可以看到主题格式:https://iot.console.aliyun.com/product/productDetail/a1cMlEwEwjg/func" />

发布主题:/sys/h7s8JDdEcH3/133K0VSu2G9y6XEFBlUb/thing/event/property/post上报属性消息的格式:  {"method":"thing.event.property.post","params":{"DHT11_T":28,"DHT11_H":80,"TOUCH_ID":1,"CARD_ID":"1234567890","motor":1}}订阅主题:/sys/h7s8JDdEcH3/133K0VSu2G9y6XEFBlUb/thing/service/property/set

网页端收到发布的消息:

4.5 MQTT服务器信息总结

MQTT服务器登录的信息:mqttClientId: nSK7cPjbnPPBFsLch47U|securemode=2,signmethod=hmacsha1,timestamp=1652076448733|username: nSK7cPjbnPPBFsLch47U&h7s8SDIY078password: B2F31FA2AB991E98881FABDA45E01E0291014400发布主题:/sys/h7s8SDIY078/nSK7cPjbnPPBFsLch47U/thing/event/property/post上报属性消息的格式:  {"method":"thing.event.property.post","params":{"DHT11_T":28,"DHT11_H":80,"TOUCH_ID":1,"CARD_ID":"1234567890"}}订阅主题:/sys/h7s8SDIY078/nSK7cPjbnPPBFsLch47U/thing/service/property/set

4.6 创建可视化项目

地址: https://iot.console.aliyun.com/lk/related-services

进入到页面编辑区域。

4.7 关联产品与设备

链接: https://studio.iot.aliyun.com/project/a123UfKp0N6Xy62b/device

4.8 设计UI界面

链接:https://studio.iot.aliyun.com/p/a123UfKp0N6Xy62b/project/detail

配置仪表盘的的数据源

设计完毕页面后点击发布。

最终显示的效果:

为了方便远程控制门锁开关,再加一个按钮:

设备登录之后,点击网页上的按钮开关,会自动下发数据:

len:161,Data:@/sys/h7s8SDIY078/nSK7cPjbnPPBFsLch47U/thing/service/property/set{"method":"thing.service.property.set","id":"1426170453","params":{"motor":1},"version":"1.0.0"}len:161,Data:@/sys/h7s8SDIY078/nSK7cPjbnPPBFsLch47U/thing/service/property/set{"method":"thing.service.property.set","id":"1431295144","params":{"motor":0},"version":"1.0.0"}

5. STM32程序设计

采用的这块开发板有3个可以编程使用的按键,1个复位按键。

程序里使用这3个按键来完成显示屏+指纹模块的操作,完成指纹的录入、删除等操作。

板子上有2盏LED灯,可以用来当做状态指示灯使用。

板子上的LCD屏插口可以直接插入0.96寸OLED显示屏或者1.44寸的TFT显示屏,比较坑的地方:这个LCD显示屏插槽的背光引脚居然是PB10,一般情况下PB10肯定要当做串口使用的,所以当前是将LCD屏通过杜邦线引出来接其他引脚实现驱动的。

本设计里采用了ESP8266-WIFI,这个串口协议的WIFI,内置了完整的TCP/IP协议栈,也支持AP+STA模式,当前设计里,ESP8266通过代码方式配置成STA模式,去连接指定可以上网的路由器,再配合代码里封装的MQTT协议,登录阿里云物联网服务器,完成数据交互。

指纹识别采用AS608光电指纹模块,这个指纹模块内置了50~300枚指纹存放空间,通过串口协议完成指纹的比对、录入、删除等操作。

DHT11是一个数字温湿度传感器,采用单总线协议,完成温度、湿度的数据读取。

继电器模块是一个带光耦隔离的,支持高低电平触发的开关模块,可以用来控制220V的家电设备。

5.1 硬件接线

1)AS608指纹模块接线VCC---3.3v(1号线)PA6---触摸感应线-高电平有效(2号线)VCC---3.3V(3号线)PA3(RX)---指纹模块的TX(4号线)PA2(TX)---指纹模块的RX(5号线)GND---GND(6号线)2)ATK-ESP8266 WIFI接线PB10(TX)--RXD 模块接收脚PB11(RX)--TXD 模块发送脚GND---GND 地VCC---VCC 电源(3.3V~5.0V)(3)温湿度传感器: DHT11VCC--VCCGND---GNDDAT---PA5 (4)继电器--模拟门禁锁的开关DAT: PB12 +  : 5V-  : GND(5)OLED显示屏接线:GND   电源地VCC   接 5V或3.3v电源SCL   接 PC8(SCL)SDA   接 PC9(SDA)RST   接 PC10DC    接 PB7CS    接 PB8BL  接 PB4(6)板载LED灯接线LED1---PA8LED2---PD2(7)板载按键接线K0---PA0 K1---PC5 K2---PA15(8)触摸按键使用TTP229型号的驱动芯片SCL接----------->PC1--修改SDA-OUT接------->PC2--修改电源接---------->VCC-3.3GND接----------->GND(9)RC522射频模块外部的接口:    *1--SDA <----->PC14--片选脚*2--SCK <----->PC15--时钟线*3--MOSI<----->PA12--输出*4--MISO<----->PA11--输入*5--悬空*6--GND <----->GND*7--RST <----->PA4--复位脚*8--VCC <----->VCC

5.2 开发板原理图

5.3 可用的IO口

STM32F103RCT6开发板可以使用的引脚:PC13PC14PC15PD0--OSCIN-----特殊PD1--OSCOUT----特殊PC0PC1PC2PC3PA0----K0PA1PA2--串口2PA3--串口2PA4PA5---SPI1_SCKPA6---SPI1_MISOPA7---SPI1_MOSIPC4PC5----K1PB0PB1PB2---BOOT1--特殊PB10--串口3PB11--串口3PB8PB9PB7PB6PB5PB4PB3PD2------LED2PC12----IIC_SCLPC11----IIC_SDAPC10PA15---K2PA14---SWCLKPA13---SWDIOPA12PA11PA10---串口1PA9----串口1PA8----LED1PC9PC8PC7PC6PB15PB14PB13PB12

5.4 汉字取模

5.5 程序下载

5.6 keil工程

5.7 代码分析

(1)MQTT的参数与WIFI的参数配置

在main.c文件最前面,是阿里云MQTT协议的参数配置,主要的是93行的这个路由器的信息配置。

(2)WIFI初始化配置

整个设备是通过ESP8266联网的,ESP8266连接网络的过程都通过串口打印出来了,正常情况下,串口口上会打印,WIFI:0这样的提示,表示路由器网络连接成功。

具体代码位置看下图中圈出来的位置:

连接阿里云服务器,订阅主题的代码:

 printf("正在初始化ESP8266..\r\n");      for(i=0;i<5;i++)    {        if(ESP8266_Init()==0)        {            esp8266_state=1;            break;        }        else        {            esp8266_state=0;            printf("ESP8266硬件检测错误.\n");          }    }     if(esp8266_state)   {        printf("准备连接服务器....\r\n");        //非加密端口        printf("WIFI:%d\n",ESP8266_STA_TCP_Client_Mode(CONNECT_WIFI,CONNECT_PASS,CONNECT_SERVER_IP,CONNECT_SERVER_PORT,1));                 //2. MQTT协议初始化        MQTT_Init();         //3. 连接服务器          for(i=0;i<5;i++)        {            if(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)==0)            {                esp8266_state=1;                break;            }            esp8266_state=0;            printf("服务器连接失败,正在重试...\n");            delay_ms(500);        }        printf("服务器连接成功.\n");        //3. 订阅主题        if(MQTT_SubscribeTopic(SET_TOPIC,0,1))        {           printf("主题订阅失败.\n");        }        else        {           printf("主题订阅成功.\n");        }    }      printf("进入系统主循环...\r\n");

(3)温湿度模块数据读取

在while循环里每1秒钟会上传一次当前系统中温度、湿度、还有IC卡号、指纹ID、锁状态信息上传到阿里云服务器。上传数据调用MQTT_PublishData完成。这个上传函数也会花费时间,其他地方的代码也会花费时间,所以上传数据设置为1秒钟实际加上其他地方消耗的时间,是差不多3~5秒的频率上传一次数据到阿里云。

具体实现的代码入下图标注:

具体实现代码:

if(wifi_TimeCnt>=100) //1000毫秒一次        {            wifi_TimeCnt=0;            LED1=!LED1;                        //读取温湿度            if(DHT11_Read_Data(&dht11_temp,&dht11_humidity))            {                printf("温度读取失败.\r\n");            }                                    printf("环境温度:%d\r\n环境湿度:%d\r\n",dht11_temp,dht11_humidity);             //环境温度            sprintf(data_buff,"%d",dht11_temp);            Gui_DrawFont_GBK16(72,16*0,RED,0,(u8*)data_buff);                        //环境湿度            sprintf(data_buff,"%d",dht11_humidity);            Gui_DrawFont_GBK16(72,16*1,RED,0,(u8*)"       ");            Gui_DrawFont_GBK16(72,16*1,RED,0,(u8*)data_buff);                        //MQTT上报数据            sprintf(mqtt_message,"{\"method\":\"thing.event.property.post\",\"id\":\"1234567890\",\"params\":{\"DHT11_T\":%d,\"DHT11_H\":%d,\"TOUCH_ID\":%d,\"motor\":%d,\"CARD_ID\":\"%s\"},\"version\":\"1.1.1\"}",            dht11_temp,dht11_humidity,TOUCH_ID,MOTOR_A,CARD_ID);            MQTT_PublishData(POST_TOPIC,mqtt_message,0);            printf("%s\r\n",mqtt_message);                    }

(4)矩阵键盘检测

读取矩阵键盘的键值,输入密码,在LCD屏实时显示,并完成密码验证开锁。

具体实现代码:

   //触摸按键检测        key=Touch_KeyScan();        if(key)        {            printf("触摸按键=%d\r\n",key);            time_cnt3=0;                        //密码输入            if(key==1)my_strcat("1");            if(key==2)my_strcat("2");            if(key==3)my_strcat("3");            if(key==5)my_strcat("4");            if(key==6)my_strcat("5");            if(key==7)my_strcat("6");            if(key==9)my_strcat("7");             if(key==10)my_strcat("8");             if(key==11)my_strcat("9");             if(key==14)my_strcat("0");                                     //按下*号键,清除所有密码            if(key==13)            {                pass_show_buff[0]='\0';                pass_show_temp_buff[0]='\0';                pass_show_cnt=0;                Gui_DrawFont_GBK16(0,16*4,WHITE,0,(u8*)"          ");            }                        //按下D号按键,清除密码最后一位            if(key==16)            {                delete_ending_char(pass_show_buff);                delete_ending_char(pass_show_temp_buff);                Gui_DrawFont_GBK16(0,16*4,WHITE,0,(u8*)"          ");            }                                    //按下#号键            if(key==15)            {                printf("密码:%s\r\n",pass_show_temp_buff);                //比较密码是否输入正确                if(strcmp(pass_show_temp_buff,"123456")==0)                {                    MOTOR_A=1;                    printf("输入密码->开锁成功.\r\n");                }                else                {                   MOTOR_A=0; //失败就关锁                }            }                        //显示密码*号            Gui_DrawFont_GBK16(0,16*4,WHITE,0,(u8*)pass_show_buff);        }     

(5)指纹模块录入和删除

在while循环里不断轮询按键检测函数,如果按下板子上自带的独立按键,会进去指纹录入模式和指纹删除模式。

进入指纹录入模式后,屏幕上会显示正在录入指纹,并且按下剩余两个按键可以设置ID值。删除指纹模式也是一样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zn45r9uE-1661737905114)(C:\Users\11266\AppData\Roaming\Typora\typora-user-images\image-20220510131945211.png)]

具体实现代码:

 //板载的按键检测       key_val2=KEY_Scan();       if(key_val2)       {           printf("按键按下:%d\r\n",key_val2);       }        //录入指纹        if(key_val2==1)        {            printf("录入指纹.\r\n");                        Gui_DrawFont_GBK16(0,16*6,WHITE,0,(u8*)"             ");            LCD_ShowChineseFont(16*0,16*6,16,HZ_FONT_16[15],WHITE,0);            LCD_ShowChineseFont(16*1,16*6,16,HZ_FONT_16[16],WHITE,0);            LCD_ShowChineseFont(16*2,16*6,16,HZ_FONT_16[17],WHITE,0);            LCD_ShowChineseFont(16*3,16*6,16,HZ_FONT_16[18],WHITE,0);            LCD_ShowChineseFont(16*4,16*6,16,HZ_FONT_16[19],WHITE,0);            LCD_ShowChineseFont(16*5,16*6,16,HZ_FONT_16[20],WHITE,0);                    //置位            input_touch_id=Touch_id_Num;                        while(1)            {                              //外接按键检测               key_val2=KEY_Scan();               if(key_val2)               {                   printf("按键按下:%d\r\n",key_val2);               }                              //录入指纹                if(key_val2==1)                {                    printf("录入指纹,选择的ID:%d\r\n",input_touch_id);                    Add_FR(input_touch_id);                                        break;                }                  //ID++                else if(key_val2==2)                {                    input_touch_id++;                    if(input_touch_id>49)input_touch_id=49;                    printf("input_touch_id:%d\r\n",input_touch_id);                }                  //ID--                else if(key_val2==3)                {                    input_touch_id--;                    if(input_touch_id<0)input_touch_id=0;                    printf("input_touch_id:%d\r\n",input_touch_id);                }                                 sprintf(data_buff,"ID:%d",input_touch_id);                Gui_DrawFont_GBK16(0,16*7,WHITE,0,(u8*)data_buff);               }           Gui_DrawFont_GBK16(0,16*6,WHITE,0,(u8*)"             ");           Gui_DrawFont_GBK16(0,16*7,WHITE,0,(u8*)"             ");                     }        //删除指纹        else if(key_val2==2)        {             printf("删除指纹.\r\n");                        Gui_DrawFont_GBK16(0,16*6,WHITE,0,(u8*)"             ");            LCD_ShowChineseFont(16*0,16*6,16,HZ_FONT_16[15],WHITE,0);            LCD_ShowChineseFont(16*1,16*6,16,HZ_FONT_16[16],WHITE,0);            LCD_ShowChineseFont(16*2,16*6,16,HZ_FONT_16[21],WHITE,0);            LCD_ShowChineseFont(16*3,16*6,16,HZ_FONT_16[22],WHITE,0);            LCD_ShowChineseFont(16*4,16*6,16,HZ_FONT_16[19],WHITE,0);            LCD_ShowChineseFont(16*5,16*6,16,HZ_FONT_16[20],WHITE,0);                      //置位            input_touch_id=Touch_id_Num;                        while(1)            {                //外接按键检测               key_val2=KEY_Scan();               if(key_val2)               {                   printf("按键按下:%d\r\n",key_val2);               }                                           //删除指纹                if(key_val2==1)                {                    printf("删除指纹,选择的ID:%d\r\n",input_touch_id);                    Del_FR(input_touch_id);                                        break;                }                  //ID++                else if(key_val2==2)                {                    input_touch_id++;                    if(input_touch_id>49)input_touch_id=49;                    printf("input_touch_id:%d\r\n",input_touch_id);                }                  //ID--                else if(key_val2==3)                {                    input_touch_id--;                    if(input_touch_id<0)input_touch_id=0;                    printf("input_touch_id:%d\r\n",input_touch_id);                }                                 sprintf(data_buff,"ID:%d",input_touch_id);                Gui_DrawFont_GBK16(0,16*7,WHITE,0,(u8*)data_buff);   ;             }                     Gui_DrawFont_GBK16(0,16*6,WHITE,0,(u8*)"             ");           Gui_DrawFont_GBK16(0,16*7,WHITE,0,(u8*)"             ");                       }                   time_cnt3++;        wifi_TimeCnt++;        DelayMs(10);         //输入密码超时清除密码输入框        if(time_cnt3>=300)        {            time_cnt3=0;            delete_ending_char(pass_show_buff);            delete_ending_char(pass_show_temp_buff);            Gui_DrawFont_GBK16(0,16*4,WHITE,0,(u8*)"          ");            Gui_DrawFont_GBK16(0,16*6,WHITE,0,(u8*)"           ");        }

(6)IC刷卡

当前系统也支持IC卡刷卡,读取卡号判断开锁。

具体实现代码如下:

  //刷卡      if(search_card(Card_IC)==MI_OK)      {          printf("卡号:%X%X%X%X\r\n",Card_IC[0],Card_IC[1],Card_IC[2],Card_IC[3]);                    //比较卡号是否相等          //卡号:F39A471B          if(Card_IC[0]==0xF3 &&              Card_IC[1]==0x9A &&              Card_IC[2]==0x47 &&              Card_IC[3]==0x1B)          {              MOTOR_A=1;              printf("开锁成功-卡1.\r\n");             //相等就保存到CARD_ID数组里上传到云端            sprintf((char*)CARD_ID,"%X%X%X%X",Card_IC[0],Card_IC[1],Card_IC[2],Card_IC[3]);          }            else  //比较卡号是否相等          //卡号:BCA5CB34          if(Card_IC[0]==0xBC &&              Card_IC[1]==0xA5 &&              Card_IC[2]==0xCB &&              Card_IC[3]==0x34)          {              MOTOR_A=1;              printf("开锁成功-卡2.\r\n");              //相等就保存到CARD_ID数组里上传到云端              sprintf((char*)CARD_ID,"%X%X%X%X",Card_IC[0],Card_IC[1],Card_IC[2],Card_IC[3]);          }        }

(7)指纹判断

指纹模块有一根状态线,如果有指纹按下,会输出高电平,当手指按下时,就会进行指纹搜索,搜索成功完成开锁。

具体实现代码:

//函数功能: 搜索指纹//函数返回值: -1表示搜索失败  >=0 表示搜索到的指纹IDint press_FR(void){SearchResult seach;u8 ensure;char *str;ensure=PS_GetImage();if(ensure==0x00)//获取图像成功 {ensure=PS_GenChar(CharBuffer1);if(ensure==0x00) //生成特征成功{ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);if(ensure==0x00)//搜索成功{printf("搜索指纹成功.\r\n");printf("Match ID:%d  Match score:%d",seach.pageID,seach.mathscore);//显示匹配指纹的ID和分数                                //保存指纹ID                TOUCH_ID=seach.pageID;                                MOTOR_A=1;                return seach.pageID;            }else ShowErrMessage(ensure);  }elseShowErrMessage(ensure); delay_ms(1000);//延时后清除显示}    return -1;}