网络知识 娱乐 基于STM32智能门禁系统(阿里云)_2022

基于STM32智能门禁系统(阿里云)_2022

1. 前言

随着社会进步,生活质量提高,尤其是网络技术和计算机越来越和我们的生活紧密联系,这给社会的信息化的安全带来了很多新挑战,有些简单身份识别方式,因其局限性逐渐暴露出其自身缺点,人们开始寻找更加安全性的身份识别方式,由于生物特征具有唯一性和确定性并能随身携带,简单易用等优点,用生物特征确认所有者信息一直是人们所注重的身份识别方式,尤其是近年来智能科技的飞速发展,人们慢慢得不再满足门锁、钥匙、门禁卡等手工安防设备,所以在人类社会发展过程中指纹识别技术应运产生。指纹识别技术具有很强的优势:指纹是人体的一大特点,人类指纹相同的概率几乎为零,等同于说指纹是每个人生来就有、无可替代的密码。因此我相信指纹识别技术一定前景广阔,深受用户喜欢。

2. 功能总结

功能总结:

  1. 匹配指纹,匹配成功这个指纹得到ID后,上传阿里云网页显示,并且控制步进电机转动一圈,模拟门锁打开
  2. 读取温湿度传感器信息,上传阿里云网页显示,如果温湿度超过阀值,报警鸣笛
  3. 阿里云网页上设置一个按钮,控制步进电机转动一圈,模拟门锁打开
  4. 设备端采用0.96寸oled屏幕显示录入指纹和指纹相关的操作提示
  5. 设备端使用四个按键控制录入指纹和查找录入指纹的模板id号
    (完成指纹录入和指纹查找功能)指纹查找成功将ID上传至阿里云网页展示。
  6. 设备端采用STM32当做主控板
  7. 物联网云平台采用阿里云,使用阿里云的网页组件设计网页,完成数据展示与交互
  8. 联网的模块采用正点原子的ESP8266-WiFi,完成与阿里云的连接。

硬件选型:
(1)一个电容试矩阵键盘

(2)一个STM32F103C8T6系统板

(3)一个DHT11 温湿度模块

(4)一个正点原子的ESP8266-串口WIFI

(5)一个0.96寸中景园电子的IIC接口的OLED显示屏

(6)一个5V的步进电机—网页上有一个电机的开关按钮可以控制电机转动。

(7)一个AS608指纹模块,用来识别、录入指纹

(8)一个蜂鸣器模块,当温湿度超过阀值报警

image-20220501163751702

image-20220501163835728

如果整个项目资料与源码,可以在这里下载:
https://download.csdn.net/download/xiaolong1126626497/85898161

3. 硬件选型

3.1 AS608指纹模块

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

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

image-20220429114402319

image-20220429114504045

image-20220429114610307

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

3.2 蜂鸣器模块

image-20220415203419349

3.3 STM32F103C8T6开发板

image-20220429114944034

3.4 ESP8266 WIFI

image-20220427093036646

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协议)

image-20220321181209155

特点:

OLED是有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层、和玻璃基板、当有电流通过时、这些有机材料就会发光、而且OLED显示屏幕可视角大、功耗低、OLED由于同时具备自发光、不需背光源(只是供电不会亮的、驱动程序和接线正确才会点亮)对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高、而OLED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的显示效果好、模块供电可以是3.3v也可以是5V、不需要修改模块电路、OLED屏具有多个控制指令、可以控制oLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCH、图案等、同时为了方便应用在产品上、预留4个M3固定孔、方便用户固在机壳上。

3.6 母对母杜邦线

image-20220321181308284

3.7 矩阵键盘模块

image-20220404181013714

3.8 步进电机模块

image-20220404180810347

3.9 DHT11温湿度模块

image-20220414200340347

4. 阿里云物联网产品与设备创建

4.1 创建产品

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

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

先开通公共实例。

image-20220429153656248

创建产品。

image-20220429153739855

image-20220429153823714

image-20220429153842604

4.2 创建设备

image-20220429153914093

image-20220429153934687

image-20220429154121956

image-20220429154133726

