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

news2024/12/24 1:02:30

引言

本项目基于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.coloradmin.cn/o/2195882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的智能水族箱控制系统设计

引言 本项目基于STM32微控制器设计一个智能水族箱控制系统。该系统能够通过传感器监测水温、照明和水位&#xff0c;并自动控制加热器、LED灯和水泵&#xff0c;确保水族箱内的环境适宜鱼类生长。该项目展示了STM32在环境监测、设备控制和智能反馈系统中的应用。 环境准备 1…

Java:数据结构-初始结合框架 时间复杂度和空间复杂度 初识泛型

一 初始结合框架 1.什么是Java的集合框架 Java 的集合框架&#xff08;Java Collection Framework&#xff0c;JCF&#xff09;是 Java 标准库中的一部分&#xff0c;用于存储和操作一组数据。它提供了一些常用的数据结构和接口&#xff0c;用来高效管理和操作数据。Java 的…

全面图解Docker架构设计:掌握Docker全链路思维与优化(命令篇)

Docker 是一个革命性的开放平台&#xff0c;用于开发、交付和运行应用程序。通过使用 Docker&#xff0c;开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何支持 Docker 的环境中&#xff0c;在不同环境中实现一致的运行。无论是在虚…

ctf.bugku - POST

题目来源 &#xff1a;POST - Bugku CTF 访问请求&#xff0c;返回如下信息&#xff1b; 从这里可以得到信息&#xff1b;想要得到flag &#xff0c;需要发送post请求&#xff0c;并且请求带有what参数&#xff0c;参数值为flag 构造消息体&#xff1b; burpsuite中&#x…

运用MinIO技术服务器实现文件上传——利用程序上传图片(二 )

在上一篇文章中&#xff0c;我们已经在云服务器中安装并开启了minio服务&#xff0c;本章我们将为大家讲解如何利用程序将文件上传到minio桶中 下面介绍MinIO中的几个核心概念&#xff0c;这些概念在所有的对象存储服务中也都是通用的。 - **对象&#xff08;Object&#xff0…

C++笔记之原子操作

C++笔记之原子操作 code review! 文章目录 C++笔记之原子操作1.初始化2.赋值3.取值4.赋给另一个原子类型5.`exchange`6.`compare_exchange_weak` 和 `compare_exchange_strong`使用场景7.注意事项在 C++ 中,原子类型提供了对共享变量的无锁操作,确保多线程环境下的安全。以下…

Android Automotive(一)

目录 什么是Android Automotive Android Automotive & Android Android Automotive 与 Android Auto 什么是Android Automotive Android Automotive 是一个基础的 Android 平台&#xff0c;它能够运行预装的车载信息娱乐系统&#xff08;IVI&#xff09;应用程序&#…

LeetCode讲解篇之1043. 分隔数组以得到最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 对于这题我们这么考虑&#xff0c;我们选择以数字的第i个元素做为分隔子数组的右边界&#xff0c;我们需要计算当前分隔子数组的长度为多少时能让数组[0, i]进行分隔数组的和最大 我们用数组f表示[0, i)区间内的…

【C++】函数重载+引用

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解C的函数重载和引用&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 预处理、编译、汇编、链接二. 函数重载1 概念2 C支持函数重载的原理—名字修饰…

『网络游戏』制作加载进度UI【04】

将上一章的提示界面隐藏 创建空节点重命名为LoadingWnd 设置父物体为伸展 创建一个image背景重命名为bg 将以下资源放进Art文件夹 设为精灵模式后拖拽 将下面资源图片放进Art文件夹 创建Image作为进度条重命名为loadingbg 复制一份重命名为loadingfg 将loadingfg设置为水平填充…

Stable Diffusion绘画 | AI 图片智能扩充

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

OpenStack Yoga版安装笔记(十六)Openstack网络理解

0、前言 本文将以Openstack在Linux Bridge环境下的应用为例进行阐述。 1、Openstack抽象网络 OpenStack的抽象网络主要包括网络&#xff08;network&#xff09;、子网&#xff08;subnet&#xff09;、端口&#xff08;port&#xff09;&#xff0c;路由器&#xff08;rout…

Android15车载音频之Virtualbox中QACT实时调试(八十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

Python--暂停一秒输出

在编程实践中&#xff0c;我们经常需要让程序在执行特定操作后暂停一段时间。Python中的time模块提供了一个简单而强大的sleep()函数&#xff0c;允许程序暂停指定的时间。本文将通过一个具体的例子&#xff0c;展示如何使用sleep()函数来实现每隔一秒输出一次当前时间的最后两…

爱心曲线公式大全

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()…

Golang | Leetcode Golang题解之第463题岛屿的周长

题目&#xff1a; 题解&#xff1a; type pair struct{ x, y int } var dir4 []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func islandPerimeter(grid [][]int) (ans int) {n, m : len(grid), len(grid[0])for i, row : range grid {for j, v : range row {if v 1 {for _, d :…

深度学习---------------------------------自注意力和位置编码

目录 自注意力跟CNN、RNN对比位置编码位置编码矩阵 绝对位置信息相对位置信息总结自注意力和位置编码自注意力该部分总代码 位置编码该部分总代码 二进制表示在编码维度上降低频率该部分总代码 自注意力 给定一个由词元组成的输入序列 x 1 x_1 x1​,…, x n x_n xn​&#xff…

基于web的网上摄影工作室的开发与实现源码+论文

项目简介 基于springboot实现的&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;springboot/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09;/Maven3&#xff08…

基于ssm实现的建筑装修图纸管理平台(源码+文档)

项目简介 基于ssm实现的建筑装修图纸管理平台&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;spring/springmvc/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09…

农业政策与市场分析:解读当前政策导向下的农业发展趋势

在快速变化的全球经济格局中&#xff0c;农业作为国家稳定发展的基石&#xff0c;其政策走向与市场动态备受瞩目。本文将深入剖析当前的农业政策背景&#xff0c;探讨其对设计的导向作用&#xff0c;以及市场趋势的反馈与影响&#xff0c;为农业可持续发展提供洞见。 1. 政策背…