当前位置: 首页 > article >正文

基于STM32的智能门禁系统

目录

  1. 引言
  2. 项目背景
  3. 环境准备
    • 硬件准备
    • 软件安装与配置
  4. 系统设计
    • 系统架构
    • 关键技术
  5. 代码示例
    • RFID数据采集与处理
    • 门禁控制实现
    • 显示与报警功能
  6. 应用场景
  7. 结论

1. 引言

智能门禁系统在现代安防中占据重要地位,通常用于控制进入和离开特定区域的权限。通过基于STM32微控制器的智能门禁系统,可以利用RFID识别技术对人员身份进行认证,结合显示和报警功能,确保进入人员的合法性,并在未经授权的访问尝试时触发报警。

2. 项目背景

传统的门禁系统依赖于钥匙或密码,存在丢失或忘记的风险。智能门禁系统通过RFID(射频识别)技术,可以对进出人员进行身份验证,并提供便捷和安全的门禁管理。该系统可以应用于家庭、办公楼、实验室等多个场景中,确保安全性并提高便利性。

3. 环境准备

硬件准备

  • STM32开发板:STM32F103或类似微控制器
  • RC522 RFID读卡器:用于读取RFID卡信息
  • RFID卡或标签:用于识别人员身份
  • 舵机或电磁锁:用于控制门锁的开关
  • OLED显示屏:用于显示门禁状态信息
  • 蜂鸣器:用于未经授权时发出报警
  • LED灯:用于指示访问状态(如绿色表示授权访问,红色表示拒绝访问)
  • 面包板及连接线:用于硬件连接
  • 电源或电池:为系统供电

软件安装与配置

  1. Keil uVision:用于编写和编译代码。
  2. STM32CubeMX:用于配置STM32的引脚和外设。
  3. ST-Link Utility:用于将代码下载到STM32开发板中。

步骤:

  1. 下载并安装Keil uVision。
  2. 下载并安装STM32CubeMX。
  3. 使用ST-Link Utility来烧录代码到STM32。

4. 系统设计

系统架构

智能门禁系统主要由以下模块组成:

  1. 身份识别模块:通过RC522 RFID读卡器读取用户的RFID卡信息,并与预存的授权卡进行匹配。
  2. 门禁控制模块:根据身份验证结果控制门锁的开关(通过舵机或电磁锁实现)。
  3. 显示与报警模块:通过OLED显示屏显示门禁状态(授权或拒绝访问),并通过蜂鸣器在拒绝访问时发出报警提示。
  4. 状态指示模块:通过LED指示授权状态,绿色表示授权访问,红色表示拒绝。

关键技术

  • RFID数据采集与验证:STM32通过SPI与RC522 RFID读卡器通信,读取卡片数据,并与预设的合法卡号进行匹配。
  • 门禁控制:根据身份验证结果,通过舵机或电磁锁控制门的开关。
  • 报警与状态显示:当检测到未经授权的访问时,触发蜂鸣器报警并在OLED显示屏上提示,同时通过LED灯指示授权状态。

5. 代码示例

RFID数据采集与处理

#include "rc522.h"
#include "stm32f1xx_hal.h"

// 已授权的RFID卡号
uint8_t authorized_card[5] = {0x12, 0x34, 0x56, 0x78, 0x90};

// 初始化RC522 RFID模块
void RFID_Init(void) {
    RC522_Init();
}

// 读取RFID卡号
uint8_t Read_RFID_Card(void) {
    uint8_t card_id[5];
    
    if (RC522_Check(card_id) == MI_OK) {
        if (RC522_Compare(card_id, authorized_card) == MI_OK) {
            return 1;  // 授权通过
        }
    }
    return 0;  // 未授权
}

门禁控制实现

