这个门铃,分为门铃主机、室内接收器和手机APP三个部分,我们部门主要负责主机和接收器的开发。主机上有一个门铃按键、一个摄像头、一个麦克风,还有一个扬声器。接收器上有一个扬声器和两个音量按键,两部分通过LoRa进行通信。 这个门铃的使用逻辑很简单,就是当有人按下门铃时,室内接收器就会响铃,同时手机APP会收到一个通知,然后用户可以使用手机APP与访客进行语音通话,也可以查看门外的实时画面。
下面我介绍一下项目的硬件选型,门铃的主控选用的是乐鑫的ESP32-S3,这个芯片集成了WIFI、蓝牙,并且提供了I2S音频接口和DVP摄像头接口,所以很符合项目的需求,然后摄像头选用的是OV2640(使用DVP接口),音频编解码芯片使用的是ES8311(使用I2S接口),功放芯片选择的是NS4105B。 接收器的主控选择的是ESP32-C3,然后音频编解码芯片和功放芯片与主控都是相同的。
然后我再介绍一下这个项目的实现细节 首次启动门铃主机时,需要进行WIFI配网操作,这部分逻辑是使用ESP-IDF提供的配网API实现的,它提供了两种配网方式,一种是通过热点,另一种是通过低功耗蓝牙,我们选择的是第二种。这个配网API实现了配网所需的所有步骤,包括建立蓝牙连接、接收WIFI配置信息,保存WIFI配置信息等等。配网成功后,主机就会连接WIFI,然后向后台的MQTT服务器的一个topic-A发送一条Ready数据,之后手机APP就会显示门铃已就绪,同时还会订阅另一个topic-B,用于接收后续手机APP端发送的指令。
然后就是日常使用,当有人按下门铃按钮时,门铃会执行以下逻辑 首先通过LoRa向室内的接收器,发送通知,接收器收到通知后就会响铃 然后还会向MQTT服务器推送一条消息,此时用户的手机APP就会收到一条通知:有人按门铃 最后主机本身也会响铃,主要是告诉访客,门铃已经响应了
手机APP端再收到通知后,可以打开主机的摄像头和麦克风,查看访客身份,这功能实现逻辑也比较简单。首先手机APP会MQTT服务器发送一个开启摄像头和麦克风的指令,发往的就是主机订阅的那个topic。当主机收到这个指令后,就会开始手机摄像头和麦克风数据,并将数据推送到一个WebSocket服务器,然后手机端就能获取门外的音视频数据了。另外,手机端app也可以手机麦克风和访客进行实时对讲,此时手机app会将mic数据推送到web服务器,并进一步推送到主机,主机在收到收据后,会使用扬声器播放。
以上就是核心功能的实现逻辑,除此之外我们还实现了OTA升级 这部分功能也是使用ESP-IDF提供的相关API实现的。我们创建了一个任务专门用于OTA升级,这个任务在平时会以阻塞的状态等待任务通知,当手机APP检测到有新版固件后,就会向MQTT服务器发送OTA升级的指令,门铃这边收到OTA指令后,就会向这个OTA任务发送通知,这个任务收到通知后,就会调用ESP-IDF提供的esp_https_ota函数,从我们指定的后台服务器,下载新版本的固件,下载成功后,再调用esp_restart,重启系统,这样就完成了OTA升级。
然后还需要补充一点,使用ESP-IDF提供的OTA功能时,需自己配置分区表,该分区表至少要包括两个 OTA 应用程序分区,分别是 ota_0 和 ota_1,和一个OTA数据分区 ota_data,ota_0和ota_1分别用于存储当前版本的固件和将来要下载的新版固件,而ota_data分区用于存储每次升级后,应该从哪个ota分区加载程序,这样一来,每次升级重启后,Bootloader就会根据ota_data中存储的值,去加载新版固件。