立创开源GSM-Weather-S3桌面天气站:ESP32-S3双板设计与3D打印外壳全解析

立创开源GSM-Weather-S3桌面天气站:ESP32-S3双板设计与3D打印外壳全解析 立创开源GSM-Weather-S3桌面天气站ESP32-S3双板设计与3D打印外壳全解析最近看到很多朋友都在DIY桌面天气站、小电视这类摆件功能酷炫外观也很有创意看得我心里直痒痒。作为一个从小就喜欢捣鼓电子的“颜值控”我决定自己动手做一个。从2020年国庆假期开始构思硬件迭代了7个版本软件也断断续续开发了两年终于把这个基于ESP32-S3的桌面天气站做出来了。今天我就把这个项目的硬件设计、结构外壳和软件调试的完整过程分享给大家特别是其中一些实用的电路设计和踩过的“坑”希望能给想做类似项目的朋友一些参考。1. 硬件架构双板分离设计整个硬件部分我采用了主控板和USBSD板分离的设计两块板子之间用FPC软排线连接。这样做的好处是结构更灵活主控板可以做得更小巧而把电源、下载、存储这些“外围”功能独立出来。1.1 核心大脑主控板详解主控板的核心是ESP32-S3-WROOM-1-N16R8模块。它负责驱动屏幕、采集和播放音频是整个系统的“大脑”。图主控板实物图为什么选择模块而不是芯片对于新手或者想快速完成项目的朋友我强烈建议直接使用像ESP32-S3-WROOM这样的模组而不是裸芯片。原因很简单天线设计是个技术活。要自己画天线并调试到最佳性能阻抗匹配需要专业设备和经验。而官方模组已经帮你把天线、射频电路都优化好了拿来就能用性能有保障大大降低了开发门槛。这个模组的外围电路非常简洁几乎就是“最小系统”。从原理图可以看到除了一个复位电路电阻R18和电容C7几乎不需要其他额外器件。模块内部已经集成了16MB的Flash和8MB的PSRAM对于运行LVGL图形库和存储天气数据来说完全够用。图ESP32-S3-WROOM-1-N16R8最小系统原理图1.2 功能扩展与供电USBSD板解析这是整个设计的“后勤保障”中心集成了程序下载、电源管理电池/USB自动切换、软件开关机、SD卡插槽等功能。图USBSD板实物图1.2.1 电源自动切换电路不断电的秘诀作为一个桌面摆件我希望它既能用电池供电摆放在任何地方也能插着USB线当时钟用。这就需要一套电路能自动在电池和USB电源之间无缝切换。注意这个电路的关键是防止两种电源互相“打架”比如电池电流倒灌进USB同时要保证切换时系统供电不中断。电路的核心是一个PMOS管Q6。它的工作原理是这样的仅电池供电当没有插入USB时PMOS管Q6导通电池BAT的电流通过Q6给系统主电源VCC供电。插入USB供电当插入USB5V时这个5V电压会使PMOS管Q6的栅极电压变高从而让Q6关闭切断电池供电通路。同时5V电源通过一个二极管D4给VCC供电。二极管D4在这里起到了防止5V电压倒灌回电池的作用。图电源自动切换电路原理图这样无论你是否插着USB线设备都能持续工作并且优先使用更稳定的USB电源。1.2.2 软件开关机电路一键优雅开关机传统的物理开关切断电源单片机直接就“断电身亡”了没法执行保存数据、关闭屏幕等收尾工作。我设计的这个“软件开关机”电路能让单片机自己控制断电实现一键关机并保存状态。电路围绕一颗带使能引脚CE的3.3V稳压芯片U5构建。使能脚好比这个稳压芯片的“总开关”给高电平就输出3.3V给低电平就关闭输出。开机过程两种方式按键开机按下按键SW2电池电压VCC通过按键和二极管D5给稳压芯片U5的CE脚一个高电平系统得电启动。程序启动后会立刻检测按键引脚KEY_POWER的电平发现是高电平说明是按键触发就控制一个GPIOPOWER_IO输出高电平这个高电平会“锁住”CE脚这样即使你松开按键系统也不会断电。充电开机插入USB时5V电压通过电阻R22直接给CE脚高电平系统上电。程序检测到KEY_POWER是低电平因为R27下拉就知道是充电开机正常启动即可。关机过程想关机时长按按键2秒。程序检测到长按事件后会在屏幕上提示“松手关机”。当你松开按键的瞬间程序将POWER_IO引脚拉为低电平CE脚随之被拉低稳压芯片U5停止输出整个系统彻底断电。图软件开关机电路关联示意图左主控板右USBSD板提示主控板上的POWER_IO2信号就是通过FPC排线连接到USBSD板上的POWER_IO从而实现单片机对电源芯片的控制。1.2.3 自动下载电路解放双手的利器给ESP32下载程序时需要手动操作先拉低GPIO0引脚再按一下复位键。这个过程很麻烦。我利用CH340C USB转串口芯片自带的RTS和DTR引脚配合一个双三极管芯片UMH3N实现了全自动下载。原理很简单当你点击IDE中的“下载”按钮时CH340C的RTS和DTR引脚会由电脑软件控制产生特定的电平跳变序列。这个序列经过UMH3N电路转换后会自动在ESP32-S3的EN复位和IO0引脚上产生正确的时序先拉低IO0再产生一个复位脉冲。这样你就不用再手动按任何按钮了点击下载就能自动完成非常方便。图自动下载电路原理图1.3 PCB设计与焊接技巧两块板子都采用两层板设计以控制成本。因为整体尺寸小USBSD板的布局费了不少功夫。这里分享一个焊接QFN封装芯片的小技巧。主控板上的音频芯片WM8978是QFN封装底部有一个大的散热焊盘。只用烙铁很难给这个底部的焊盘上锡。我的解决办法是在PCB设计时就把这个底部焊盘的铜皮“挖空”做成一个中空的框这样在焊接时就可以从PCB背面轻松地对这个焊盘进行加热和上锡完美解决了焊接问题。图WM8978底部焊盘“挖空”设计2. 3D打印外壳从零开始学结构设计作为一个“颜值控”外壳设计花了我不少心思。我专门花了三周时间学习Autodesk Fusion 360从零开始画出了这个外壳。2.1 斜面屏幕的固定难题我想做一个正面是完整斜面的设计让屏幕看起来像是“浮”在上面。计划是把屏幕直接卡在外壳的斜面框里。但因为是斜面计算卡扣尺寸非常困难。我试了最“笨”但最有效的方法快速迭代。画好模型3D打印出来试装测量偏差修改模型再打印……前后打了3次样才得到严丝合缝的尺寸。图外壳斜面与屏幕卡扣截面示意图2.2 内部结构的固定USBSD板采用卡扣式固定在底部设计了三个卡点把板子往里一推就卡住了非常牢固也方便拆卸。主控板因为有两根FPC排线连接排线本身就有一定的支撑力所以主控板就直接平放在外壳内部没有额外固定。电池用双面胶粘在外壳内壁即可。2.3 外观与上色外壳打印好后是纯白色的。为了达到理想的颜色效果我使用了汽车模型常用的自喷漆进行改色。喷涂前记得做好打磨和清洁少量多次喷涂效果会更好。3. 软件调试与关键代码解析项目使用乐鑫官方的ESP-IDF v5.0框架开发实现了天气预报、B站粉丝显示、老黄历、时钟、中英文切换、Wi-Fi搜索等功能。完整的带注释代码已在开源平台发布这里我挑两个有代表性的调试点讲讲。3.1 软件关机中的“余电”问题按照前面硬件设计的逻辑关机时程序拉低POWER_IO引脚电源芯片应该立刻断电。但实际测试中发现拉低引脚后设备还会“挣扎”一会儿才关机。用示波器检查POWER_IO引脚的电平确实是立刻被拉低了说明软件没问题。问题出在硬件上当控制信号关闭后ESP32模块内部的电容还有残存的电量余电需要一段时间才能放完导致关机延迟。我的解决方案是在关机前主动让系统“忙”一下加速耗电。在调用关机函数bsp_power_off()之前我加了两行代码关闭屏幕背光立刻降低一大块功耗。执行一次Wi-Fi连接操作让ESP32的射频部分工作一下快速消耗电容存储的电能。这样修改后关机就变得非常迅速了。相关代码逻辑在bsp_power.c文件中。3.2 使用LVGL Anim实现灵动交互动效为了让界面切换不那么生硬我使用了LVGL库的动画Anim功能。它不仅能控制一个属性比如位置、大小、透明度在一定时间内变化还能指定变化的“路径”Easing Function。比如一个窗口滑入屏幕你可以让它“匀速”滑入也可以让它“先快后慢”像有惯性一样滑入或者“像弹簧一样”弹入。LVGL内置了7种不同的动画路径函数通过lv_anim_path_set_cb来设置。选择合适的动画路径能让你的界面交互显得非常生动和高级。4. 开源资料与制作须知这个项目的所有硬件、软件、外壳文件均已开源你可以自由下载、修改和制作。硬件开源地址立创开源硬件平台搜索gsm-weather-s3软件开源地址Gitee仓库gsm-wheather-project3D打印文件在软件仓库的3D打印目录下演示视频B站搜索BV1VU4y1v7VD几个重要的制作提示核心物料ESP32-S3模块必须使用ESP32-S3-WROOM-1-N16R8这个特定型号因为它内置了8MB PSRAM对于流畅的UI显示至关重要。打样省钱技巧有网友反馈USBSD板打样要250元。这是因为嘉立创审核时对板边有半圆孔用于SD卡槽的板子默认选择了“半孔工艺”这个工艺很贵。你可以在下单支付前的费用详情里看到一定要备注“不需要半孔工艺”价格就会恢复正常甚至能免费。寻求帮助制作过程中遇到问题可以到项目原作者的QQ交流群709259833里讨论。希望这份详细的解析能帮助你理解这个桌面天气站的设计思路也期待你能做出属于自己的创意作品。嵌入式开发的乐趣就在于把想法一点点变成现实这个过程虽然会遇到各种问题但解决问题的成就感是无与伦比的。