基于STM32的智能门锁控制系统设计

引言

本项目基于STM32微控制器设计了一个智能门锁控制系统,用户可以通过密码输入或指纹识别来控制门锁的开关。该系统集成了键盘、指纹传感器、舵机等外设,实现了门锁的安全、便捷控制,同时也具备了较强的扩展性。该项目展示了STM32在安防领域的应用。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • 4x4 矩阵键盘(用于密码输入)
  • 指纹传感器模块(如 R307)
  • 舵机(用于控制门锁开关)
  • 蜂鸣器(用于提示音)
  • OLED 显示屏(用于显示状态)
  • 面包板和杜邦线
  • USB-TTL 串口调试工具
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • 矩阵键盘连接:将 4x4 键盘的行和列引脚连接到 STM32 的 GPIO(如 PB0-PB7)上,用于读取按键输入。
  • 指纹传感器连接:将指纹传感器的 TX 和 RX 引脚分别连接到 STM32 的 UART 接口(如 PA9 和 PA10)。
  • 舵机连接:将舵机的信号引脚连接到 STM32 的 PWM 引脚(如 PA8),用于控制舵机开合门锁。
  • 蜂鸣器连接:将蜂鸣器的控制引脚连接到 STM32 的 GPIO 引脚(如 PA3),用于发出提示音。
  • OLED 显示屏连接:将 OLED 显示屏的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7)。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI 以确保系统稳定。
  • 配置 GPIO 引脚用于矩阵键盘、蜂鸣器、舵机控制。
  • 配置 UART 用于指纹传感器通信。
  • 配置 I2C 用于 OLED 显示屏控制。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写密码输入、指纹识别、舵机控制以及 OLED 显示屏显示的代码。以下是智能门锁控制系统的基本代码示例:

#include "stm32f1xx_hal.h"
#include "fingerprint.h"
#include "keypad.h"
#include "servo.h"
#include "oled.h"

// 密码和指纹 ID
const char correct_password[] = "1234";  // 预设的密码
uint8_t authorized_fingerprint_id = 1;   // 预设的指纹 ID

// 函数声明
void Lock_Control(uint8_t state);
uint8_t Check_Password(void);
uint8_t Check_Fingerprint(void);
void System_Init(void);

// 初始化系统
void System_Init(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_I2C1_Init();
    
    OLED_Init();
    Keypad_Init();
    Servo_Init();
    Fingerprint_Init();
    
    OLED_ShowString(0, 0, "Welcome");
}

// 控制舵机打开或关闭门锁
void Lock_Control(uint8_t state)
{
    if (state == 1)
    {
        Servo_Open();  // 打开门锁
        OLED_ShowString(0, 1, "Lock Open");
    }
    else
    {
        Servo_Close();  // 关闭门锁
        OLED_ShowString(0, 1, "Lock Closed");
    }
}

// 检查密码输入
uint8_t Check_Password(void)
{
    char input[5] = {0};
    OLED_ShowString(0, 0, "Enter Password:");
    
    for (uint8_t i = 0; i < 4; i++)
    {
        input[i] = Keypad_GetKey();  // 获取按键输入
        OLED_ShowChar(i * 8, 1, '*');  // 显示星号代替密码
        HAL_Delay(500);  // 防抖延时
    }
    
    return (strcmp(input, correct_password) == 0);  // 返回密码比对结果
}

// 检查指纹
uint8_t Check_Fingerprint(void)
{
    OLED_ShowString(0, 0, "Place Finger:");
    uint8_t result = Fingerprint_Scan();  // 扫描指纹
    
    if (result == authorized_fingerprint_id)
    {
        OLED_ShowString(0, 1, "Fingerprint OK");
        return 1;
    }
    else
    {
        OLED_ShowString(0, 1, "Fingerprint Fail");
        return 0;
    }
}

int main(void)
{
    System_Init();
    
    while (1)
    {
        // 检查密码输入
        if (Check_Password())
        {
            Lock_Control(1);  // 密码正确,打开门锁
            HAL_Delay(5000);  // 保持门锁打开5秒
            Lock_Control(0);  // 关闭门锁
        }
        
        // 检查指纹
        if (Check_Fingerprint())
        {
            Lock_Control(1);  // 指纹正确,打开门锁
            HAL_Delay(5000);  // 保持门锁打开5秒
            Lock_Control(0);  // 关闭门锁
        }
        
        HAL_Delay(1000);  // 每秒更新一次状态
    }
}
4. 密码输入处理

以下是矩阵键盘处理密码输入的代码示例:

#include "keypad.h"

// 初始化键盘
void Keypad_Init(void)
{
    // GPIO 初始化代码
}

// 获取按键输入
char Keypad_GetKey(void)
{
    // 轮询键盘,返回按下的按键字符
    char key = '0';  // 示例,实际需要轮询检测
    return key;
}
5. 指纹识别处理

