网络卡顿无法加载图片请访问备用网址

ESP32 物联网项目 (flowus.cn)

一、总设计思路

1.1概述

手机作为客户端,ESP32及其外设作为服务端,客户端与服务端进行通信,实现通过手机对板载LED灯进行各种操作。

1..2客户端与服务端通信

客户端与服务端通过TCP/IP协议进行通信,TCP协议为面向连接的可靠通信,使用TCP_Socket套接字确保连接的唯一性。

image1.png

图1.2 客户端与服务端TCP通信流程图

Socket()进行套接字资源的初始化,bind()为服务端绑定本地IP和端口,listen()为服务端设置最大连接数,accept()为阻塞函数,等待客户端连接,connect()为客户端开始与服务器建立连接,close()进行关闭TCP连接。

二、客户端软件设计

考虑到软件的复杂程度和开发时间,客户端软件开发平台选择AppInventor,通过图形化编程将各个功能模块进行拼接。

2.1 组件设计

image2.png

​ 图2.1.1 Screen操作界面

image3.jpeg
                                                            图 2.1.2Screen2操作界面
image4.png

​ 图 2.1.3 Screen2非可视组件展示

image5.png

​ 图2.1.4Snake_Screen开发界面

  1. 7×7点灯按钮阵列:用来实现操控板子对应49个灯的亮灭

  2. Clear清空按钮:实现将灯全部熄灭

  3. R色值调整数字滑动条:调整灯的R色值

  4. G色值调整数字滑动条:调整灯的G色值

  5. B色值调整数字滑动条:调整灯的B色值

  6. 亮度调整数字滑动条:调整灯的亮度

  7. 帧模式-画面帧按钮:实现进入“画面帧”模式⑪⑫⑬⑭⑮

  8. 帧模式-点帧按钮: 实现进入“点帧”模式

  9. 模式选择下拉框:用来选择更多模式

  10. 调试信息显示标签若干:用于观察各隐式参数以便调试程序

  11. 收到服务器发来的的信息标签:用于接受服务器发来的消息

  12. TCP组件:用来实现和ESP32芯片进行TCP通信

  13. 计时器1:通过计时器构成循环逻辑结构,让计时器循环发送模式和灯的相关参数

  14. 状态机计时器:用以刷新灯的参数和更新调试信息标签中的文本

  15. Screen1、Screen2、Snake_Screen:三个屏幕,用来切换不同操作页面

2.2 自定义过程设计

自定义过程是APP Inventor提供的类似于函数的编程设计,用来定义一个需要重复使用的过程

  1. 连接

    连接的逻辑设计是检测设备是否与服务器相连,若没有,则调用TCP组件,传入服务器IP和端口号进行连接操作。

image6.png

图2.2.1 自定义过程-连接

  1. 统一颜色

    对客户端49个点灯按钮进行统一颜色操作,这里没有给服务端发送清空命令。从这一个自定义过程的编写也能看出APPInventor在软件开发上的不足:无法对同类组件进行类管理,需要独立编写每个按钮对象的操作,而不是在循环中对按钮n进行操作的编程,这使得代码的编写变得繁琐。

image7.png

图2.2.2 自定义过程-统一颜色(部分展示)

  1. 当点帧或画面帧模式开启时,是这个自定义过程有效的必要条件,这个自定义过程会向一个全局列表中加入49个点灯按钮按下时的位置、亮度、R、G、B信息,并传入全局列表中。

image8.png

图2.2.3 自定义过程-帧

  1. 允许点灯

    启用49个点灯按钮。

  2. 禁止点灯

    禁用49个点灯按钮。

设置这个过程的目的是防止客户端在调用TCP组件进行发送消息未完成时又调用该组件发送消息,使程序崩溃。

2.3 组件配合

组件配合完成客户端的人机交互以及客户端与服务端的通信。

image9.jpeg

图2.3 组件配合图

2.4 细节优化

① TCP组件调用冲突的处理

由于有多个组件能够调用TCP组件对服务器发送信息,因此需要避免同时调用TCP组件造成冲突,需要进行调用前的限定。

49个点灯按钮、clear、计时器1按钮都能对TCP组件进行调用操作,因此需要做调用条件的限定。

Clear按钮和49个点灯按钮只有在点灯模式才能够调用TCP组件发送数据;计时器1只能在非点灯模式下进行信息的发送。而对于49个点灯按钮来说,为了防止同时按到两个按钮造成冲突,设计了当按下按钮时马上调用“禁止点灯”让点灯按钮全部禁用,而在发送完信息之后再次打开。

此外,还有其他防止冲突的限定。如开启画面帧模式或点帧模式时,在“完成”按钮点击之前,调用“允许点灯”,在点成点击之后,调用“禁止点灯”,画面帧和点帧按钮无法同时启用等。

②TCP组件调用过快的处理

