第三期测评活动:免费申请《OpenHarmony 物联网开发应用教程》实体书

2026-06-30 16:39:23浏览29
29
Star

福利时刻:免费送 5 本

为回馈广大硬件爱好者,本次送出5 本正版实体书。参与方式:

1.在文章评论区写下你的申请理由

2.添加小助手微信(opensrc_KLin),将联系方式发给小助手;

选取 5 位朋友直接包邮送!

书籍信息

书名:《OpenHarmony 物联网开发应用教程》

智能门锁模块介绍

智能门锁模块电路图如图5-28所示。

图5-28 智能门锁模块电路图

1.案例设计

本案例将演示如何在启航开发板上进行智能门锁模块的开发。本案例为智能门禁系统,通过UART采集指纹识别模块的数据,并与注册的指纹进行比对,如果符合则打开门

2.软件设计

本案例主要是通过采集指纹识别模块的数据,与注册的指纹进行比对来控制对应的舵机,另外通过按键与LED的配合来完成指纹的录入与删除。软件设计步骤如下:

(1)硬件分析

启航KP_IOT的智能门锁模块包括一个指纹识别模块HLK-ZW651、一个舵机、一个按键和一个LED,原理图如图5-29所示,指纹识别模块HLK-ZW651连接的是GPIO-05和GPIO-06引脚,使用的是UART通信,指纹模块激活信号连接的是GPIO-02引脚,使用的是GPIO输入控制;舵机连接的是GPIO-07引脚,使用的是GPIO输出控制;按键连接的是GPIO-14引脚,使用的是GPIO输入控制;LED连接的是GPIO-13引脚,使用的是GPIO输出控制,高电平点亮,低电平熄灭。

图5-29 智能门锁模块原理图

(2)软件流程设计

智能门禁系统软件的流程如图5-30所示,首先对硬件MQ-2烟雾传感器、蜂鸣器和LED进行初始化,然后周期性地获取烟雾传感器所采集的数据进行分析,如果采集到的电平值大于2.5V,说明烟雾的浓度已经超标,存在火灾的可能,驱动蜂鸣器报警,并点亮LED灯,如果采集到的电平值小于等于2.5V,说明烟雾的浓度正常,蜂鸣器需要停止,LED灯需要熄灭。

图5-30 智能门禁系统软件流程图

软件代码

消防安全检测系统按照前面的模块设计分为五部分代码。

(1)主模块代码

主模块代码调用各模块接口完成各模块初始化,调用ZW651模块接口完成指纹验证功能,并创建按键控制注册和删除指纹线程。

代码如下:

void lock_module_demo(void)

{

    /* 智能门锁模块初始化 */

LockMotorInit();

LockKeyGpioInit();

LockLedInit();

/* 初始化ZW651模块并创建相应的UART通信和指纹验证任务 */

lock_uart_demo();

    /* 设置线程属性 */

    osThreadAttr_t attr;

    attr.name = "LockKeyProcessTask";

    attr.attr_bits = 0U;

    attr.cb_mem = NULL;

    attr.cb_size = 0U;

    attr.stack_mem = NULL;

    attr.stack_size = 1024 * 4;

    attr.priority = 25;

    /* 创建按键控制注册和删除指纹线程 */

    osThreadId_t threadIDKey = osThreadNew((osThreadFunc_t)LockKeyProcessTask, NULL, &attr);

    if (threadIDKey == NULL)

    {

        printf("Falied to create LockKeyProcessTask!\r\n");

return;

    }

}

(2)ZW651模块代码

ZW651模块代码分成三个部分,第一部分是模块初始化代码,第二部分是指纹处理代码,第三部分是ZW651模块任务接口代码。

l模块初始化代码

根据智能门锁模块原理图5-27,指纹识别模块HLK-ZW651连接的是GPIO-05和GPIO-06引脚,使用的是UART通信,需要将引脚复用为UART功能并初始化UART,指纹模块激活信号连接的是GPIO-02引脚,使用的是GPIO输入控制,需要复用为GPIO输入功能。

代码如下:

/* ZW651 传感器功能初始化 */

void ZW651Init(void)

{

    /* 初始化验证指纹触发信号*/

u32 ret = IoTGpioSetFunc(ZW651_NAME_GPIO_2, IOT_GPIO_FUNC_GPIO_2_GPIO);

    if (ret != KP_ERR_SUCCESS) {

        printf("IoTGpioSetFunc failed :%#x \r\n",ret);

        return;

    }

    ret = IoTGpioSetDir(ZW651_NAME_GPIO_2, IOT_GPIO_DIR_IN);

    if (ret != KP_ERR_SUCCESS) {

        printf("IoTGpioSetDir failed :%#x \r\n",ret); 

        return;

    }

// 初始化GPIO-05引脚

    ret = IoTGpioInit(ZW651_NAME_GPIO_5);

if(ret != KP_ERR_SUCCESS){ 

        printf("IoTGpioInit failed :%#x \r\n",ret);

return;

    }

/* 设置复用为UART功能 */

ret = IoTGpioSetFunc(ZW651_NAME_GPIO_5, IOT_GPIO_FUNC_GPIO_5_UART1_RXD);

if(ret != KP_ERR_SUCCESS){ 

        printf("IoTGpioSetFunc failed :%#x \r\n",ret);

return;

    }

// 初始化GPIO-06引脚

    ret = IoTGpioInit(ZW651_NAME_GPIO_6);

if(ret != KP_ERR_SUCCESS){ 

        printf("IoTGpioInit failed :%#x \r\n",ret);

return;

    }

ret = IoTGpioSetFunc(ZW651_NAME_GPIO_6, IOT_GPIO_FUNC_GPIO_6_UART1_TXD);

if(ret != KP_ERR_SUCCESS){ 

        printf("IoTGpioSetFunc failed :%#x \r\n",ret);

return;

    }

    /* UART属性参数 */

IotUartAttribute uart_attr = {

        /* 波特率: 57600 */

        .baudRate = ZW651_UART_BAUD_RATE,

        /* 数据位数: 8bits */

        .dataBits = 8,

        /* 停止位数:2bit */

        .stopBits = 2,

        .parity = 0,

    };

    /* UART初始化 */

    ret = IoTUartInit(ZW651_UART_IDX_1, &uart_attr);

if (ret != KP_ERR_SUCCESS) {

        printf("IoTUartInit failed :%#x \r\n",ret);

        return;

    }

printf("----- ZW651Init success! -----\r\n");

}

图5-31 智能门禁系统运行结果