image-20220429154205824

查看设备证书。

{
  "ProductKey": "h1mlEW5LClO",
  "DeviceName": "AccessControl",
  "DeviceSecret": "fdc6317c3836197bbc3a87e256212037"
}

image-20220429154442266

image-20220429154454251

4.3 创建自定义属性

image-20220429154624839

image-20220429154700878

image-20220429154724248

添加自己需要上传的传感器属性。环境温度、环境湿度、触摸ID、门禁开关

image-20220429154839158

image-20220429154856204

image-20220429154941486

门禁开关是需要下发命令的,属性选择为读写。

image-20220429155130067

image-20220429155211914

image-20220429155506097

image-20220429155535333

添加好属性,发布上线。

image-20220429155551027

4.4 物模型

image-20220429155740977

image-20220429155910782

后面的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

image-20220430115334260

image-20220430115407200

image-20220430115423122

image-20220430115508699

image-20220430115607689

image-20220430115618491

image-20220430115646837

image-20220430115709364

image-20220430115735632

image-20220430115754698

image-20220430115826714

image-20220430115848274

设计页面。

image-20220430120358828

4.6 绑定数据源

选中控件配置数据来源。

image-20220430120432020

image-20220430120511538

其他同理。

image-20220430120606670

image-20220430120805764

4.7 发布页面

image-20220430120859332

image-20220430120914491

image-20220430120925732

发布链接:https://a120jmulpgykrx6a.vapp.cloudhost.link/page/907526?token=18efcec4eea7d09bb7cff6bee6f15b14

现在设备没有激活,也没有上传数据,页面上没有显示。接下来就上报数据测试。

image-20220430121032305

4.8 MQTT客户端上报数据

关于MQTT协议登录所需要的参数官方说明文档: https://help.aliyun.com/document_detail/140507.html?spm=a2c4g.11186623.6.571.1e417544OGPj2y

image-20220430121334790

(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/

image-20220325131621769

(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

image-20220325132240837

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

image-20220325132253301

image-20220325132405260

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

image-20220430122030962

生成的信息如下:这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

image-20220430125334742

发布主题:
/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

填入设备的登录信息。

image-20220430130451793

(2)查看设备状态

打开网页的设备页面查看,设备已经在线了。

image-20220430130600596

(3)查看上报的数据

物模型页面查看设备上传的数据。

image-20220430130524006

(4)查看网页数据

项目主页:https://a120jmulpgykrx6a.vapp.cloudhost.link/page/907526?token=18efcec4eea7d09bb7cff6bee6f15b14

image-20220430130730369

image-20220430130742390

点击页面上的按钮时,会收到服务器发送回来的数据:

/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核心板原理图

image-20220429151639442

5.3 keil工程

image-20220429151731791

5.4 汉字取模

image-20220501142759036

image-20220501163518884

5.5 main.c代码

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include 
#include "timer.h"
#include 
#include 
#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("系统正常运行!rn");
    

    //与AS608模块握手
//    while(PS_HandShake(&AS608Addr))
//    {
//      printf("连接指纹模块失败....rn");
//      delay_ms(1000);	  
//    }    
//    printf("指纹模块连接成功.....rn");
    
    printf("开始读库指纹个数.rn");
    ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
    if(ensure!=0x00)
    {
        printf("ensure:%srn",ensure);//显示确认码错误信息	
    }

    printf("开始读AS608模块参数 .rn");
    ensure=PS_ReadSysPara(&AS608Para);  //读AS608模块参数 
    if(ensure==0x00)
    {
        printf("指纹最大容量:%d rn 安全等级:%drn",AS608Para.PS_max-ValidN,AS608Para.PS_level);//显示剩余指纹数量和安全等级
    }
    else
    {
        printf("ensure:%srn",ensure);	
    }
      
    
    //如果第一次使用,有必要全部清除之后再使用
    //PS_Empty();//清空指纹库
    
    // printf("开始删除指纹 .rn");
    //Del_FR();
    
    
    printf("正在初始化OLED...rn");  
	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..rn");  
    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("准备连接服务器....rn")