
日期:2026-03-05 10:05:17 浏览次数:
主包在此记录的第一个小项目,这个项目的功能相对简单,主控连接上WiFi后,首先进行实践同步,同步成功后显示在屏幕上。也就是一个简单的桌面小型时钟吧。同时我还连接了一个DHT11 温湿度模块来检测环境的温湿度。当然,这几个功能就略显得简单了,后续主包还会在上面添加比如闹钟、天气显示等功能来添加可玩性。
本次带来的项目选用了尚视界科技的串口彩屏模块SF-035,3.5寸大小。与传统的LCD+触摸屏方案相比,这一块串口屏可以通过自带的sHMI设计 工具,通过拖拽的方式来设计页面元素,不需要编写复杂的图形库。同时屏幕与ESP32-S3开发板的链接仅依靠2条通讯线:RX、TX,这样减少了引脚的占用。同时与LVGL相比,这种方案的资源占用较低,主控只需要通过UART发送指令即可控制显示内容,这样大大节约了MCU的资源。



这里使用ESP32-S3的UART1里的GPIO17和GPIO18与屏幕的TX、RX相连接。DHT11温湿度模块的DAT线连在了GPIO4。这里串口使用到的波特率为115200。这里想起来遇到的一道笔试题:波特率115200代表了什么意思,主包当时没想起来,结果就被刷掉了。
硬件:ESP32-S3、SF035-HVGA-ST-01-V02
以下是主包设计的UI界面:

作为一个完整的项目,我没有把所有代码都堆在main.c里,而是将代码按功能模块进行了划分:

这样分层有几个好处:1. 职责清晰:每个模块只做一件事,比如uart_comm只负责收发数据;2. 易于测试:可以单独测试每个模块;3. 方便扩展:要加新功能只需要添加新模块,不用改动原有代码;4. 便于维护:出问题时能快速定位到具体模块
WiFi连接流程
这部分我使用了ESP-IDF提供的WiFi API,主要步骤如下:
1. 初始化WiFi

2. 连接WiFi

3. 等待连接成功
这里使用了FreeRTOS的事件组来等待WiFi连接:

WiFi连接成功后,就可以进行时间同步了:





注意:
1.曲线控件支持多条曲线,通过曲线ID区分(这里主包用0表示温度,1表示湿度)
2.数据会自动滚动推移,无需手动管理历史数据
3.建议采样间隔不要太短,5秒左右比较合适
码表控件指令
这个是我觉得很帅的功能,可以做出模拟时钟效果,这里需要说明的是:
1.控件ID: 钟表控件的ID
2.角度: 0-359度
3.指针ID: 0=时针, 1=分针, 2=秒针

其中还包含了角度的计算问题

这是主包在开发中遇到的一个重要问题的解决方案。
问题:切换到其他页面后,原页面的控件仍在刷新,导致串口拥塞和画面干扰。就比如我在页面2的控件里看到了本应该在页面1更新的数据。这是因为
控件修改指令时没有页面ID导致不同页面的ID串通的现象。因此主包使用了页面ID查询机制,因为屏幕支持页面ID的查询,在查询当前页面后得到页面
ID后,根据页面ID启停不同的数据发送任务。这个机制大大提升了系统的稳定性和响应速度。这里需要在设计界面打开“触摸控件输出坐标点”



问题1:中文乱码
原因:编码格式不对,我以为是GBK,所以出现了乱码,在查询了说明书后发现其实是UTF-8
解决:确保源文件保存为UTF-8编码
问题2:指令发送后没反应
排查过程:
1. 用串口打印日志发现帧尾少了一个字节
2. 检查代码,发现数组越界了
解决:增加缓冲区大小,添加边界检查
问题3:频繁发送导致屏幕卡顿
问题:每秒发送太多数据,屏幕响应变慢
解决:
1. 只在数据变化时才发送
2. 不同页面只发送当前页面需要的数据
3. 降低刷新频率(温湿度从1秒改为5秒)



调试过程与优化
1. ESP-IDF监视器


针对不同类型的数据,我采用了不同的更新策略:

这样的策略既保证了显示的实时性,又避免了串口带宽浪费。


这是我第一次完整地做一个嵌入式项目,虽然功能还比较简单,但整个过程让我收获很多。
从一开始的迷茫,到慢慢理清思路,再到最后看到屏幕上显示出时间的那一刻,那种成就感是无法用言语形容的。
当然,这个项目还有很多需要改进和拓展的地方。希望这篇文章能帮到正在学习的你。如果有任何问题,欢迎交流讨论!
最后,祝大家春节快乐,马年大吉!
————————————————
版权声明:本文为CSDN博主「尔多隆了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_74220243/article/details/157469977