福利时刻:免费送 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 智能门禁系统运行结果
