news 2026/8/7 4:51:31

打造STM32指纹考勤机:从原理到实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
打造STM32指纹考勤机:从原理到实现

stm32指纹考勤机 (程序源码包括app程序+pcb电路图+原件清单) 实现的功能如下所示: (1) 用户可操控按键对用户进行录入、删除、清空数据以及查看历史记录等操作。 (2) 继电器可模拟指纹开锁。 (3) 用户可操控按键控制蜂鸣器发出蜂鸣声模拟报警。 (4) 搭载了实时时钟记录用户考勤的时间。 (5) 考勤管理APP连接考勤机后可在智能终端上显示记录数据。 (6) 考勤管理APP可以对继电器和蜂鸣器进行远程控制

最近折腾了一个基于STM32的指纹考勤机项目,今天来和大家分享分享其中的门道,顺便给大家唠唠实现代码。

硬件基础:PCB电路图与原件清单

首先,硬件是软件运行的基础。我们得有一份准确的PCB电路图,它就像是大楼的设计蓝图。对于这个指纹考勤机,电路图主要涉及到STM32最小系统、指纹识别模块接口、按键接口、继电器接口、蜂鸣器接口、实时时钟模块接口以及用于APP连接的通信接口(比如蓝牙或者WiFi模块接口)。

原件清单大概如下:

  • STM32开发板(根据实际需求选择合适型号,如STM32F103C8T6,价格亲民且性能不错)
  • 指纹识别模块(比如常见的R305,识别速度和准确率都还可以)
  • 按键若干(用于用户操作录入、删除等功能)
  • 继电器(控制模拟开锁动作)
  • 蜂鸣器(发出报警声)
  • 实时时钟模块(如DS1307,能精准记录时间)
  • 蓝牙或WiFi模块(实现APP与考勤机通信,蓝牙模块如HC - 05,成本低且易于使用)

软件功能实现

用户按键操作功能

用户通过按键进行各种操作,比如录入指纹、删除指纹、清空数据以及查看历史记录。下面是一个简单的按键检测代码示例(以STM32CubeMX生成的代码框架为基础):

// 假设按键连接到PA0引脚 #define KEY_GPIO_Port GPIOA #define KEY_Pin GPIO_PIN_0 void Key_Scan(void) { if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) { // 消抖处理,防止按键抖动误触发 HAL_Delay(50); if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET) { // 在这里添加具体的操作函数调用,比如录入指纹 Fingerprint_Enroll(); while (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET); } } }

代码分析:首先我们定义了按键的GPIO端口和引脚,KeyScan函数用于扫描按键状态。当检测到按键按下(引脚电平为低),先进行消抖,再次确认按下后,调用相应的操作函数,这里以录入指纹函数FingerprintEnroll()为例。最后等待按键释放。

继电器模拟指纹开锁功能

继电器控制部分代码如下:

// 假设继电器连接到PB5引脚 #define RELAY_GPIO_Port GPIOB #define RELAY_Pin GPIO_PIN_5 void Relay_Control(uint8_t state) { if (state) { HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(RELAY_GPIO_Port, RELAY_Pin, GPIO_PIN_RESET); } }

代码分析:Relay_Control函数通过传入的state参数控制继电器状态。state为1时,设置继电器引脚为高电平,继电器吸合,模拟开锁;state为0时,设置引脚为低电平,继电器断开。

蜂鸣器模拟报警功能

// 假设蜂鸣器连接到PA5引脚 #define BEEP_GPIO_Port GPIOA #define BEEP_Pin GPIO_PIN_5 void Beep_Control(uint8_t state) { if (state) { HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET); } }

代码分析:和继电器控制类似,Beep_Control函数根据传入的state参数控制蜂鸣器引脚电平,实现蜂鸣器的开启和关闭,达到模拟报警效果。

实时时钟记录考勤时间

实时时钟部分代码使用DS1307为例:

