STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程)

  最近假期比较闲,拿着之前剩下的模块做了一个小玩具, 先制定一下此次玩具的规划,也可以理解为简易项目书。

开发软件:keil
硬件选型:STM32F103C8T6、RFID读卡器、oled屏幕、按键模块、蓝牙通信模块、蜂鸣器、舵机;
上位机:

1.上位机可以对密码进行设置、重置

2.上位机可以接收密码输入错误的报警弹窗提示。

3.添加或删除ic卡用户信息。

下位机:

密码模式:

1.输入密码,密码正确即开锁,oled屏显示开锁成功

2.若输入错误,OLED显示开锁失败

3.连续三次输错密码,蜂鸣器则发出警报

4.保存密码至FLASH, 调电后不丢失

IC卡模式:

1.读取IC卡身份信息,若系统中有身份信息则开锁成功

2.IC身份错误,系统无身份识别信息,则蜂鸣器报警

话不多说,先演示一下成品

密码模式:

1.输入密码,密码正确即开锁,oled屏显示开锁成功

2.若输入错误,OLED显示开锁失败

3.连续三次输错密码,蜂鸣器则发出警报

4.保存密码至FLASH, 调电后不丢失

IMG_1281

     上面视频演示的是密码模式,  前三次密码错误, 蜂鸣器发出警报 ,不过好像视频拍的糊一些, 抱歉不知道能不能听得到蜂鸣器三声警报,  此时的正确密码为123456 输入密码,密码正确即开锁,oled屏显示开锁成功。按0键返回关锁。

这是我程序中的初始密码,  因为密码是存储到flash的, 所以修改来修改去会忘记之前的密码,如果你忘记了之前的密码可以通过蓝牙修改, 或者注释掉下句代码。

 

上位机:

1.上位机可以对密码进行设置、重置

2.上位机可以接收密码输入错误的报警弹窗提示。

上位机密码修改

先是输入先前密码123456, 通过HC05蓝牙助手发送以FF为开头的FE结尾的。

例子点击HEX发送   然后输入  FF 06 05 04 03 02 01 FE然后回车空一行 点击发送, 更改密码 再次尝试使用123456解锁失效,  同时上位机接收提示密码错误 。 输入新密码654321成功,  同时会将新密码存储到FLASH中 密码不会随着关机开机而变化。

 一定要记得修改密码功能是要用HEX发送以FF开头FE结尾换行后发送! ! ! ! ! ! !

IC卡模式:

1.读取IC卡身份信息,若系统中有身份信息则开锁成功

2.IC身份错误,系统无身份识别信息,则蜂鸣器报警

RC522解锁门锁

放入白色卡片和蓝色卡片均可以解锁, 因为我已经提前写入在代码中, 后续你们想修改你们自己的只需要在RC522中这个地方按照我定义的方式修改即可

继续说,  卡片放到RC522模块上, 会在蓝牙上面显示此卡片 卡号, 同时和自己库里的卡片进行比对,  比对成功则开锁, 比对不成功, 则开锁失败, 在蓝牙助手上取消HEX发送模式, 发送ID

会显示当前存储的卡片数据, 显示剩余可用ID数, 目前可用ID数为3,用户可以选择a+卡号就是我上面的那个3c34一大串, 加回车换行发送,就可以添加新的卡解锁喽,  我知道有人会想我不知道我买的这个模块送的卡片的卡号啊?  所以我设置好识别卡号,  无论是任何卡片 放到上面,都会显示当前卡号, 再显示解锁成功与否。

对了有一点如果你想删除或者添加卡号, 一定要选择先输入ID弹出我上面这一大块, 然后按照我写的指令执行,这样比较规范。

上位机:

1. 添加或删除ic卡用户信息。

添加或删除ic卡用户信息

我自己尝试了一下用校园卡去测试RFID, 校园卡放到RC522模块上时由于系统中没有此身份信息,  所以开锁失败, 同时检测出校园卡卡号为9E902580。

