基于STM32F407的智能门锁

这篇具有很好参考价值的文章主要介绍了基于STM32F407的智能门锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

智能门锁

一、项目背景

        在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。

基于STM32F407的智能门锁

 二、项目功能介绍

 1.可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上

2.在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动直流电机

3.可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中
4.实现RFID与手机解锁(蓝牙解锁)

5.系统支持低功耗处理

项目所用到的技术:

1.IIC协议、SPI协议、串口协议

2.外部flash驱动

3.RTC实时时钟

三、元件准备

1、直流电机

基于STM32F407的智能门锁

2、4X4矩阵按键

 基于STM32F407的智能门锁

 3、指纹模块AS608(串口控制)

基于STM32F407的智能门锁

4、0.96寸OLED显示屏(IIC)

 基于STM32F407的智能门锁

5、蓝牙模块HC-05

 基于STM32F407的智能门锁

 6、主控芯片STM32F407ZET6

基于STM32F407的智能门锁

 7、RFID RC522 射频模块

基于STM32F407的智能门锁

 8、杜邦线

四、项目设计

(一)原理图设计

基于STM32F407的智能门锁基于STM32F407的智能门锁

 基于STM32F407的智能门锁

 基于STM32F407的智能门锁基于STM32F407的智能门锁基于STM32F407的智能门锁

 

 基于STM32F407的智能门锁基于STM32F407的智能门锁

 基于STM32F407的智能门锁

 (二)硬件设计

基于STM32F407的智能门锁

 (三)程序设计

 由于代码过长只展示部分代码

#include "stm32f4xx.h"
#include "beep.h"
#include "key.h"
#include "delay.h"
#include "led.h"
#include "tim.h"
#include "pwm.h"
#include "usart.h"
#include "sr04.h"
#include "dht11.h"
#include "iwdg.h"
#include "exti.h"
#include "adc.h"
//#include "iic.h"
#include "usart2.h"
#include "door.h"

SysPara AS608Para;//指纹模块AS608参数
u16 ValidN;//模块内有效指纹个数

unsigned char i;
u8 rx_flag = 0;  //rx_flag = 1表示接受数据完成
u8 rx_data = 0;
char buffer[32] = {0}, rx_buffer[32] = {0};
u8 count = 0, rx_i = 0;

#define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改
u16 sleeptime = 0;//休眠时间

void USART1_IRQHandler(void)
{
	
	//判断接收中断标志是否为1
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		//清空标志位
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
		//接受数据 先赋值再加
		buffer[count++] = USART_ReceiveData(USART1);
		
		//判断接受的字符是否为 ':'
		if(buffer[count-1] == ':')
		{
			//buffer循环赋值给rx_buffer, 但不需要赋值':'  过滤结束标志
			for(rx_i=0; rx_i<(count-1); rx_i++)
			{
				rx_buffer[rx_i] = buffer[rx_i];
			}
			
			memset(buffer, 0, sizeof(buffer));
			
			//确保下一帧存放位置从buffer[0]开始
			count = 0;
			
			rx_flag = 1;
		}
		
	}

}


