#物联网征文# 基于STM32智能门禁系统(阿里云)_2022 原创 精华
1. 前言
随着社会进步,生活质量提高,尤其是网络技术和计算机越来越和我们的生活紧密联系,这给社会的信息化的安全带来了很多新挑战,有些简单身份识别方式,因其局限性逐渐暴露出其自身缺点,人们开始寻找更加安全性的身份识别方式,由于生物特征具有唯一性和确定性并能随身携带,简单易用等优点,用生物特征确认所有者信息一直是人们所注重的身份识别方式,尤其是近年来智能科技的飞速发展,人们慢慢得不再满足门锁、钥匙、门禁卡等手工安防设备,所以在人类社会发展过程中指纹识别技术应运产生。指纹识别技术具有很强的优势:指纹是人体的一大特点,人类指纹相同的概率几乎为零,等同于说指纹是每个人生来就有、无可替代的密码。因此我相信指纹识别技术一定前景广阔,深受用户喜欢。
2. 功能总结
功能总结:
- 匹配指纹,匹配成功这个指纹得到ID后,上传阿里云网页显示,并且控制步进电机转动一圈,模拟门锁打开
- 读取温湿度传感器信息,上传阿里云网页显示,如果温湿度超过阀值,报警鸣笛
- 阿里云网页上设置一个按钮,控制步进电机转动一圈,模拟门锁打开
- 设备端采用0.96寸oled屏幕显示录入指纹和指纹相关的操作提示
- 设备端使用四个按键控制录入指纹和查找录入指纹的模板id号
(完成指纹录入和指纹查找功能)指纹查找成功将ID上传至阿里云网页展示。 - 设备端采用STM32当做主控板
- 物联网云平台采用阿里云,使用阿里云的网页组件设计网页,完成数据展示与交互
- 联网的模块采用正点原子的ESP8266-WiFi,完成与阿里云的连接。
硬件选型:
(1)一个电容试矩阵键盘
(2)一个STM32F103C8T6系统板
(3)一个DHT11 温湿度模块
(4)一个正点原子的ESP8266-串口WIFI
(5)一个0.96寸中景园电子的IIC接口的OLED显示屏
(6)一个5V的步进电机—网页上有一个电机的开关按钮可以控制电机转动。
(7)一个AS608指纹模块,用来识别、录入指纹
(8)一个蜂鸣器模块,当温湿度超过阀值报警
3. 硬件选型
3.1 AS608指纹模块
此款指纹模块带七彩呼吸灯,接口为SH1.0-6P,指纹容量有3种,分别是50枚,100枚,300枚。容量不同,价格也不同。
具有体积小、 功耗低、 接口简单、可靠性高、 识别速度快、 干湿手指适应性好, 指纹搜索速度快的特点。 指纹图像读取时, 对干湿手指都有灵敏的反应和判断, 获得最佳的成像质量, 适用人群广泛。也可定制自学习适应功能, 根据使用者的习惯、气候等的变化自动调整参数, 做到更好的匹配。 具备自学习功能, 指纹识别过程中, 提取新的指纹特征值识别成功后将该特征值融合到之前的指纹特征中, 实际使用过程中越用越好用。模块还具备感应手指功能, 当手指按压到指纹采集面时, 模块 Touch 脚输出高电平。模块通讯接口为UART通信接口, 本模块作为从设备, 由主设备发送相关命令对其进行控制。该模块具有可调节的安全等级功能、 指纹特征数据的读/写功能。
**注意: **指纹模块有两路电源输入,Vsen 是给传感器供电,VDD 是给主控芯片 DSP 供电,即指纹模组主要是由指纹传感器 Sensor 和主控芯片 DSP 组成。在给整个系统上电之初(如电池供电),必须同时给这两路电源供电,让 DSP 对 Sensor 进行初始化,持续时间至少 200ms,随后再关断主控芯片电源 VDD。该初始化,有一个主要的步骤,就是对传感器触摸感应功能进行初始化,以便触摸信号 Touch 能够正常输出。
3.2 蜂鸣器模块
3.3 STM32F103C8T6开发板
3.4 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.5 OLED显示屏(IIC协议)
特点:
OLED是有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层、和玻璃基板、当有电流通过时、这些有机材料就会发光、而且OLED显示屏幕可视角大、功耗低、OLED由于同时具备自发光、不需背光源(只是供电不会亮的、驱动程序和接线正确才会点亮)对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高、而OLED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的显示效果好、模块供电可以是3.3v也可以是5V、不需要修改模块电路、OLED屏具有多个控制指令、可以控制oLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCH、图案等、同时为了方便应用在产品上、预留4个M3固定孔、方便用户固在机壳上。
3.6 母对母杜邦线
3.7 矩阵键盘模块
3.8 步进电机模块
3.9 DHT11温湿度模块
4. 阿里云物联网产品与设备创建
4.1 创建产品
官网地址: https://iot.console.aliyun.com/lk/summary/new
没有账号需要先注册账号,实名认证之后登录。
先开通公共实例。
创建产品。
4.2 创建设备
查看设备证书。
{
"ProductKey": "h1mlEW5LClO",
"DeviceName": "AccessControl",
"DeviceSecret": "fdc6317c3836197bbc3a87e256212037"
}
4.3 创建自定义属性
添加自己需要上传的传感器属性。环境温度、环境湿度、触摸ID、门禁开关
门禁开关是需要下发命令的,属性选择为读写。
添加好属性,发布上线。
4.4 物模型
后面的MQTT数据交互,上报主题,需要用到这些参数格式。
{
"properties": [
{
"identifier": "DHT11_T",
"dataType": {
"type": "int"
}
},
{
"identifier": "DHT11_H",
"dataType": {
"type": "int"
}
},
{
"identifier": "motor",
"dataType": {
"type": "int"
}
},
{
"identifier": "TOUCH_ID",
"dataType": {
"type": "int"
}
}
]
}
4.5 创建可视化界面
地址: https://iot.console.aliyun.com/lk/related-services
设计页面。
4.6 绑定数据源
选中控件配置数据来源。
其他同理。
4.7 发布页面
发布链接:https://a120jmulpgykrx6a.vapp.cloudhost.link/page/907526?token=18efcec4eea7d09bb7cff6bee6f15b14
现在设备没有激活,也没有上传数据,页面上没有显示。接下来就上报数据测试。
4.8 MQTT客户端上报数据
关于MQTT协议登录所需要的参数官方说明文档: https://help.aliyun.com/document_detail/140507.html?spm=a2c4g.11186623.6.571.1e417544OGPj2y
(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-zhangjiakou 3
华北 5 呼和浩特 cn-huhehaote 2
华北 6 乌兰察布 cn-wulanchabu 3
华东 1 杭州 cn-hangzhou 8
华东 2 上海 cn-shanghai 8
华南 1 深圳 cn-shenzhen 6
华南 2 河源 cn-heyuan 2
华南 3 广州 cn-guangzhou 2
西南 1 成都 cn-chengdu 2
端口号是:1883
经过上面的格式解释,我的阿里云服务器登录的域名就是(选择的是上海服务器):h1mlEW5LClO.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。
示例:
当前我的设备名称是:AccessControl ,选择TCP直连模式,选择hmacsha1算法类型。
那么我的ClientID就是:
AccessControl|securemode=3,signmethod=hmacsha1|
(2) MQTT_UserName
固定格式:${DeviceName}&${ProductKey}
参数解释:
${DeviceName} 是设备的名称(就是创建设备的时候复制出来3个参数里的设备名称)
${ProductKey} 是设备的ProductKey(就是创建设备的时候复制出来3个参数里的ProductKey)
示例:
当前我的设备名称是:AccessControl ,我的ProductKey是:h1mlEW5LClO
那么我的UserName就是:
AccessControl&h1mlEW5LClO
(3) MQTT_PassWord
下载密码生成小工具:https://help.aliyun.com/document_detail/140507.html?spm=a2c4g.11186623.6.571.1e417544OGPj2y#section-dai-o6u-deh
计算MQTT签名-密码:https://help.aliyun.com/document_detail/292635.htm?spm=a2c4g.11186623.0.0.5aaf3686v36VUs#section-jx3-u57-pmm
根据设备证书信息,填入参数,然后生成MQTT登录密匙。
生成的信息如下:这3个数据就是接下来,MQTT登录使用的密匙信息
mqttClientId:
AccessControl|securemode=2,signmethod=hmacsha1,timestamp=1651292357675|
username:
AccessControl&h1mlEW5LClO
password:
3024488C8950E8F771186EE53644329D9DA23843
(3)主题订阅、发布测试
在产品页面可以看到主题格式:https://iot.console.aliyun.com/product/productDetail/a1cMlEwEwjg/func?current=2
发布主题:
/sys/h1mlEW5LClO/AccessControl/thing/event/property/post
上报属性消息的格式:
{"method":"thing.event.property.post","params":{"DHT11_T":28,"DHT11_H":80,"TOUCH_ID":1,"motor":1}}
订阅主题:
/sys/h1mlEW5LClO/AccessControl/thing/service/property/set
4.9 软件模拟设备登录
(1)设备登录
软件下载地址:https://download.csdn.net/download/xiaolong1126626497/18784012
填入设备的登录信息。
(2)查看设备状态
打开网页的设备页面查看,设备已经在线了。
(3)查看上报的数据
物模型页面查看设备上传的数据。
(4)查看网页数据
项目主页:https://a120jmulpgykrx6a.vapp.cloudhost.link/page/907526?token=18efcec4eea7d09bb7cff6bee6f15b14
点击页面上的按钮时,会收到服务器发送回来的数据:
/sys/h1mlEW5LClO/AccessControl/thing/service/property/set{"method":"thing.service.property.set","id":"878115535","params":{"motor":0},"version":"1.0.0"}
/sys/h1mlEW5LClO/AccessControl/thing/service/property/set{"method":"thing.service.property.set","id":"884675055","params":{"motor":1},"version":"1.0.0"}
5. STM32程序设计
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)温湿度传感器: DHT11
VCC--VCC
GND---GND
DAT---PA5
(4)开关门禁采用步进电机模拟: 28BYJ4步进电机模拟
ULN2003接线:
IN-D: PB5 d
IN-C: PB4 c
IN-B: PB3 b
IN-A: PB12 a
+ : 5V
- : GND
(5)蜂鸣器:高电平有效
PA4------BEEP
(6)OLED显示屏接线:
D0----(SCL)------------------>>PB14
D1----(SDA)------------------>>PB13
VCC--VCC--3.3V
GND---GND
(7)外接按键:
KEY1 -PB9 按下是低电平
KEY2 -PB8 按下是低电平
KEY3 -PB6 按下是低电平
KEY4 -PB7 按下是低电平
(8)板载LED灯:低电平亮
LED1--PC13
5.2 STM32核心板原理图
5.3 keil工程
5.4 汉字取模
5.5 main.c代码
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include <string.h>
#include <stdlib.h>
#include "as608.h"
#include "dht11.h"
#include "motor.h"
#include "mqtt.h"
#include "esp8266.h"
#include "oled.h"
#include "fontdata.h"
/*
硬件连接方式:
(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)温湿度传感器: DHT11
VCC--VCC
GND---GND
DAT---PA5
(4)开关门禁采用步进电机模拟: 28BYJ4步进电机模拟
ULN2003接线:
IN-D: PB5 d
IN-C: PB4 c
IN-B: PB3 b
IN-A: PB12 a
+ : 5V
- : GND
(5)蜂鸣器:高电平有效
PA4------BEEP
(6)OLED显示屏接线:
D0----(SCL)------------------>>PB14
D1----(SDA)------------------>>PB13
VCC--VCC--3.3V
GND---GND
(7)外接按键:
KEY1 -PB9 按下是低电平
KEY2 -PB8 按下是低电平
KEY3 -PB6 按下是低电平
KEY4 -PB7 按下是低电平
(8)板载LED灯:低电平亮
LED1--PC13
*/
//阿里云物联网服务器的设备信息
#define MQTT_ClientID "AccessControl|securemode=2,signmethod=hmacsha1,timestamp=1651292357675|"
#define MQTT_UserName "AccessControl&h1mlEW5LClO"
#define MQTT_PassWord "3024488C8950E8F771186EE53644329D9DA23843"
//订阅与发布的主题
#define SET_TOPIC "/sys/h1mlEW5LClO/AccessControl/thing/service/property/set" //订阅
#define POST_TOPIC "/sys/h1mlEW5LClO/AccessControl/thing/event/property/post" //发布
//设置连接的路由器信息
#define CONNECT_WIFI "Xiaomi_meizi6" //将要连接的路由器名称 --不要出现中文、空格等特殊字符
#define CONNECT_PASS "12170307yu" //将要连接的路由器密码
#define CONNECT_SERVER_IP "101.133.196.97" //服务器IP地址或者域名
#define CONNECT_SERVER_PORT 1883 //服务器端口号
char mqtt_message[100];
//WIFI发送数据存储区域
char data_buff[500];
u8 esp8266_state=0;
u8 dht11_temp;
u8 dht11_humidity;
u16 TOUCH_ID=0; //识别到的指纹ID
u16 touch_state=0;
u8 motor_flag=0; //电机状态 0表示关闭 1表示开启
int input_touch_id=0; //选择的ID
u16 ValidN;//模块内有效模板个数
SysPara AS608Para;//指纹模块AS608参数
void Add_FR(int ID); //录指纹
void Del_FR(int num); //删除指纹
int press_FR(void);//刷指纹
void ShowErrMessage(u8 ensure);
int ID=0; //指纹识别的ID
char *data_p;
int main()
{
u8 ensure;
u32 i=0;
u32 wifi_TimeCnt=0;
u8 key_val2=0;
JTAG_Set(SWD_ENABLE);
delay_init(72);
USART1_Init(115200); //串口1初始化-打印调试信息
USART2_Init(57600); //串口2初始化-接指纹模块
TIMER2_Init(72,20000); //定时器2初始化
USART3_Init(115200); //串口3-接WIFI模块
TIMER3_Init(36,20000); //超时时间20ms
//板载LED灯初始化
LED_Init();
//蜂鸣器初始化
BEEP_Init();
//初始化DHT11
DHT11_Init();
//步进电机初始化
Moto_Init();
//指纹模块,初始化FR读状态引脚
PS_StaGPIO_Init();
//外接按键初始化
KEY_Init();
printf("系统正常运行!\r\n");
//与AS608模块握手
// while(PS_HandShake(&AS608Addr))
// {
// printf("连接指纹模块失败....\r\n");
// delay_ms(1000);
// }
// printf("指纹模块连接成功.....\r\n");
printf("开始读库指纹个数.\r\n");
ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
if(ensure!=0x00)
{
printf("ensure:%s\r\n",ensure);//显示确认码错误信息
}
printf("开始读AS608模块参数 .\r\n");
ensure=PS_ReadSysPara(&AS608Para); //读AS608模块参数
if(ensure==0x00)
{
printf("指纹最大容量:%d \r\n 安全等级:%d\r\n",AS608Para.PS_max-ValidN,AS608Para.PS_level);//显示剩余指纹数量和安全等级
}
else
{
printf("ensure:%s\r\n",ensure);
}
//如果第一次使用,有必要全部清除之后再使用
//PS_Empty();//清空指纹库
// printf("开始删除指纹 .\r\n");
//Del_FR();
printf("正在初始化OLED...\r\n");
Oled_Init(); //OLED显示屏初始化--正常显示
OLED_clear(); //清屏
//OLED_Display_str(0,0,(u8 *)"IIC Init Test!");//显示字符串
//录入指纹
OLED_Display_Flont(16*0,0,0);
OLED_Display_Flont(16*1,0,1);
OLED_Display_Flont(16*2,0,2);
OLED_Display_Flont(16*3,0,3);
//删除指纹
OLED_Display_Flont(16*0,2,4);
OLED_Display_Flont(16*1,2,5);
OLED_Display_Flont(16*2,2,2);
OLED_Display_Flont(16*3,2,3);
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");
//等待稳定
delay_ms(1000);
while(1)
{
//外接按键检测
key_val2=KEY_GetValue();
if(key_val2)
{
printf("按键按下:%d\r\n",key_val2);
}
//录入指纹
if(key_val2==11)
{
printf("录入指纹.\r\n");
OLED_clear(); //清屏
OLED_Display_Flont(16*0,0,0);
OLED_Display_Flont(16*1,0,1);
OLED_Display_Flont(16*2,0,2);
OLED_Display_Flont(16*3,0,3);
//置位
input_touch_id=Touch_id_Num;
while(1)
{
//外接按键检测
key_val2=KEY_GetValue();
if(key_val2)
{
printf("按键按下:%d\r\n",key_val2);
}
if(key_val2==11)
{
printf("退出录入指纹模式.\r\n");
break;
}
//录入指纹
else if(key_val2==12)
{
printf("录入指纹,选择的ID:%d\r\n",input_touch_id);
Add_FR(input_touch_id);
break;
}
//ID++
else if(key_val2==13)
{
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==14)
{
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);
OLED_Display_str(0,4,(u8*)data_buff);
}
OLED_clear();
//录入指纹
OLED_Display_Flont(16*0,0,0);
OLED_Display_Flont(16*1,0,1);
OLED_Display_Flont(16*2,0,2);
OLED_Display_Flont(16*3,0,3);
//删除指纹
OLED_Display_Flont(16*0,2,4);
OLED_Display_Flont(16*1,2,5);
OLED_Display_Flont(16*2,2,2);
OLED_Display_Flont(16*3,2,3);
}
//删除指纹
else if(key_val2==12)
{
printf("删除指纹.\r\n");
printf("录入指纹.\r\n");
OLED_clear(); //清屏
OLED_Display_Flont(16*0,0,4);
OLED_Display_Flont(16*1,0,5);
OLED_Display_Flont(16*2,0,2);
OLED_Display_Flont(16*3,0,3);
//置位
input_touch_id=Touch_id_Num;
while(1)
{
//外接按键检测
key_val2=KEY_GetValue();
if(key_val2)
{
printf("按键按下:%d\r\n",key_val2);
}
if(key_val2==11)
{
printf("退出删除指纹模式.\r\n");
break;
}
//录入指纹
else if(key_val2==12)
{
printf("删除指纹,选择的ID:%d\r\n",input_touch_id);
Del_FR(input_touch_id);
break;
}
//ID++
else if(key_val2==13)
{
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==14)
{
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);
OLED_Display_str(0,4,(u8*)data_buff);
}
OLED_clear();
//录入指纹
OLED_Display_Flont(16*0,0,0);
OLED_Display_Flont(16*1,0,1);
OLED_Display_Flont(16*2,0,2);
OLED_Display_Flont(16*3,0,3);
//删除指纹
OLED_Display_Flont(16*0,2,4);
OLED_Display_Flont(16*1,2,5);
OLED_Display_Flont(16*2,2,2);
OLED_Display_Flont(16*3,2,3);
}
wifi_TimeCnt++;
DelayMs(10);
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,"T:%d,H:%d",dht11_temp,dht11_humidity);
OLED_Display_str(0,4,(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},\"version\":\"1.1.1\"}",
dht11_temp,dht11_humidity,TOUCH_ID,motor_flag);
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
printf("%s\r\n",mqtt_message);
//温度超过阀值蜂鸣器报警
if(dht11_temp>40)
{
BEEP=1;
}
else
{
BEEP=0;
}
}
//接收WIFI返回的数据
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("WIFI收到数据:\r\n");
//向串口打印服务器返回的数据
for(i=0;i<USART3_RX_CNT;i++)
{
printf("%c",USART3_RX_BUFFER[i]);
}
printf("USART3_RX_CNT=%d\r\n",USART3_RX_CNT);
//开门禁锁
if(USART3_RX_CNT>5)
{
//关锁
if(strstr((char*)&USART3_RX_BUFFER[5],"\"motor\":0"))
{
printf("关锁------>\r\n");
Motorcw_ring(1,300);
motor_flag=0;
}
//开锁
else if(strstr((char*)&USART3_RX_BUFFER[5],"\"motor\":1"))
{
motor_flag=1;
Motorcw_ring(1,300);
printf("开锁------>\r\n");
}
}
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
}
//刷指纹
press_FR();
}
}
//录指纹
void Add_FR(int ID)
{
u8 i=0,ensure,processnum=0;
while(1)
{
switch (processnum)
{
case 0:
i++;
printf("请按下手指.\r\n");
//请按下手指
OLED_Display_Flont(16*0,2,7);
OLED_Display_Flont(16*1,2,8);
OLED_Display_Flont(16*2,2,9);
OLED_Display_Flont(16*3,2,10);
OLED_Display_Flont(16*4,2,11);
ensure=PS_GetImage();
if(ensure==0x00)
{
ensure=PS_GenChar(CharBuffer1);//生成特征
if(ensure==0x00)
{
printf("指纹正确.\r\n");
i=0;
processnum=1;//跳到第二步
}else ShowErrMessage(ensure);
}else ShowErrMessage(ensure);
break;
case 1:
i++;
printf("再按一次手指.\r\n");
ensure=PS_GetImage();
if(ensure==0x00)
{
ensure=PS_GenChar(CharBuffer2);//生成特征
if(ensure==0x00)
{
printf("指纹正确.\r\n");
i=0;
processnum=2;//跳到第三步
}else ShowErrMessage(ensure);
}else ShowErrMessage(ensure);
break;
case 2:
printf("对比两次指纹.\r\n");
ensure=PS_Match();
if(ensure==0x00)
{
printf("两次指纹是一样的.\r\n");
processnum=3;//跳到第四步
}
else
{
printf("对比失败,请重新按手指.\r\n");
ShowErrMessage(ensure);
i=0;
processnum=0;//跳回第一步
}
delay_ms(1000);
break;
case 3:
printf("产生一个指纹模板.\r\n");
ensure=PS_RegModel();
if(ensure==0x00)
{
printf("生成指纹模板成功.\r\n");//生成指纹模板成功
processnum=4;//跳到第五步
}else {processnum=0;ShowErrMessage(ensure);}
delay_ms(1000);
break;
case 4:
ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
if(ensure==0x00)
{
printf("$update_lu_ru_ok,\r\n");
printf("添加指纹成功.\r\n");
PS_ValidTempleteNum(&ValidN);//读库指纹个数
printf("显示剩余指纹个数.\r\n");
return ;
}else {processnum=0;ShowErrMessage(ensure);}
break;
}
delay_ms(1000);
LED1=!LED1;
if(i==10)//超过10次没有按手指则退出
{
printf("超过10次没有按手指---退出...\r\n");
printf("$update_lu_ru_error,\r\n");
break;
}
}
}
//显示确认码错误信息
void ShowErrMessage(u8 ensure)
{
printf("%s\r\n",(u8*)EnsureMessage(ensure));
}
//函数功能: 搜索指纹
//函数返回值: -1表示搜索失败 >=0 表示搜索到的指纹ID
int 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;
//电机转动
Motorcw_ring(1,300);
//开锁状态
motor_flag=1;
//Motorccw_ring(1,300);
return seach.pageID;
}
else
ShowErrMessage(ensure);
}
else
ShowErrMessage(ensure);
delay_ms(1000);//延时后清除显示
}
return -1;
}
//删除指纹
void Del_FR(int num)
{
u8 ensure;
printf("显示删除指纹: %d.\r\n",num);
printf("0=< ID <=299\r\n");
delay_ms(50);
if(num==0xFF00)
ensure=PS_Empty();//清空指纹库
else
ensure=PS_DeletChar(num,1);//删除单个指纹
if(ensure==0)
{
printf("删除指纹成功.\r\n");
}
else
ShowErrMessage(ensure);
delay_ms(1500);//延时后清除显示
PS_ValidTempleteNum(&ValidN);//读库指纹个数
printf("显示剩余指纹个数:%d\r\n",AS608Para.PS_max-ValidN);
}
【文正在参加物联网有奖征文活动】,活动链接: https://ost.51cto.com/posts/14758
好详细的讲解,干货作者。
一般模块直接上淘宝买就可以吗?
阿里云搭建确实方便
学习物联网对硬件的水平要求会高吗?还是只要会用就ok
传到阿里云再开门不会太慢了,另外对网络的要求高吗?
指纹门锁确实比传统门锁方便不少
指纹锁需要温湿度传感器是我没想到的