ESP32开发一_OLED_WIFI_TCP通信

ESP32连接TCP服务端并显示数据内容

简介

这两年AI异常火爆,我也想把AI跟物联网结合一下,于是呢目前的方案是这样的:MCU通过麦克风采集音频,通过wifi传给PC,通过PC的服务端解析成文字后和LLM对话,服务端将LLM的回复再发送给MCU。这一次我们先来实现MCU获取PC服务端的信息并在MCU的显示屏上显示。
正好,ESP32是一款专为物联网应用打造的mcu,低功耗、wifi、蓝牙等等功能它都有,而且作为一款比较热门的国产芯片,资料也相对较多,于是非常自然地就选择了这款芯片。这篇文章的内容也会是更加偏向嵌入式一点的,让我们开始吧。

ESP32环境简介

本次使用的ESP32是某宝上淘来的便宜模块,开发板各引脚定义如下图:
ESP32定义

显示屏是个0.96寸oled屏幕,SSD1306驱动,IIC协议,很常见。
开发环境使用的是VSCODE+ESP-IDF,搭建过程就不多赘述,可以在网上找到较多教程。新建一个工程模板,然后开始扒例程的代码。
由于嵌入式的代码有一些细节全部展示的话太过繁琐,所以下面主要代码都通过截图展示,当然整个工程的代码我也会共享出来,如果感兴趣请直接下载。

ESP32显示文字

文字显示部分非常简单,参考ESP-IDF自带的例程:i2c_oled_example。简单浏览了一下,这个例程使用了esp官方的lcd、i2c库以及开源的lvgl显示框架,很容易使用。
先看下i2c例程的目录
OLED工程目录结构
按照例程的结构,新建一个sample工程,名字随意,然后在里面新建一个components目录,ESP-IDF会自动将添加进去的文件给编译进去,由于我不需要sh1107的驱动,所以把相关文件给删除了,只添加了两个文件夹。
本工程目录结构

然后添加一个lcd_ui.c,将I2C初始化和lcd显示相关的代码放进去,代码嘛自然也是抄的官方驱动,这边简单看下main函数,很简单。
oled显示main函数
跑完之后的效果那就是出现一个滚动字符串(字符串太短就根本滚不起来),到这里显示部分的基础就搭好了。

oled显示字符串

ESP32连接WIFI

ESP32连接wifi,这里感觉官方的例程稍微复杂了点,于是网上搜刮了一下抄了点代码,最终就简化成这个init_wifi()函数。
其实主要分这么几步:硬件初始化->WIFI配置->WIFI事件回调函数注册,在ESP32的WIFI初始化完成之后就会有一个WIFI_EVENT_STA_START事件,在该事件的回调函数中连接wifi即可。
ESP32WIFI初始化
WIFI事件回调函数

在wifi初始化各个阶段也在oled屏幕上加了打印,方便调试代码。
成功连接上wifi后在路由器侧也能看到该设备espressif。
ESP32连上WIFI

ESP32运行TCP客户端

这部分和LINUX端写TCP客户端差别不大,其实就是在FreeRTOS的基础上创建一个线程监听服务端的请求。总的流程就是创建线程->连接服务端->监听服务端请求。

连接TCP服务端
TCP客户端

那么再用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客户端创建。

完整main函数
OLED显示效果

一些后话

嵌入式调试起来还是有点麻烦的,不过ESP-IDF的工程都自带了FreeRTOS,也是有些维测的东西在里面的,调试的时候要注意看下monitor,如果代码里的LOG和挂死时的调用栈都能显示,还挺方便。不过始终没有单步调试方便,下次考虑整个调试器使使。

核挂死后的核内寄存器信息

挂死时的调用栈

ESP-IDF工程链接:https://pan.quark.cn/s/88a14d82525e

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于您的问题 "esp32 tcp_server",我可以为您提供以下信息: ESP32是一款低功耗的WiFi和蓝牙双模模块,可以用于物联网和嵌入式应用开发。要创建一个TCP服务器,您需要使用ESP-IDF(ESP32 IoT Development Framework)中的API来设置和管理网络连接。 以下是一个简单的示例代码,用于在ESP32上创建一个TCP服务器: ```cpp #include <WiFi.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; WiFiServer server(80); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); server.begin(); } void loop() { WiFiClient client = server.available(); if (client) { Serial.println("New client connected"); while (client.connected()) { if (client.available()) { String request = client.readStringUntil('\r'); Serial.println(request); client.println("Hello from ESP32 TCP Server"); delay(10); client.stop(); Serial.println("Client disconnected"); } } } } ``` 在这个示例中,您需要将"your_SSID"和"your_PASSWORD"替换为您的WiFi网络的名称和密码。代码将连接到WiFi网络,并在端口80上创建一个TCP服务器。当有客户端连接时,它将打印请求并向客户端发送"Hello from ESP32 TCP Server"消息。 请注意,这只是一个简单的示例,您可以根据您的需求进行修改和扩展。您还可以使用ESP-IDF提供的其他功能来进行更复杂的TCP服务器开发。 希望这可以帮助到您!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值