
STM32智能门禁系统
1、系统介绍
在本教程中,带领大家完成一个智能门禁系统,网上很多智能门禁系统的教程或者资料,但总感觉不是很全面。主要有以下几个问题。
1、有些系统没有掉电存储功能,每次修改完密码,单片机重新上电又变成了初始密码,非常的不友好。
2、开门方式不完整,有些只有按键密码开锁,有些只有RFID或者指纹识别模块解锁。
3、缺少物联网相关功能,没有涉及到云平台或者APP远程进行开门。
4、资料不完善,只有代码,而且代码注释比较简陋,想在其基础上修改非常的困难。
因此,本教程争取能够将智能门禁系统的功能实现尽可能的给大家讲解清楚,云平台部分继续沿用之前的机智云方案(可以参考之前项目的云平台视频介绍,用法一模一样)。与前面项目不同的是,本项目主要是文档讲解,将各个模块的用法用资料的方式展现给大家。视频讲解则比较少,主要是对系统框架和主要的代码进行一个介绍。在代码里我会尽可能的加一些注释,方便大家理解和阅读代码。为做项目、打比赛、过毕设等提供一些帮助。
实物展示
硬件电路
单片机硬件系统可以通过多种方式搭建,主要有两种方式
1、PCB板:通过画系统的电路图,然后交给PCB生产厂家进行打板。我们只需要在做好的PCB电路板上面将相关的模块和元器件进行焊接即可。这种方式需要有系统的原理图,做出来的系统比较美观(视频教程使用的方式就为PCB板,外观美观,并且集成CH340芯片,可以一键下载程序)。
2、面包板:面包板则搭建相对简单,不过需要许多的杜邦线对单片机和传感器模块进行连接。硬件实物比较杂乱,并且稳定性较低,容易损坏。简单实现功能可使用该方式。
两种方式各有好坏,具体使用哪种方式根据自己的需求去选择。不管用那种方式,都可以实现本系统的所有功能。本教程使用的是PCB板搭建的方式,如果有朋友想用面包板去搭建,只需要将模块与单片机之间通过正确的管脚连接起来即可。相关硬件原理图、连接方式、硬件清单等内容可以后续关注公众号进行获取。
系统功能
门禁方式
1、通过按键输入密码解锁。
2、RFID卡片进行解锁。
3、指纹识别模块进行解锁。
4、APP远程解锁。
多级菜单功能
该门禁系统使用OLED和按键进行配合,实现多级菜单功能,可以实现配置入网、修改密码、录入指纹、删除指纹、录入卡片、删除卡片等操作。从而完整的实现门禁系统的功能。具体OLED显示效果如下图所示,可通过按键进行操作相应功能。
掉电存储功能
1、当密码重新设置之后,单片机重新上下电,密码不会丢失,会存在内部flash中,方便下次使用。
声光报警功能
1、当输入密码错误时,会进行声光报警,并在APP上可以报警状态。
模拟开门动作
1、通过继电器和LED灯的方式模拟开门。当输入密码正确时,继电器打开并且LED灯亮起。
远程APP控制
1、系统采用机智云平台,能够通过物联网协议与手机APP进行交互,通过APP可以远程进行开门或关门、并且显示报警状态。
2、代码工程
目录介绍
代码工程主要是系统基本功能的实现代码,比如按键、串口、定时器、延迟函数和各种传感器模块驱动代码等内容的实现。在拿到一个代码工程之后,最主要的是学会如何看代码,要明确那些代码需要看,那些代码不需要看。在下述内容中,主要是给大家简单介绍一些代码工程,后面会录一节视频,带领大家去阅读一下代码工程,去了解一些函数是干什么的。
目录主要文件夹:
1、 APP:主要是一些传感器模块或者单片机基本功能(串口、定时器灯的实现的驱动代码),这部分代码是我们需要大致了解的。
2、 Libraries:厂商封装的库函数,我们需要调用这些库函数去实现相应功能。
3、 User:主函数main.c文件存放的地方,main.c文件里面的函数是最重要的,系统功能的实现都在这个文件中完成。
4、 Output:编译生成的中间文件和下载到单片机的Hex文件。
5、 Wifi:该目录下的文件主要和机智云平台相关。
我们最需要理解的就是main.c里面的代码,这里面的代码就是我们系统功能的实现方式。而APP文件夹下的是各种功能的驱动。这句话怎么理解呢?比如我们指纹识别功能,指纹识别模块的一些驱动函数(初始化、录入指纹、识别指纹)这些功能的实现都是在APP文件下实现的,main函数里面直接去调用这些驱动函数去实现逻辑功能即可。
STM32单片机的开发工具为keil,我们通过keil软件打开Project目录下的工程,可以看到左侧的各种文件,其中我们需要重点理解的就是main.c文件下的函数。APP和Wifi下面的文件都是模块的驱动函数或者单片机的一些基本功能(串口、定时器等)。
USER目录下文件介绍
Main.c
代码逻辑工程实现的文件,单片机运行代码的时候,就是从Main.c文件夹里面的main()函数运行的,我们先看下main()函数做了什么操作。
程序的运行就是从main函数开始的,然后进入while(1)循环,不断的重复执行里面的代码。大家可以看到main函数里面的代码非常的简洁,主要是因为我们对功能进行了封装,将一个大的功能封装成了一个函数,然后在main里面去调用。比如说我们通过按键切换不同的OLED界面,就是在Key_Set函数里面实现的。该函数的具体用法,在模块介绍”按键电路“那章会进行代码介绍。
整体来说,main函数从上到下实现的功能就是先对各个模块进行初始化,然后进入while(1)循环里面,不断的去执行按键扫描函数、检测是否有手指按下、检测是否有卡片输入,和云平台进行数据的通信。其实就这些功能,是不是感觉还是比较简单的,其实也不难,大家只有把整个代码工程一点点去分解,就会发现其实很简单。
那Main.c里面还有很多其它的函数,其功能主要是干什么的呢?下面表格主要介绍每一个函数的功能。
其中以show开头的函数,都是OLED显示函数,比如说show_DeleteFp()函数,虽然是删除指纹功能函数,但它其实里面调用了Del_Idcard(void)这个具体的删除卡片的函数。并且将func_index 设置成了8。这个func_index 的含义就是不同的值代表了OLED去显示不同的内容。比如func_index =8的时候,OLED就会显示show_fun4_3。
所以show_DeleteFp()函数具体的功能就是执行完指纹删除功能以后,将func_index设置为8,执行show_fun4_3,OLED显示屏就会回到功能设置界面。
/*
---------------------------------------------------------------------------------------------------------
* 函 数 名: show_DelCard
* 功能说明: ID卡片删除
* 参 数:无
* 返 回 值: 无
---------------------------------------------------------------------------------------------------------
*/
void show_DelCard()
{
Del_Idcard();
func_index = 8;
}
APP目录下文件介绍
bsp_usart1.c
bsp_usart2.c
bsp_usart3.c
bsp_delay.c
bsp_timer.c
bsp_key.c
bsp_JDQ.c
bsp_oled.c
bsp_Alarm.c
bsp_AS608.c
bsp_timer.c
bsp_rc522.c
bsp_flash.c