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

嘿,各位技术爱好者们!今天咱们来聊聊怎么搞一个基于 STM32 的指纹考勤机,而且还附带超详细的程序源码、PCB 电路图以及原件清单哦,简直是 DIY 神器!

功能大揭秘

  1. 用户操作按键:就像你玩游戏按手柄一样,这个考勤机上的按键可以让用户轻松录入新用户信息、删除不需要的用户数据,甚至一键清空所有数据,还能查看历史考勤记录。这功能,是不是很方便?
  2. 继电器模拟指纹开锁:想象一下,当指纹识别成功,继电器“哒”的一声,模拟门就打开了,是不是有点科幻片的感觉?
  3. 按键控制蜂鸣器报警:万一有啥异常情况,按个键,蜂鸣器就“滴滴滴”地响起来,这就是我们的报警器啦。
  4. 实时时钟记录考勤时间:这个考勤机自带一个实时时钟,就像个小秘书,精确记录每位用户的考勤时间,一分一秒都不会差。
  5. APP 显示记录数据:通过考勤管理 APP 连接考勤机,在手机或者平板这些智能终端上就能清楚看到考勤记录数据,随时随地掌控考勤情况。
  6. 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 口为推挽输出模式,速度设置为高频。RELAYOpenRELAYClose 函数就分别用来控制继电器的打开和关闭,实现模拟指纹开锁的功能。

按键控制蜂鸣器报警

// 定义蜂鸣器对应的 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 口为推挽输出。BEEPOnBEEPOff 函数负责让蜂鸣器响或者停止,通过按键就能轻松控制报警啦。

实时时钟记录考勤时间

// 这里简单示意一下实时时钟初始化(实际代码会更复杂)
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 指纹考勤机啦,自己动手,乐趣无穷,还能学到超多知识,赶紧动手试试吧!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