int main(void)
{

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2

	int i = 0;
	extern const unsigned char BMP1[];
	u8 key_num = 16,ensure;
		
	Delay_Init();
	My_RTC_Init();		 		//初始化RTC
	Walkmotor_Init();
	Led_Init();
	//指纹串口2
	usart2_init(usart2_baund);
	Usart1_Init(9600);
	//4*4矩阵键盘
	Keyborad_Init();
	//OLED显示屏
	I2C_Configuration();
	OLED_Init();
	OLED_CLS();
	//NFC
	MFRC522_Initializtion();
	AntennaOff();
	PS_StaGPIO_Init();	//初始化FR读状态引脚
	
	OLED_CLS();	
	//未检测到模块
	while(PS_HandShake(&AS608Addr))//与AS608模块握手
	{
		printf("woshou\r\n");
		OLED_CLS();
		OLED_ShowStr(32,4,"Error",1);
		delay_s(2);
		OLED_CLS();
		OLED_ShowStr(8,4,"Wait...",2);	
		delay_s(2);	  
	}
	
	OLED_CLS();
	OLED_ShowStr(40,3,"Hello!",2);
	ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
	ensure=PS_ReadSysPara(&AS608Para);  //读参数 
	delay_s(1);
	OLED_CLS();
	while(1)
	{
MAIN:	//A 10  B 11  C 12  D 13  * 14  # 15
		
		//蓝牙解锁
		if(rx_flag == 1)
		{
			printf("rx_buffer:%s\r\n", rx_buffer);
			
			if(strcmp(rx_buffer, "open") == 0)
			{
				LED0_ON;
				OLED_CLS();//清屏
				//解锁中
				for(i=11;i<14;i++)
				{
					OLED_ShowCN(32+(i-11)*16,3,i);//测试显示中文
				}
				OLED_ShowStr(80,3,"...",2);	
				//开锁
				Walkmotor_ON();
				
				OLED_CLS();//清屏
				//已解锁
				for(i=10;i<13;i++)
				{
					OLED_ShowCN(32+(i-10)*16,3,i);//测试显示中文
				}
				OLED_ShowStr(80,3,"!",2);			
				delay_s(1);			
				Menu();
			}
			if(strcmp(rx_buffer, "close") == 0)
			{
				Walkmotor_OFF();
				LED0_OFF;
				//解锁失败
			}			
			
			//清空数组
//			memset(rx_buffer, 0, sizeof(rx_buffer));
			
			rx_flag = 0;
		}
		
		if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
		{
			delay_ms(20);
			press_FR();//刷指纹				
		}	

		
		
		for(i=0;i<4;i++)
			{
				
				OLED_ShowCN(32+i*16,0,i);//测试显示中文
			}
		key_num = Key_scan();
		Display_Data();
			
		sleeptime++;
		//超时锁屏
/*******************************************************/		
		if(sleeptime == 70)
		{
			OLED_OFF();//测试OLED休眠
		}
		if(key_num == 15)	
		{
			OLED_ON();
			sleeptime = 0;
		}
/*******************************************************/		
		if(key_num != 16 && key_num != 15)
		{
			OLED_CLS();

			while(1)
			{
				
				key_num = Key_scan();
				//智能门锁
				for(i=0;i<4;i++)
				{
					OLED_ShowCN(32+i*16,0,i);//测试显示中文
				}
				//数字
				for(i=4;i<6;i++)
				{
					OLED_ShowCN(16+(i-4)*16,3,i);//测试显示中文
				}
				//指纹
				for(i=6;i<8;i++)
				{
					OLED_ShowCN(80+(i-6)*16,3,i);//测试显示中文
				}
				//卡片
				for(i=8;i<10;i++)
				{
					OLED_ShowCN(16+(i-8)*16,6,i);//测试显示中文
				}

				OLED_ShowStr(80,6,"D:QUIT",2);
					
				switch (key_num )
				{
					
					case  10: //数字密码
					{
						OLED_ShowStr(0,3,"->",2);
						while(1)
						{
							key_num = Key_scan();
							if(key_num == 15)
							{
								OLED_CLS();
								password();
								break ;

							}
							if(key_num == 14)
							{
								OLED_CLS();
								break ;
							}
						}
						break ;
					}
					
					case  11: //指纹解锁
					{
						OLED_ShowStr(64,3,"->",2);
						while(1)
						{
							key_num = Key_scan();
							if(key_num == 15)
							{
								OLED_CLS();
								//请按指纹
								for(i=38;i<40;i++)
								{
									OLED_ShowCN(32+(i-38)*16,3,i);//测试显示中文
								}
								for(i=6;i<8;i++)
								{
									OLED_ShowCN(64+(i-6)*16,3,i);//测试显示中文
								}
								delay_s(2);
								if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
								{
									press_FR();//刷指纹				
									break ;
								}	
							}
							if(key_num == 14)
							{
								OLED_CLS();
								break ;
							}
						}
						
						break ;
					}
					case  12:
					{
						OLED_ShowStr(0,6,"->",2);
						while(1)
						{
							key_num = Key_scan();
							if(key_num == 15)
							{
								OLED_CLS();
								//请刷卡片
								for(i=38;i<39;i++)
								{
									OLED_ShowCN(32+(i-38)*16,3,i);//测试显示中文
								}
								for(i=40;i<41;i++)
								{
									OLED_ShowCN(48+(i-40)*16,3,i);//测试显示中文
								}
								for(i=8;i<10;i++)
								{
									OLED_ShowCN(64+(i-8)*16,3,i);//测试显示中文
								}
								delay_s(1);
								MFRC522Test();
								OLED_CLS();
								break;
							}
							if(key_num == 14)
							{
								OLED_CLS();
								break ;
							}
						}
						break ;
					}
					case  13:
					{
						OLED_ShowStr(64,6,"->",2);
						
						while(1)
						{
							key_num = Key_scan();
							if(key_num == 15)
							{
								OLED_CLS();
								goto MAIN;
							}
							if(key_num == 14)
							{
								OLED_CLS();
								break ;
							}
						}
						break ;
					}
				
				}
			}
		}
		
		delay_ms(20);
		
		
	}
}




 五、项目展示

【基于STM32F4智能门锁】 https://www.bilibili.com/video/BV1L84y1i7sP/?share_source=copy_web&vd_source=b08c2377f74ba9c4fdcaec33930efbb5文章来源地址https://www.toymoban.com/news/detail-511276.html