// 初始化舵机或电磁锁
void Door_Lock_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 配置舵机或电磁锁引脚
    GPIO_InitStruct.Pin = GPIO_PIN_1;  // 舵机或电磁锁接入PA1
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 控制门锁开关
void Control_Door_Lock(uint8_t access_granted) {
    if (access_granted) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  // 开锁
        HAL_Delay(5000);  // 门保持5秒开锁状态
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // 关锁
    }
}

显示与报警功能

// OLED显示门禁状态
void Display_Status(uint8_t access_granted) {
    if (access_granted) {
        OLED_DisplayString("Access Granted");
    } else {
        OLED_DisplayString("Access Denied");
    }
}

// 初始化蜂鸣器和LED
void Alarm_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOB_CLK_ENABLE();

    // 配置蜂鸣器和LED引脚
    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;  // LED和蜂鸣器引脚
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

// 访问状态指示和报警
void Access_Alarm(uint8_t access_granted) {
    if (access_granted) {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 绿灯亮表示授权访问
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);  // 关闭蜂鸣器
    } else {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);  // 关闭绿灯
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);  // 蜂鸣器报警,红灯亮
    }
}

// 主循环
int main(void) {
    HAL_Init();
    RFID_Init();
    Door_Lock_Init();
    Alarm_Init();
    
    while (1) {
        uint8_t access_granted = Read_RFID_Card();  // 读取RFID卡并验证

        // 显示状态并控制门锁
        Display_Status(access_granted);
        Control_Door_Lock(access_granted);

        // 控制报警与LED指示灯
        Access_Alarm(access_granted);
        
        HAL_Delay(2000);  // 延迟2秒后继续检测
    }
}

 

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

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

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

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

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

6. 应用场景

  • 家庭安全:智能门禁系统可以用于家庭入口,确保只有授权人员才能进入房屋。
  • 办公室门禁:在办公楼内,智能门禁系统可以确保只有经过授权的员工可以进入特定区域。
  • 实验室和机房安全:用于实验室、机房等需要特殊权限的场所,防止未经授权的人员进入。

7. 结论

基于STM32的智能门禁系统通过结合RFID技术,可以有效管理进入权限,并提供实时的门禁状态反馈和报警功能。该系统结构简单、功能实用,适合应用于家庭、办公室和实验室等场景。通过扩展,该系统还可以集成更多的安全功能,例如远程管理、历史记录查询等。


http://www.kler.cn/news/327953.html

相关文章:

  • OpenCV视频I/O(6)检查视频捕获对象是否已成功打开的函数isOpened()的使用
  • uniapp 微信小程序 微信支付
  • 张量、框架
  • 选择与运用合适工具提升编程效率的秘诀
  • uboot笔记(一):概括/移植等
  • Lagent 自定义你的 Agent 智能体
  • k8s 部署 prometheus
  • Android中级控件
  • Fivetran+Milvus:AI搜索新时代的数据迁移利器
  • 学习记录:js算法(五十):二叉树的右视图
  • 【Preference Learning】Reasoning with Language Model is Planning with World Model
  • mysql学习教程,从入门到精通,SQL 表、列别名(Aliases)(30)
  • Spring Boot框架在甘肃非遗文化网站设计中的运用
  • ubuntu配置python环境
  • 深度学习基础及技巧
  • Linux性能调优技巧
  • 汽车零部件开发流程关键阶段
  • PowerShell无法执行yarn命令
  • Qt_线程介绍与使用
  • Wpf Image 展示方式 图片处理 显示
  • 828华为云征文|华为云 Flexus X 实例初体验
  • 选择更轻松:山海鲸可视化与PowerBI的深度对比
  • MATLAB在无线通信标准与协议支持中的作用
  • 打造未来社交:区块链社交DAO的颠覆性开发之路
  • 2.1 HuggingFists系统架构(一)
  • Go 项目开发常用设计模式
  • OpenCV图像文件读写(1)检查 OpenCV 是否支持某种图像格式的读取功能函数haveImageReader()的使用
  • Python FFmpeg 安装使用教程
  • SQL第10课挑战题
  • C# 泛型使用案例_C# 泛型使用整理