#include "ds1307.h" RTC_TimeTypeDef Get_RTC_Time(void) { RTC_TimeTypeDef time; // 假设已经初始化好I2C总线 // 读取DS1307的时间寄存器数据并转换为RTC_TimeTypeDef格式 I2C_Read(DS1307_ADDR, 0x02, &time.Seconds, 1); I2C_Read(DS1307_ADDR, 0x01, &time.Minutes, 1); I2C_Read(DS1307_ADDR, 0x00, &time.Hours, 1); time.Seconds = BCD2DEC(time.Seconds); time.Minutes = BCD2DEC(time.Minutes); time.Hours = BCD2DEC(time.Hours); return time; }

代码分析:GetRTCTime函数通过I2C总线读取DS1307的时间寄存器数据,将BCD码格式的数据转换为十进制格式并填充到RTC_TimeTypeDef结构体中返回,供考勤记录使用。

APP与考勤机交互功能

如果使用蓝牙通信,以HC - 05为例,在STM32端代码主要涉及蓝牙数据的收发处理。

#include "usart.h" void Bluetooth_Receive_Process(void) { uint8_t data; if (HAL_UART_Receive(&huart1, &data, 1, 100) == HAL_OK) { // 根据接收到的数据进行相应处理,比如控制继电器或蜂鸣器 if (data == 'R') { Relay_Control(1); } else if (data == 'B') { Beep_Control(1); } } }

代码分析:BluetoothReceiveProcess函数通过UART接收蓝牙模块发来的数据,根据接收到的数据字符(这里假设R表示控制继电器,B表示控制蜂鸣器)调用相应的控制函数。

stm32指纹考勤机 (程序源码包括app程序+pcb电路图+原件清单) 实现的功能如下所示: (1) 用户可操控按键对用户进行录入、删除、清空数据以及查看历史记录等操作。 (2) 继电器可模拟指纹开锁。 (3) 用户可操控按键控制蜂鸣器发出蜂鸣声模拟报警。 (4) 搭载了实时时钟记录用户考勤的时间。 (5) 考勤管理APP连接考勤机后可在智能终端上显示记录数据。 (6) 考勤管理APP可以对继电器和蜂鸣器进行远程控制

而在APP端,就需要开发相应的界面来显示考勤记录数据以及实现对继电器和蜂鸣器的远程控制按钮等功能,这部分一般使用Android或iOS开发技术,比如Android开发中使用Java或Kotlin编写界面逻辑和蓝牙通信代码。

总之,打造这个STM32指纹考勤机涉及到硬件和软件多方面的知识和技术,希望这篇分享能给大家带来一些启发。后续有时间再和大家深入聊聊APP开发部分。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 11:21:46

法律大模型实战指南:LLM智能体如何破解法律AI三大难题

本文全面综述法律领域LLM智能体技术,分析其如何通过规划、记忆和工具调用能力解决独立模型面临的幻觉、信息滞后及可验证性不足等挑战。文章系统梳理技术转型路径,构建法律智能体应用分类体系,探讨专门评估方法,并识别开放性挑战&…

作者头像 李华
网站建设 2026/8/4 2:50:10

基于GPU加速的大数据OLAP查询优化实践

基于GPU加速的大数据OLAP查询优化实践:从原理到落地的全流程指南 一、引言:当OLAP遇到“速度瓶颈”——你经历过吗? 1.1 一个真实的痛点:大促后的“查询焦虑症” 去年双11大促结束后,我在电商公司的分析师朋友小张遇到…

作者头像 李华
网站建设 2026/8/7 17:40:26

一文搞懂大模型剪枝

一、什么是大模型剪枝? 通俗来讲,大模型剪枝就是识别并移除模型中“没用”或“用处极小”的部分,这些被移除的部分就是模型的“冗余成分”。 我们可以把大模型想象成一个精密的工厂,里面有无数条生产线(对应模型的层、…

作者头像 李华