引言
本项目基于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在物联网设备控制领域的强大功能。