当前报道:【笔记】写一个情人节主题“物联网心跳灯”
发布时间:2023-02-15 02:53:19 来源:哔哩哔哩

简介


(资料图)

简单实现一个基于Android和ESP32的公网UDP通信的“心跳灯”。能实现任意地点任意人员远程用手机软件控制灯光跳动,并且尽实现灯光跳动与动画同步。后期理论上可实现手机接入心率传感器实现灯光与心跳同步。这里只进行简单demo实现及技术路线记录。

控制软件下载地址:https://wwks.lanzouy.com/igtHa0nlnpbe

只要手机联网正常,安装后即可随意控制实验板上的灯。

Demo效果

此时手机在5G网络下,并非局域网,能看到反应还是很快的,延迟很低,局域网模式下延迟会更低。LED灯为临时用实验板搭建的,因为是临时起意,并未进行PCB产品化设计和打样。

硬件程序设计

主控开发板使用的比较火的ESP32,身边有一块刚好就用了。当然这个程序不需要这么高性能的开发板。

原本设计是使用阿里云物联网平台来当服务器,这也是目前DIY玩家的主流做法,但是我尝试之后发现Android发送指令后,到硬件有相应,延迟有1秒左右,很明显达不到我的需求。

于是考虑到家里和办公室都有公网IP,采用了把ESP32当作UDP服务器的方案,这样Android端发送的数据就能点对点的传输到硬件设备上。UDP的最大好处就是延迟低,无需经过TCP的三次握手协议,一般网络游戏就是通过UDP协议传输数据的,但是这种协议只负责发送数据,不管最后到底收没收到,所以可靠性较低。考虑到本程序和游戏一样即使丢包也不会造成严重后果,所以选择了该方案。

ESP32程序设计:

整个程序使用PWM对LED进行亮度控制,PIN5引脚作为输出引脚,从程序里能看到PWM频率是5000Hz。没用DC调光主要是因为LED的亮度变化和电压变化并不是线性相关的,可能渐变达不到理想效果。

程序搭建了一个UDP的服务器,监听1234端口,接收到“1”就会对输出引脚进行操作。当然这里的识别信号可以换成随意的Key,会更加安全一点。再将该ESP32的1234端口映射到路由器的任意端口即可,即可实现从公网传输UDP数据。

Android端软件设计

Android端使用Lotties框架加载了一个心跳的动画,这个之前有写操作步骤,然后设置点击及播放一次就行,当然,整体速度需要和LED渐变的速度相同步,会比较好看。

点击事件核心代码:

就是点击播放,然后加入了一个短暂的震动,提升点击手感,最后是发送UDP数据的方法。方法具体实现:

UDPClient是封装好的UDP请求客户端:

这里要记得网络请求需要再非主线程进行,否则程序会闪退。比较推荐的方案是AsyncTask异步任务类,也可以自己新建线程运行。