ESP32连接TCP服务端并显示数据内容
简介
这两年AI异常火爆,我也想把AI跟物联网结合一下,于是呢目前的方案是这样的:MCU通过麦克风采集音频,通过wifi传给PC,通过PC的服务端解析成文字后和LLM对话,服务端将LLM的回复再发送给MCU。这一次我们先来实现MCU获取PC服务端的信息并在MCU的显示屏上显示。
正好,ESP32是一款专为物联网应用打造的mcu,低功耗、wifi、蓝牙等等功能它都有,而且作为一款比较热门的国产芯片,资料也相对较多,于是非常自然地就选择了这款芯片。这篇文章的内容也会是更加偏向嵌入式一点的,让我们开始吧。
ESP32环境简介
本次使用的ESP32是某宝上淘来的便宜模块,开发板各引脚定义如下图:
显示屏是个0.96寸oled屏幕,SSD1306驱动,IIC协议,很常见。
开发环境使用的是VSCODE+ESP-IDF,搭建过程就不多赘述,可以在网上找到较多教程。新建一个工程模板,然后开始扒例程的代码。
由于嵌入式的代码有一些细节全部展示的话太过繁琐,所以下面主要代码都通过截图展示,当然整个工程的代码我也会共享出来,如果感兴趣请直接下载。
ESP32显示文字
文字显示部分非常简单,参考ESP-IDF自带的例程:i2c_oled_example。简单浏览了一下,这个例程使用了esp官方的lcd、i2c库以及开源的lvgl显示框架,很容易使用。
先看下i2c例程的目录
按照例程的结构,新建一个sample工程,名字随意,然后在里面新建一个components目录,ESP-IDF会自动将添加进去的文件给编译进去,由于我不需要sh1107的驱动,所以把相关文件给删除了,只添加了两个文件夹。
然后添加一个lcd_ui.c,将I2C初始化和lcd显示相关的代码放进去,代码嘛自然也是抄的官方驱动,这边简单看下main函数,很简单。
跑完之后的效果那就是出现一个滚动字符串(字符串太短就根本滚不起来),到这里显示部分的基础就搭好了。
ESP32连接WIFI
ESP32连接wifi,这里感觉官方的例程稍微复杂了点,于是网上搜刮了一下抄了点代码,最终就简化成这个init_wifi()函数。
其实主要分这么几步:硬件初始化->WIFI配置->WIFI事件回调函数注册,在ESP32的WIFI初始化完成之后就会有一个WIFI_EVENT_STA_START事件,在该事件的回调函数中连接wifi即可。
在wifi初始化各个阶段也在oled屏幕上加了打印,方便调试代码。
成功连接上wifi后在路由器侧也能看到该设备espressif。
ESP32运行TCP客户端
这部分和LINUX端写TCP客户端差别不大,其实就是在FreeRTOS的基础上创建一个线程监听服务端的请求。总的流程就是创建线程->连接服务端->监听服务端请求。
那么再用python写个简单的服务端运行在PC上,再和ESP32建立连接。
import socket
def start_server():
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 绑定端口号
server_socket.bind((host, port))
# 设置最大连接数,超过后排队
server_socket.listen(5)
while True:
# 建立客户端连接
client_socket, address = server_socket.accept()
print(f"连接地址: {address}")
# 给客户端发送欢迎消息
client_socket.send('yeahyeahyeah'.encode('utf-8'))
# 关闭连接
client_socket.close()
return
if __name__ == '__main__':
start_server()
最终效果
那么最终效果就是ESP32侧收到PC发来的字符串并显示在oled上了,main函数也相当简单 I2C_OLED初始化->wifi初始化->tcp客户端创建。
一些后话
嵌入式调试起来还是有点麻烦的,不过ESP-IDF的工程都自带了FreeRTOS,也是有些维测的东西在里面的,调试的时候要注意看下monitor,如果代码里的LOG和挂死时的调用栈都能显示,还挺方便。不过始终没有单步调试方便,下次考虑整个调试器使使。
ESP-IDF工程链接:https://pan.quark.cn/s/88a14d82525e