添加此ic卡用户信息至信息库中, 输入a9E902580换行点击发送, 如果修改成功, 系统会通过蓝牙返回添加成功和添加至第几个ic卡位。添加后, 再次用校园卡放到RC522模块上, 就可以解锁, 

 

 

如果想从系统中删除掉第几个ic卡可以输入d+数字(也就是序列号)。

例如我的视频中是第一个卡位录入的卡片是那张白色的卡,  第二个卡位录入的是蓝色的卡片, 所以系统会自动按照顺序录入到空白卡位,  所以如果我想录入校园卡也就是录入到第三号卡位,  所以删除则需输入d3换行发送, 系统就会返回某某卡位删除成功。

 之后再次将校园卡放到RC522模块上时候, 就无法解锁, 卡号错误。

我为大家准备了5个卡位可以存储, 至于卡位我就没有没选择存储至flash中,  因为我测试过, 选择存储flash中,  莫名输入ID后返回的卡位数据会变的非常的慢, 所以我删除掉了这个部分。

下面列数一下连接情况

RFID读卡器

SDA----------------------------->接PA1

SCK----------------------------->接PA2

MOSI----------------------------->接PA3

MISO----------------------------->接PA6

RST----------------------------->接PA4

oled屏幕

GND----------------------------->电源地
VCC----------------------------->接5V或3.3v电源
SCL----------------------------->接PA5(SCL)
SDA----------------------------->接PA7(SDA)

按键模块

排针在左侧的情况下从上到下 PB4,  PB5,  PB6,  PB7,  PB11,  PB10,  PB9,  PB8

蓝牙通信模块(HC-05)

RXD----------------------------->接PA9

TXD----------------------------->接PA10

VCC----------------------------->接3.3v电源

GND----------------------------->电源地

蜂鸣器

 I/O----------------------------->接PA8

VCC----------------------------->接3.3v电源

GND----------------------------->电源地

舵机

信号线-----------------------------> 接PA0

VCC----------------------------->接5v电源

GND----------------------------->电源地

上面的所有模块都需要接VCC和GND,  可能你的最小系统板上面3v3和GND不够, 我是采用的是插在stlink上面的3v3和5v还有GND, 对了我在做测试时舵机接5v时插在stm32上面发现无法供电驱动, 所以我舵机信号线插在PA0  5v和GND是插在stlink上面的5v5还有GND的。下面就是烧录stlink图片。

 main函数代码

#include "stm32f10x.h"                  // Device header
#include "oled.h"
#include "Delay.h"
#include "Keybord.h"
#include "Timer.h"
#include "Servo.h"
#include "PWM.h"
#include "string.h"
#include "USART1.h"
#include "RC522.h"
#include "stmflash.h"
#include "Buzzer.h"

#define SYS_SAVEADDR 0x0800f000   //

uint16_t PassWord;
uint8_t pwd[6];
uint8_t j=0;   // 数组位数
uint16_t Keybord_Num;
uint8_t OK[6] = {9,8,7,6,5,4};   // 初始密码
uint8_t Password_OK_Flag;
uint8_t ID1,ID2,ID3,ID4,ID5;
uint8_t Buzzer_Err;
extern uint8_t Card_OK;
extern uint8_t cnt;    //待机
extern uint8_t Card_Acquisition;

extern unsigned char Card_ID1[8];
extern unsigned char Card_ID2[8];
extern unsigned char Card_ID3[8];
extern unsigned char Card_ID4[8];
extern unsigned char Card_ID5[8];

void Starting(void);
void Judgment_Button(void);
void Bluetooth_Password(void);
void Add_Card_ID(void);
void Delete_Card_ID(void);

