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

嘿,各位技术爱好者们!今天咱们来聊聊怎么搞一个基于 STM32 的指纹考勤机,而且还附带超详细的程序源码、PCB 电路图以及原件清单哦,简直是 DIY 神器!
功能大揭秘
- 用户操作按键:就像你玩游戏按手柄一样,这个考勤机上的按键可以让用户轻松录入新用户信息、删除不需要的用户数据,甚至一键清空所有数据,还能查看历史考勤记录。这功能,是不是很方便?
- 继电器模拟指纹开锁:想象一下,当指纹识别成功,继电器“哒”的一声,模拟门就打开了,是不是有点科幻片的感觉?
- 按键控制蜂鸣器报警:万一有啥异常情况,按个键,蜂鸣器就“滴滴滴”地响起来,这就是我们的报警器啦。
- 实时时钟记录考勤时间:这个考勤机自带一个实时时钟,就像个小秘书,精确记录每位用户的考勤时间,一分一秒都不会差。
- APP 显示记录数据:通过考勤管理 APP 连接考勤机,在手机或者平板这些智能终端上就能清楚看到考勤记录数据,随时随地掌控考勤情况。
- APP 远程控制继电器和蜂鸣器:更厉害的是,在 APP 上还能远程控制继电器和蜂鸣器,不管你在办公室哪个角落,都能轻松操作。
程序源码解读
用户操作按键部分
// 假设我们定义按键对应的 GPIO 端口
#define KEY_GPIO_PORT GPIOA
#define KEY1_PIN GPIO_PIN_0
#define KEY2_PIN GPIO_PIN_1
// 初始化按键 GPIO
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = KEY1_PIN | KEY2_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct);
}
// 检测按键是否按下
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
if (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(20); // 消抖
if (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET)
{
while (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET); // 等待按键释放
return 1;
}
else
return 0;
}
else
return 0;
}
这里呢,我们先定义了按键对应的 GPIO 端口和引脚,然后通过 KEYInit 函数来初始化这些 GPIO 口为输入模式,并上拉电阻。KEYScan 函数就是用来检测按键是否按下的,还做了简单的消抖处理,这样就不会因为按键抖动导致误操作啦。
继电器模拟指纹开锁
// 定义继电器对应的 GPIO 端口
#define RELAY_GPIO_PORT GPIOB
#define RELAY_PIN GPIO_PIN_5
// 初始化继电器 GPIO
void RELAY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = RELAY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(RELAY_GPIO_PORT, &GPIO_InitStruct);
}
// 控制继电器打开
void RELAY_Open(void)
{
HAL_GPIO_WritePin(RELAY_GPIO_PORT, RELAY_PIN, GPIO_PIN_RESET);
}
// 控制继电器关闭
void RELAY_Close(void)
{
HAL_GPIO_WritePin(RELAY_GPIO_PORT, RELAY_PIN, GPIO_PIN_SET);
}
在这部分代码里,我们初始化继电器对应的 GPIO 口为推挽输出模式,速度设置为高频。RELAYOpen 和 RELAYClose 函数就分别用来控制继电器的打开和关闭,实现模拟指纹开锁的功能。
按键控制蜂鸣器报警
// 定义蜂鸣器对应的 GPIO 端口
#define BEEP_GPIO_PORT GPIOC
#define BEEP_PIN GPIO_PIN_8
// 初始化蜂鸣器 GPIO
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = BEEP_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStruct);
}
// 控制蜂鸣器响
void BEEP_On(void)
{
HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_PIN, GPIO_PIN_RESET);
}
// 控制蜂鸣器停
void BEEP_Off(void)
{
HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_PIN, GPIO_PIN_SET);
}
蜂鸣器的初始化和控制与继电器类似,也是设置 GPIO 口为推挽输出。BEEPOn 和 BEEPOff 函数负责让蜂鸣器响或者停止,通过按键就能轻松控制报警啦。
实时时钟记录考勤时间
// 这里简单示意一下实时时钟初始化(实际代码会更复杂)
void RTC_Init(void)
{
RTC_InitTypeDef RTC_InitStruct;
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
__HAL_RCC_RTC_ENABLE();
RTC_InitStruct.AsynchPrediv = RTC_AUTO_1_SECOND;
RTC_InitStruct.OutPut = RTC_OUTPUT_DISABLE;
HAL_RTC_Init(&hrtc, &RTC_InitStruct);
// 设置初始时间和日期
RTC_TimeStruct.Hours = 0;
RTC_TimeStruct.Minutes = 0;
RTC_TimeStruct.Seconds = 0;
HAL_RTC_SetTime(&hrtc, &RTC_TimeStruct, RTC_FORMAT_24);
RTC_DateStruct.WeekDay = RTC_WEEKDAY_MONDAY;
RTC_DateStruct.Month = RTC_MONTH_JANUARY;
RTC_DateStruct.Date = 1;
RTC_DateStruct.Year = 0;
HAL_RTC_SetDate(&hrtc, &RTC_DateStruct, RTC_FORMAT_BIN);
}
// 获取当前时间
void Get_Current_Time(RTC_TimeTypeDef *sTime, RTC_DateTypeDef *sDate)
{
HAL_RTC_GetTime(&hrtc, sTime, RTC_FORMAT_24);
HAL_RTC_GetDate(&hrtc, sDate, RTC_FORMAT_BIN);
}
实时时钟这部分稍微复杂点,初始化时要设置异步预分频器等参数,还要设置初始时间和日期。GetCurrentTime 函数就是用来获取当前的时间和日期,这样就能准确记录考勤时间啦。
APP 相关部分
APP 这边主要涉及到与考勤机的通信,一般可以通过蓝牙或者 WiFi 来实现。以蓝牙为例,在 STM32 端需要配置蓝牙模块相关的串口通信。
// 假设使用 USART1 与蓝牙模块通信
void USART1_Init(void)
{
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
// PA9(TX) 复用推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA10(RX) 浮空输入
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitStruct.BaudRate = 9600;
USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
USART_InitStruct.StopBits = USART_STOPBITS_1;
USART_InitStruct.Parity = USART_PARITY_NONE;
USART_InitStruct.HwFlowCtl = USART_HWCONTROL_NONE;
USART_InitStruct.Mode = USART_MODE_TX_RX;
HAL_USART_Init(&husart1, &USART_InitStruct);
}
// 发送数据到蓝牙模块
void USART1_SendData(uint8_t *pData, uint16_t Size)
{
HAL_USART_Transmit(&husart1, pData, Size, 1000);
}
这里初始化了 USART1 用于与蓝牙模块通信,设置好波特率、数据位等参数。USART1_SendData 函数就是用来把考勤记录数据发送给 APP 的。
PCB 电路图与原件清单
PCB 电路图设计是个精细活,要把各个模块合理布局,保证信号传输稳定。比如按键、继电器、蜂鸣器、实时时钟模块以及蓝牙模块等都要安排得明明白白。

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

原件清单大概会包括 STM32 开发板、指纹识别模块、继电器、蜂鸣器、实时时钟模块、蓝牙模块,还有一些电阻、电容等小元件。具体的型号和参数,要根据实际的设计需求来选择。
总之,通过这些代码和硬件设计,咱们就能打造出一个功能强大的 STM32 指纹考勤机啦,自己动手,乐趣无穷,还能学到超多知识,赶紧动手试试吧!
更多推荐



所有评论(0)