以下是指纹识别模块的基本代码示例:

#include "fingerprint.h"

// 初始化指纹模块
void Fingerprint_Init(void)
{
    // UART 初始化代码
}

// 指纹扫描
uint8_t Fingerprint_Scan(void)
{
    // 模拟指纹识别
    return 1;  // 假设返回的指纹ID为1
}
6. 舵机控制

通过 PWM 控制舵机开合门锁:

#include "servo.h"

// 初始化舵机
void Servo_Init(void)
{
    // PWM 初始化代码
}

// 打开门锁
void Servo_Open(void)
{
    // 设置舵机角度,打开门锁
}

// 关闭门锁
void Servo_Close(void)
{
    // 设置舵机角度,关闭门锁
}
7. OLED 显示处理

用于显示状态和提示信息:

#include "oled.h"

// 初始化 OLED
void OLED_Init(void)
{
    // I2C 初始化代码
}

// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, char *str)
{
    // 在 OLED 上显示字符串
}

// 显示字符
void OLED_ShowChar(uint8_t x, uint8_t y, char chr)
{
    // 显示单个字符
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

8. 系统工作原理
  • 密码输入:用户通过4x4键盘输入密码,系统对比输入的密码和预设密码,若匹配则打开门锁。
  • 指纹识别:用户可以通过指纹传感器进行身份验证,指纹匹配时系统打开门锁。
  • 舵机控制:使用舵机通过PWM信号控制门锁的开合。
  • 状态显示:OLED显示屏用于显示输入状态、门锁状态以及提示信息,提升用户体验。

常见问题与解决方法

1. 密码输入无反应
  • 检查键盘连接是否正确,确保行列引脚与 STM32 的 GPIO 引脚对应。
  • 检查键盘驱动代码,确保轮询或中断处理键盘按键。
2. 指纹识别失败
  • 确保指纹传感器的 UART 通信配置正确,波特率匹配。
  • 检查指纹库中是否已注册指纹,确保指纹 ID 一致。
3. 舵机无法控制门锁
  • 确认舵机的 PWM 信号是否正常,检查舵机的供电是否充足。
  • 调整 PWM 的脉宽,确保舵机的角度控制准确。

结论

通过本项目,我们成功设计了基于STM32的智能门锁控制系统,实现了通过密码和指纹识别来控制门锁开关的功能。该系统具有较强的安全性和便捷性,可应用于智能家居和安防系统中,展示了STM32在物联网设备控制领域的强大功能。

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

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

相关文章

某个应用的CPU使用率居然达到100%,我该怎么办?

摘至https://learn.lianglianglee.com/ CPU使用率 Linux 作为一个多任务操作系统&#xff0c;将每个 CPU 的时间划分为很短的时间片&#xff0c;再通过调度器轮流分配给各个任务使用&#xff0c;因此造成多任务同时运行的错觉。 为了维护 CPU 时间&#xff0c;Linux 通过事先定…

七、InnoDB数据存储结构

文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的大小1.4 页的上层结构2. 页的内部结构2.1 第1部分:File Header(文件头部)和 File Trailer(文件尾部)2.1.1 File Header(文件头部)2.1.2 File tRAILER(文件尾部)2.2 第2部分:Fr…

【AIGC】通过OpenAi Canvas修改论文(附40条论文优化指令)

目录 1、用ChatGPT优化论文大纲和逻辑2、用ChatGPT充实论文内容3、用ChatGPT寻找案例和数据4、用ChatGPT检查语法和字词错误5、如何直接使用ChatGPT4o、o1、OpenAI Canvas6、OpenAI Canvas增强了啥&#xff1f;7、编程功能增强 在刚开始撰写学术论文时&#xff0c;很多小伙伴感…

深度学习之贝叶斯分类器

贝叶斯分类器 1 图解极大似然估计 极大似然估计的原理&#xff0c;用一张图片来说明&#xff0c;如下图所示&#xff1a; ​ 例&#xff1a;有两个外形完全相同的箱子&#xff0c;1号箱有99只白球&#xff0c;1只黑球&#xff1b;2号箱有1只白球&#xff0c;99只黑球。在一次…

LeetCode刷题日记之二叉树(六)

目录 前言二叉搜索树中的众数二叉树的最近公共祖先二叉搜索树的最近公共祖先总结 前言 又是学习LeetCode二叉树的新一天&#xff0c;今天还是接着学习一下二叉搜索树的内容&#xff0c;希望博主记录的内容能够对大家有所帮助 &#xff0c;一起加油吧朋友们&#xff01;&#x…

LeetCode讲解篇之2466. 统计构造好字符串的方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 组成长度为i的字符串个数 组成长度为i - zero的字符串个数 组成长度为i - one的字符串个数 设数组f中i号元素的值为组成长度为i的字符串个数 则状态转移方程为f[i] f[i - zero] f[i - one]&#xff0c;其中需…

MySQL中NULL值是否会影响索引的使用

MySQL中NULL值是否会影响索引的使用 为何写这一篇文章 &#x1f42d;&#x1f42d;在面试的时候被问到NULL值是否会走索引的时候&#xff0c;感到有点不理解&#xff0c;于是事后就有了这篇文章 问题&#xff1a; 为name建立索引&#xff0c;name可以为空select * from user …

使用标签实现MyBatis的基础操作

目录 前言 1.配置MyBatis⽇志打印 2.参数传递 2.1 #{} 和 ${}区别 2.2传递多个参数 3.增删改查 3.1增(Insert) 3.2删(Delete) 3.3改(Update) 3.4查(Select) 前言 接下来我们会使用的数据表如下&#xff1a; 对应的实体类为&#xff1a;UserInfoMapper 所有的准备工作都…

Nginx08-反向代理

零、文章目录 Nginx08-反向代理 1、概述 关于正向代理和反向代理&#xff0c;我们在前面已经介绍过了&#xff0c;简而言之就是正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;这是两者之间最大的区别。 Nginx即可以实现正向代理&#xff0c;也可…

Python进阶--正则表达式

目录 1. 基础匹配 2. 元字符匹配 1. 基础匹配 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff…

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…

【异常记录Vue_20241006】使用TagsView后控制台报错

报错截图 报错原因 未将TagsView所依赖的组件permission组件注册到store中&#xff0c;导致TagsView组件在找permission.routes时没找到 解决方法&#xff1a;store注册相应组件

应用界面编写(十四)

一. 介绍QT 接下来我们会在Qt Creater来进行界面的编写&#xff0c;并且在荔枝派中运行。那么我们有必要了解一下Qt到底是什么呢&#xff1f;它又为什么可以在荔枝派中运行呢&#xff1f; QT是一个跨平台的应用程序和用户界面框架&#xff0c;用于开发具有图形界面的软件。而…

【AI知识点】残差网络(ResNet,Residual Networks)

残差网络&#xff08;ResNet&#xff0c;Residual Networks&#xff09; 是由微软研究院的何凯明等人在 2015 年提出的一种深度神经网络架构&#xff0c;在深度学习领域取得了巨大的成功。它通过引入残差连接&#xff08;Residual Connection&#xff09; 解决了深层神经网络中…

Linux--IO模型与高级IO重要概念

什么是IO&#xff1f; IO是指计算机系统与外部世界进行数据交换的过程。在计算机中&#xff0c;IO通常用于与外部设备通信&#xff0c;这些设备包括键盘、鼠标、打印机、显示器、网络等。通过IO操作&#xff0c;计算机系统可以接收来自外部设备的输入数据&#xff0c;也可以将…

CSS圆角

在制作网页的过程中&#xff0c;有时我们可能需要实现圆角的效果&#xff0c;以前的做法是通过切图&#xff08;将设计稿切成便于制作成页面的图片&#xff09;&#xff0c;使用多个背景图像来实现圆角。在 CSS3 出现之后就不需要这么麻烦了&#xff0c;CSS3 中提供了一系列属性…

代数结构基础 - 离散数学系列(八)

目录 1. 群&#xff08;Group&#xff09; 群的定义 群的示例 2. 环&#xff08;Ring&#xff09; 环的定义 环的示例 3. 域&#xff08;Field&#xff09; 域的定义 域的示例 域在密码学中的应用 4. 实际应用场景 1. 对称性与加密 2. 误差检测与纠正 3. 数据编码…

jetlinks物联网平台学习5:dtu设备接入及温度报警场景联动

dtu设备接入及温度报警场景联动 1、平台端配置1、新建协议2、新建网络组件3、设备接入网关配置4、新增产品5、导入产品物模型6、新增设备7、场景联动配置7.1、触发规则7.2、触发条件7.3、执行动作 2、平台端验证场景联动 1、平台端配置 下载三个文件 https://hanta.yuque.com…

40条经典ChatGPT论文指令,圈定选题和进行论文构思

目录 1、用ChatGPT圈定选题范围2、用ChatGPT生成研究方法和思路3、用ChatGPT扩展论文观点和论证4、用ChatGPT辅助论文结构设计5、如何直接使用ChatGPT4o、o1、OpenAI Canvas6、OpenAI Canvas增强了啥&#xff1f;7、编程功能增强 &#x1f447; ChatGPT o1网页入口在文末&#…

如何让算法拥有“记忆”?一文读懂记忆化搜索

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 什么是记忆化搜索 二 相关题目练习 2.1 斐波那契数&#xff08;详解记忆化搜索&#xff09; ​编辑 解法一&#xff08;递归&#xff09;&#xff1a; 解法二&#xff08;记…