unsigned char Card_ID_TEST[8] = {1,2,3,4,5,6,7,8};
unsigned char Card_ID_READ[8] = {0};
int main(void)
{
    OLED_Init();
	OLED_Clear();
	Keybord_Init();
	Servo_Init();
	Timer_Init();
    Serial_Init(); 
	RC522_Init();
    Starting();
	Servo_SetAngle(20);
	Buzzer_Init();
	
	STMFLASH_Read(SYS_SAVEADDR,(uint16_t*)&OK,3);  //如果忘记密码,  注释掉这句密码回归初始密码
	while (1)
	{
		// 按键
		Judgment_Button();
        if(Keybord_Num!=0)
		{
		  cnt = 0;
		}
		if(cnt>5)
		{
		OLED_Clear();
	    Starting();		
        memset(pwd, 0, sizeof(pwd));
	      j = 0;
         cnt =0;
		Servo_SetAngle(20);
		Password_OK_Flag = 0;
		}
		//蜂鸣器
		if(Buzzer_Err == 3)
		{
			Buzzer_ON();
			Delay_ms(200);
			Buzzer_OFF();
			Delay_ms(200);
			
			Buzzer_ON();
			Delay_ms(200);
			Buzzer_OFF();
			Delay_ms(200);
			
			Buzzer_ON();
			Delay_ms(200);
			Buzzer_OFF();
			Delay_ms(200);
			
			Buzzer_Err = 0;
		
		}
         // 蓝牙通信
	    Bluetooth_Password();
		 //射频RC522
		RC522_Handle();
		if(Card_OK == 0)
			{
				Card_OK = 2;
				    OLED_Clear();
					 OLED_ShowCHinese(0,0,0);
	                 OLED_ShowCHinese(20,0,1);
					 OLED_ShowCHinese(40,0,2);
	                  OLED_ShowCHinese(60,0,3);
				    OLED_ShowString(1,3,"IDCard ERR",12);
				     Delay_ms(500);
				    OLED_Clear();
				     Starting();
				       memset(pwd, 0, sizeof(pwd));
                    	 j = 0;	
					Servo_SetAngle(20);
					cnt = 0;
			}
			
		if(Card_OK == 1)
			{
				Card_OK = 2;
		             OLED_Clear();
		  			 OLED_ShowCHinese(0,0,0);
	                 OLED_ShowCHinese(20,0,1);
					 OLED_ShowCHinese(40,0,4);
	                 OLED_ShowCHinese(60,0,5);
		             OLED_ShowString(1,3,"IDCard OK",12);
		   		      Servo_SetAngle(180);
					 Password_OK_Flag = 1;
					 cnt = 0;
			}
			
			
			
			if(Card_Acquisition == 1)
			{
				uint8_t wei;
				
				if(Card_ID1[0] == '0'&&Card_ID1[1] == '0')
				{
					ID1 = 1;
				}
				else
				ID1 = 0;
				
				if(Card_ID2[0] == '0'&&Card_ID2[1] == '0')
				{
					ID2 = 1;
				}
				else
				ID2 = 0;
				
				if(Card_ID3[0] == '0'&&Card_ID3[1] == '0')
				{
					ID3 = 1;
				}
				else
				ID3 = 0;
				
				if(Card_ID4[0] == '0'&&Card_ID4[1] == '0')
				{
					ID4 = 1;
				}
				else
				ID4 = 0;
				
				if(Card_ID5[0] == '0'&&Card_ID5[1] == '0')
				{
					ID5 = 1;
				}
				else
				ID5 = 0;
				
				printf("当前可用Card_ID如下,总共可存储5个Card_ID\r\n");
				if(ID1 == 0)
				{
					printf("\r\nCard_ID1 = ");
                    for(wei = 0;wei<8;wei++)				
				{					
					printf("%c",Card_ID1[wei]);
				}
				printf("\r\n");
				printf("\r\n");
			    }
				
				if(ID2 == 0)
				{
				printf("Card_ID2 = ");
               for(wei = 0;wei<8;wei++)				
				{
					
					printf("%c",Card_ID2[wei]);
				}
				printf("\r\n");
				printf("\r\n");
			    }
				if(ID3 == 0)
				{
				printf("Card_ID3 = ");
               for(wei = 0;wei<8;wei++)				
				{
					
					printf("%c",Card_ID3[wei]);
				}
				printf("\r\n");
				printf("\r\n");
			    }
				if(ID4 == 0)
				{
				printf("Card_ID4 = ");
               for(wei = 0;wei<8;wei++)				
				{
					
					printf("%c",Card_ID4[wei]);
				}
				printf("\r\n");
				printf("\r\n");
			    }
				if(ID5 == 0)
				{
				printf("Card_ID5 = ");
               for(wei = 0;wei<8;wei++)				
				{
					
					printf("%c",Card_ID5[wei]);
				}
				printf("\r\n");
				printf("\r\n");
			    }
				printf("剩余可用Card_ID为%d\r\n\r\n",ID1+ID2+ID3+ID4+ID5);
				
				Card_Acquisition = 0;
				printf("请用户选择\r\n\r\n添加卡号 -> a + 数列号以回车结尾\r\n\r\n删除卡号 -> d + 数列号\r\n\r\n取消操作 -> 无需输入\r\n\r\n");
			
			
			} 
			// 添加卡片
			Add_Card_ID();
			// 删除卡片
			Delete_Card_ID();
	 
	}

---------------------------------------------------------------------------------------------------

全部代码上传至(2条消息) 【免费】STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程)资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/588823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx 文件读取漏洞复现