到了这里,关于基于STM32F407的智能门锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX生成C代码及时钟树配置(基于stm32f407)

    近来对于stm32单片机编程中,HAL库逐渐取代标准库成为主流的库。标准库支持的芯片型号有限,而且目前已经停止支持,而HAL库支持所有类型的芯片,可移植性也很高,再加上有神器STM32Cube可以生成工程模板,越来越多的编程开始从使用标准库转到使用HAL库。 新建工程后,在

    2024年02月15日
    浏览(56)
  • 基于STM32F407的俄罗斯方块小游戏的设计

        本文讲述的是基于STM32F407的俄罗斯方块小游戏的设计思路和测试结果,具体的代码分析见文章 基于STM32F407的俄罗斯方块游戏代码分析_钻仰弥坚的博客-CSDN博客 1.1 可行性分析 可行性分析能够对新系统进行各方面的分析与研究,确定新系统是否具有开发的可行性和必要性

    2024年02月11日
    浏览(49)
  • stm32f407探索者开发板(二)——新建工程(基于固件库)

    说实话,我非常不想这篇文章,因为太长太长了,我看视频写都写了一个下午(虽然我下午一直在摸鱼,啊啊啊啊啊)害,不管了,赶紧开始写吧,不然今晚是写不完了,呜呜呜…… 把这个里面的文件放先给下好,我这里是没有光盘的,所以需要从百度网盘上下载好,这里面

    2023年04月08日
    浏览(79)
  • 从STM32F407到AT32F407(一)

    雅特力公司的MCU有着性能超群,价格优越的巨大优势,缺点是相关资料少一些,我们可以充分利用ST的现有资源来开发它。 我用雅特力的STM32F437开发板,使用原子 stm32f407的开发板自带程序,测试串口程序,原设定串口波特率为115200,但是输出乱码,波特率改成230400,串口输

    2024年02月02日
    浏览(57)
  • 利用是stm32cubemx实现双极性spwm调制 基于stm32f407vet6

    【双极性SPWM调制讲解以及基于stm32的代码生成-哔哩哔哩】 https://b23.tv/ytFxdkL 双极性spwm调制虽然没有单极性好用,但比单极性要简单易懂一些,以下教程是如何利用stm32实现双极性spwm调制.   •T1,T2不能同时导通,T3,T4也不能同时导通,否则短路烧管子。 •解决方法:T1与T2用高

    2024年02月15日
    浏览(46)
  • STM32F407ZGT6控制ESP8266与OV2640下的百度智能图片识别

    前言: STM32F407ZGT6控制OV2640下采集到JPG图片格式的二进制数据,然后对二进制数据进行BASE64编码,接着通过串口将数据传输给ESP8266并上传至训练好的EASYDL的AI算法识别平台进行识别并返回垃圾种类与边缘信息。 STM32与ov2640 ov2640简绍 stm32f407zgt6之dcmi stm32f407zgt6代码 main.c main.h l

    2024年02月04日
    浏览(52)
  • 基于STM32CubeMX和keil采用STM32F407的基本定时器中断实现LED闪烁

    定时器有三种,基本定时器,通用定时器,以及高级定时器。 这篇博客以最简单的基本定时器为例,实现LED的闪烁。 后面两种定时器的用法后面再写。 实现功能: TIM6控制LED每隔0.5s变一次状态。 TIM7控制LED1常量2s后熄灭。 因为都是用到LED,所以和上一篇基于STM32CubeMX与keil采

    2024年02月04日
    浏览(58)
  • 基于STM32F407实现快速傅里叶变化(FFT),计算指定频率的幅值

    前言: 本人的课题是关于EIT采集系统设计,所谓的EIT,简单的说就是往人体注入特定频率的电流信号,通过采集反馈的电压信号,进而使用成像算法重构人体内部的阻抗分布。由于采集到的电压包含其它频率的热噪声,为了只保留注入频率的信号成分,需要对采集到的电压信

    2024年02月12日
    浏览(42)
  • 手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)

      最近对usb有点兴趣,感觉挺好玩的,于是买了本圈圈大神的经典著作-圈圈教你玩USB,里面使用51单片机+usb芯片对usb的基本知识潺潺道来,做了十个左右的常用案例实验,很有趣,建议大家看看。   趁热打铁,拿身边的开发板来练练手,探索一下复合设备的好玩方便的

    2024年02月13日
    浏览(60)
  • 基于STM32F407实现离散傅里叶变换(FFT、DFT),计算指定频率的幅值

    前言: 本人的课题是关于EIT采集系统设计,所谓的EIT,简单的说就是往人体注入特定频率的电流信号,通过采集反馈的电压信号,进而使用成像算法重构人体内部的阻抗分布。由于采集到的电压包含其它频率的热噪声,为了只保留注入频率的信号成分,需要对采集到的电压信

    2024年02月16日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包