在测试中发现TCP通信时而断开的问题。查阅了TCP通信的协议后,发现如果过快调用TCP发送数据违背了通信协议,TCP是面向连接的通信协议,每当客户端发送出一个字节的数据时,服务端需要回复客户端已收到的信息,然后客户端继续发送数据。如果计时器1频率过快地发送信息,会造成服务端来不及回复信息,TCP组件处于等待回复的状态,而客户端又开始调用TCP组件进行发送数据的操作,从而造成客户端崩溃。因此,设计了让服务端向客户端发送“listening”和“received”。当服务端收到信息时会向客户端发送”received”,从而让客户端以此为依据不再向服务端发送信息,当服务端处理完上一次接受的数据包后,发送”listening”,客户端又可以进行调用计时器1进行发送信息。但是实际调试时仍然出现客户端崩溃的问题,说明以上操作并未完全解决问题,计时器1仍然过快地发送数据造成客户端崩溃。新问题在于在服务端发送来“listening”时计时器1仍然频繁发送数据包,从而造成客户端崩溃,而实际上只需要在”listening”状态让计时器1只发送一次数据包即可,因此在客户端软件中加入了一个用以验证只发一次数据的变量,当服务端处于”listening”状态的时候这个变量值为1,当客户端发送一次数据后这个变量马上置0,在下一个”listening”状态时再次置1,从而形成了一个闭环的变量更新机制,让计时器1具有类似于触发器的功能,在特定场景才能触发发送数据。

三、服务端软件设计

服务端软件开发平台使用Thony,语言使用Micropython,让开发效率大大提升。通过Thony对ESP32烧录Micropython的esp32固件,从而可以在ThonyIDE上进行python程序的编写并烧录到esp32中实行实时调试或脱机运行。

3.1 功能设计

服务端需要完成wifi配置入网,并通过TCP连接绑定IP和端口,开始进行监听,直到与客户端建立通信。

3.2 模块

①machine模块:Micropython标准库,用来引入machine 的pin对象,管理输出引脚;

②neopixel模块:第三方库,控制WS2812 LED的RGB三色,WS2812 LED对于时序有比较严格的要求,使用neopixel可以让开发者不用专注于灯带的底层时序;

③ time 模块:Micropython标准库,用来实现时延;

④ network模块:Micropython标准库,用以配置网络;

  1. socket模块:Micropython标准库,调用socket资源进行TCP通信;

  2. re 模块:Micropython标准库,用来进行正则表达式相关操作;

  3. random模块:,Micropython标准库,用以产生随机数;

  4. global_var模块:自定义模块,用以存储跨模块的全局变量;

  5. Dictionary模块:自定义模块,用以储存需要用到的点灯模板;

  6. Mode模块:自定义模块,用来根据不同模式进行不同点灯操作;

  7. Snake模块:自定义模块,用来专门存储贪吃蛇代码;

  8. main主模块:自定义模块,用来运行主函数并调用其他模块。

3.3 函数设计

image10.jpeg

_tcp_server_control_led()::建立TCP-socket连接,等待客户端连接;

set_value(key,value)将值存入字典中,可以跨模块调用,因为子模块无法对主模块进行import操作,所以需要这样一个中介子模块;

get_value(key)提取出跨模块全局变量的值;

handle_request(client_socket):进行接受客户端数据,对数据进行正则表达式匹配提取出各个需要的参数,运用set_value(key,value)进行跨模块存储,并判断模式;

_mode(mode_para):根据mode_para参数进行模式选择;

_mode_init():提出get_value(key)中的参数,如亮度、R、G、B、灯的位置、贪吃蛇模块中蛇移动的方向等;

四、功能测试

4.1功能介绍

1.1基本功能

指定任意位置点灯,调整灯的R、G、B、亮度。

1.2 点灯进阶-点帧

进入点帧模式后,记录按下每个按钮时的位置、亮度、R、G、B信息,存入列表中,按下“完成“按钮后再用计时器1逐个发送列表中的值。

1.3 点帧进阶-画面帧

进入画面帧模式后,记录按下每个按钮时的位置、亮度、R、G、B信息,如果按下“下一帧“按钮,则会存储一个”location50“的分割标志,记为一次画面,存入列表中,再将列表中的所有值转换为文本一次性发送给服务端,服务端收到信息后,根据换行回车符将收到的文本信息转换成列表,并根据该列表进行点灯操作。

1.4 下拉框模式选择

下拉框模式选择可以选择一些设置好的模板。

  1. 沙滩:显示涌动的金色沙滩,可以调整亮度;

  2. 彩虹:显示五彩斑斓的彩虹,可以调整亮度;

  3. 星星:循环随机点亮十个点,颜色为绿色,可以调整亮度;

  4. 文字:循环显示“南京理工NJUST“字样,可以调整亮度;

  5. 时间:客户端向服务端循环发送时间,服务端实时显示时间,可以调整亮度;

  6. led:点亮49个led灯,可以调整R、G、B、亮度;

  7. 眼睛:播放眨眼动画,可以调整R、G、B、亮度。

1.5 贪吃蛇模式

进入贪吃蛇游戏,手机端充当遥控器,控制蛇的上下左右移动,在游戏初始化时手机端发送init_flag=0,然后这个变量马上变成1,当游戏结束时服务端发来游戏结束标志,此时弹出对话框,如果点击重新开始会再次发送init_flag=0,重新开始游戏。

4.2各功能测试

经测试和反复调试,各个功能运行正常,主要功能演示图片如下:

image11.jpeg

图 2.1 点灯

image12.jpeg

图 2.2 沙滩

image13.jpeg

图2.3 彩虹

image14.jpeg

图 2.4 星星

image15.jpeg

图2.5 文字

image16.jpeg

图 2.6 时间

image17.jpeg

图2.7led

image18.jpeg

图 2.8 眼睛

image19.jpeg

图 2.9 贪吃蛇