这个智能门锁项目支持多种开锁方式,包括密码开锁、指纹开锁和手机App蓝牙开锁,并且支持OTA升级功能。另外,用户交互方面,还提供了语音播报提示和键盘背光功能。
项目使用的主控芯片是乐鑫的ESP32-C3,这款芯片支持WIFI和蓝牙功能,并且有配套的开发框架ESP-IDF,其中集成了FreeRTOS,蓝牙和WIFI驱动,甚至还提供了OTA升级相关的API,除此之外功耗控制的也不错,所以能够很好的满足智能门锁的功能需求。
接下来,我具体介绍一下各项功能,首先是基本的开锁功能 第一种开锁方式是密码开锁,我们用的键盘是一个12键的电容触摸键盘,它然后通过IIC协议与主控进行通信,并且支持中断通知。具体用法就是,当有按键被触摸时,这个键盘的控制芯片就会拉高它的中断引脚的电平,通知主控芯片,然后主控芯片就可以通过IIC读取按键的编号了。
程序中,我们配置了一个外部中断,用于接收键盘的中断信号,然后又创建了一个任务,用于读取按键编号。这个外部中断的ISR和任务之间,通过消息通知进行同步。具体来讲就是,这个任务平时会以阻塞的状态等待消息通知,一旦有按键被触摸,这个外部中断的ISR就会向该任务发送通知,然后这个任务就会通过IIC读取按键的编号。
读取到按键编号后,就可以执行具体的处理逻辑了。这里我们规定,用户输入密码要以#结尾,所以这里每读取一个按键后都会进行判断,如果不是#就先缓存起来,如果是#号,就说明用户输入密码完毕,之后就会和之前录入的的密码进行比对,对比成功的话,就直接通过GPIO驱动电机开锁。这就是密码开锁的基本流程。
然后再说一下第二种开锁方式——指纹开锁,这里我们使用了一个一体化的指纹模组,它内部集成了指纹采集传感器和指纹识别芯片,并且提供了指纹录入,指纹识别等功能。 这个模组通过UART与主控进行通信,并且也提供了中断通知的功能,传感器只要检测到指纹,就会通过中断引脚通知主控芯片,主控芯片只需通过UART向该模组发送特定指令,即可完成指纹录入、指纹比对等功能。
程序中,我们也是配置了一个外部中断,并且创建了一个任务,然后使用消息通知机制,对两者进行同步。具体来讲就是,这个任务平时也会以阻塞的状态等待消息通知,一旦指纹模块识别到指纹,这个外部中断的ISR就会向该任务发送通知,然后这个任务就可以通过UART向指纹模块发送特定指令查询指纹比对结果了,如果指纹比对成功,就通过GPIO驱动电机开锁,这就是指纹开锁的基本流程。
最后是第三种开锁方式——手机App蓝牙开锁,这部分功能主要依赖于ESP-IDF提供的蓝牙驱动,它提供了丰富的API,包括蓝牙配对、收发数据等等。这个驱动使用起来,也很简单,只需根据需要编写相应的回调函数即可。手机APP在完成配对后,可以向门锁发送特定的指令,完成开锁、以及录入密码、录入指纹以及OTA升级等功能。
以上就是所有的开锁方式。
下面我再介绍一下OTA升级的功能,由于ESP-IDF本身就提供了对OTA的支持,因此这个功能实现起来也非常容易。 我们创建了一个任务专门用于OTA升级,这个任务在平时会以阻塞的状态等待任务通知,当手机APP检测到有新版固件后,就可以通过蓝牙向门锁发送OTA升级的指令,蓝牙回调函数接收到OTA指令后,就会向这个OTA任务发送通知,这个任务收到通知后,就会连接WIFI,然后调用ESP-IDF提供的esp_https_ota函数,从我们指定的后台服务器,下载新版本的固件,下载成功后,再调用esp_restart,重启系统。这样就完成了OTA升级。
关于OTA升级,还需要补充一点,使用ESP-IDF提供的OTA功能时,需自己配置分区表,该分区表至少要包括两个 OTA 应用程序分区,分别是 ota_0 和 ota_1,和一个OTA数据分区 ota_data,ota_0和ota_1分别用于存储当前版本的固件和将来要下载的新版固件,而ota_data分区用于存储每次升级后,应该从哪个ota分区加载程序,这样一来,每次升级重启后,Bootloader就会根据ota_data中存储的值,去加载新版固件。