0x01 产品简介 pkpmbs 建设工程质量监督系统是湖南建研信息技术股份有限公司一个与工程质量检测管理系统相结合的,B/S架构的检测信息监管系统。 0x02 漏洞概述 pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx接口处存在文件读取漏洞,未经身份认证的攻击者可以利用漏洞读…

【C++】拷贝复制:拷贝构造函数的使用

欢迎来到CILMY23的博客 本篇主题为&#xff1a;拷贝复制&#xff1a;拷贝构造函数的使用 博客主页&#xff1a;CILMY23-CSDN博客 个人专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 写在前头…

【趣味实践】KataGo+Sabaki搭建Ai围棋助手

前言 最近和同门在比试围棋&#xff0c;结果被爆虐&#xff0c;于是想借助Ai治治“嚣张”的他。 KataGo简介 继2016年AlphaGo出圈以来&#xff0c;已有不少Ai模型&#xff0c;其中部分如下图[1]所示。 在线围棋对弈网站OGS上&#xff0c;使用KataGo(https://online-go.com/)这…

什么是限流?常见的限流算法

目录 1. 什么是限流 2. 常见限流算法 3. 固定窗口算法 4. 滑动窗口算法 5. 漏桶算法 6. 令牌桶算法 7. 限流算法选择 1. 什么是限流 限流&#xff08;Rate Limiting&#xff09;是一种应用程序或系统资源管理的策略&#xff0c;用于控制对某个服务、接口或功能的访问速…

硬件知识积累 DP 接口简单介绍以及 DP信号飞线到显示屏的问题

1. DP 接口的介绍 定义与起源&#xff1a; DP接口是由PC及芯片制造商联盟开发&#xff0c;并由视频电子标准协会&#xff08;VESA&#xff09;标准化的数字式视频接口标准。它的设计初衷是为了取代传统的VGA、DVI和FPD-Link&#xff08;LVDS&#xff09;接口&#xff0c;以满足…

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…

Java数组深度剖析:掌握数据结构的基石

引言 在编程世界中&#xff0c;数仅仅是一种数据类型&#xff0c;它是理解内存分配、多维数据处理以及性能优组像是构建复杂数据结构的基本积木。它们简洁、高效&#xff0c;是管理元素集的首选方式。在Java中&#xff0c;数组不化的关键。 这篇文章致力于深入探讨Java数组的各…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

【二】电力系统规约IEC 104详解

电力系统规约IEC 104详解 概述 很早就准备梳理出一下电力系统规约系列的文章&#xff0c;因为自己在实践过程中发现这方面太难找了&#xff0c;网上的资料也都比较陈旧。我接触和使用IEC系列规约也有一段时间了&#xff0c;本着总结和分享的想法&#xff0c;我想推出这系列的文…

在线的调试器pythontutor,支持C/C++

1. 背景介绍 对于C语言的学习最复杂的可能无疑就是指针的&#xff0c;指针因其灵活、晦涩难懂等特点而出名&#xff0c;本文并不介绍利用gdb的角度去分析它&#xff0c;而是通过一个在线网站而分析&#xff1b; 2.C代码调试 3. C代码调试 4在线网站 https://pythontutor.com/…

【项目纪实】某国有航空公司人力资源系统诊断咨询项目

公司的人力资源管理问题一直都比较严重&#xff0c;比如人员冗余、员工工作积极性差等问题&#xff0c;虽然经过多次的管理尝试&#xff0c;存在的问题仍然没有缓解。华恒智信人力资源咨询公司的老师特别专业&#xff0c;帮我们系统、全面的诊断了人力资源管理上存在的问题&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.3--Cortex-A7寄存器介绍

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Numerical Analysis(byRichard.L..Burden)【pdf高清英文原版】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

HarmonyOS 4.0(鸿蒙开发)01 - 怎么学习鸿蒙引导篇

作为公司的全栈开发工程师 以及 未来的发展是有鸿蒙这个阶段的&#xff0c;以及本身具有这个技术栈由此后续会分享自己在实战中学习到的东西&#xff0c;碰到的bug都会分享出来&#xff0c;这是引导篇期待后续的更新 学习目标&#xff1a; 理解HarmonyOS操作系统的架构和开发…

目标检测算法YOLOv3简介

YOLOv3由Joseph Redmon等人于2018年提出&#xff0c;论文名为&#xff1a;《YOLOv3: An Incremental Improvement》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/1804.02767.pdf &#xff0c;项目网页&#xff1a;https://pjreddie.com/darknet/yolo/ 。YOLOv3是对YOL…

解决IDEA下springboot项目打包没有主清单属性

1.问题出现在SpringBoot学习中 , 运行maven打包后无法运行 报错为spring_boot01_Demo-0.0.1-SNAPSHOT.jar中没有主清单属性 SpringBoot版本为 2.6.13 Java 版本用的8 解决方法 1.执行clean 删除之前的打包 2.进行打包规范设置 2.1 3.进行问题解决 (借鉴了阿里开发社区) 使用…

利用PDAL2.7.1 实现点云滤波

利用PDAL2.7.1 实现点云滤波 本文介绍利用PDAL实现点云滤波方法&#xff0c;包含pipeline命令行运行、C代码两种方法&#xff0c;C代码分别介绍对点云文件进行滤波、点云全部在内存中进行滤波的pdal两种调用方法。并简单探究pdal的设计结构。 目录 1 pipeline命令调用方法2 文…

R语言4版本安装mvstats(纯新手)

首先下载mvstats.R文件 下载mvstats.R文件点此链接&#xff1a;https://download.csdn.net/download/m0_62110645/89251535 第一种方法 找到mvstats.R的文件安装位置&#xff08;R语言的工作路径&#xff09; getwd() 将mvstats.R保存到工作路径 在R中输入命令 source(&qu…

飞腾D2000+X100 TYPE6全国产核心板

飞腾D2000X100 TYPE6核心板 产品概述 飞腾D2000X100 TYPE6核心板为增强型自主控制器核心板&#xff0c;其核心芯片CPU采用飞腾D2000/8核工业版CPU、飞腾桥片X100、双通道DDR4L插槽、PHY芯片等。 产品特点 l 基于飞腾D2000X100桥片 l 丰富的PCIE扩展资源&#xff0c;一路PCIE…

C++入门系列-函数重载

&#x1f308;个人主页&#xff1a; 羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 函数重载 自然语言当中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重载了。 函数重载的概念 函数重载&#x…
最新文章