
第九届立创电赛手把手教你打造ESP32C3低功耗采集与T113-Linux监控系统最近在捣鼓一个智能环境监测的项目想把家里的温湿度、气压、光照都管起来还能有个大屏实时显示。正好赶上立创电赛就用ESP32C3和全志T113做了这么一套系统。ESP32C3负责低功耗采集数据T113跑Linux做个带酷炫界面的监控终端。今天我就把这个项目的硬件设计思路和关键实现细节掰开揉碎了讲给你听无论你是参加电赛的学生还是想自己做智能家居的爱好者跟着做一遍保准能成。简单说这套系统分两头采集端用ESP32C3单片机接上SHT30、BMP180、BH1750这几个传感器专门负责采集环境数据。它的核心任务是省电平时深度休眠定时醒来采集、发送数据用一块1000mAh的电池就能撑很久。监控端用全志T113芯片运行Tina-Linux系统驱动一块10.1寸的大屏幕上面跑LVGL图形库做的界面。界面做得非常漂亮有高斯模糊的毛玻璃背景、动画时钟还能从网上获取天气显示室内外的环境参数未来还能控制智能家居。下面咱们就一步步来看这套系统是怎么搭起来的。1. 系统整体架构与功能咱们先鸟瞰一下整个系统。这本质上是一个分布式系统两个核心部件各司其职通过TCP网络“对话”。采集端 (ESP32C3)核心任务采集环境数据并尽可能省电。传感器SHT30高精度温湿度传感器。BMP180气压传感器同时也能推算海拔和温度。BH1750光照强度传感器。工作模式大部分时间处于深度休眠状态电流uA级别定时唤醒比如每5分钟一次。唤醒后快速读取所有传感器数据通过Wi-Fi建立TCP连接将数据打包发送给监控端然后继续休眠。供电内置锂电池支持15W快充有完善的电源管理电路确保低功耗。监控端 (全志T113)核心任务显示数据、提供人机交互界面。硬件全志T113双核Cortex-A7处理器配备10.1寸RGB液晶屏。软件运行Tina-Linux全志定制版Linux图形界面基于LVGL库开发。主要功能TCP服务器监听网络端口接收ESP32C3发来的传感器数据。华丽UI显示天气时钟界面背景使用高斯模糊毛玻璃特效时间显示带有动画。数据展示同时显示从网络获取的室外天气、温湿度以及ESP32C3传来的室内精确温湿度、气压、光照数据。天气图标用Lottie动画呈现非常生动。家庭中控UI设计高仿流行的HomeAssistant未来计划将通信协议从TCP升级为MQTT用于控制其他智能家居设备。简单来说ESP32C3是默默干活的“侦察兵”T113是拥有华丽指挥部的“指挥官”。两者分工明确通过Wi-Fi组网共同构成一个完整的智能环境监测方案。2. 硬件设计详解硬件是项目的地基这部分设计好了后面写代码就顺风顺水。咱们分别看看监控端和采集端的原理图设计。2.1 监控端T113硬件设计T113这边功能多电路相对复杂我把它分成了4个主要部分来画原理图这样清晰也方便后期检查。1. T113核心及外围电路这部分是T113芯片能跑起来的最基本电路。就像给电脑CPU配主板一样需要时钟、复位、内存DDR、存储SPI NAND Flash等。在设计时我对官方推荐电路做了一些“取舍”保留的必须的电源、DDR3内存、SPI Flash、调试串口(UART0)、SD卡槽等。去掉的比如TV输出接口、电阻触摸屏TP接口。因为我们用RGB屏幕和电容/电感触摸这些功能用不上去掉可以让电路更简洁。注意芯片的启动配置引脚BootSel一定要根据官方手册通过电阻正确配置为上拉或下拉这决定了芯片从哪里启动比如从SPI Flash还是SD卡。2. 供电电路T113芯片需要多种电压核心电压0.9VDDR内存电压1.8V外部IO和外围设备电压3.3V。如果都用线性稳压器LDO大电流时发热严重效率低。 我的方案是使用一颗DCDC降压芯片RY1303先将输入电压比如5V高效地降压产生0.9V和1.8V这两个主要电源。3.3V可以由另一个DCDC或LDO产生。DCDC效率高发热小适合给核心和内存供电。3. 外设接口电路这部分把我们要用到的设备接口都列出来最主要的就是RGB液晶屏接口。T113有专门的LCD控制器可以直接驱动RGB接口的屏幕。原理图上需要将T113的LCD数据线、时钟线、同步信号线等与屏幕FPC连接器的对应引脚正确连接。此外还有背光控制电路等。4. Wi-Fi模块电路为了让T113能联网获取天气数据并和ESP32C3通信需要Wi-Fi。我选择了常用的SDIO接口Wi-Fi模块如RTL8189FTV。这部分电路主要包括模块的电源、SDIO数据线、中断线以及天线匹配电路。确保时钟线走线等长并做好电源滤波是Wi-Fi稳定工作的关键。2.2 采集端ESP32C3硬件设计采集端的目标是低功耗和可靠采集所有电路设计都围绕这个目标。我把它画在了一张原理图上分为几个关键区域。① ESP32C3最小系统左上角是ESP32C3芯片及其必要的外围电路包括电源滤波芯片每个电源引脚附近都有去耦电容这是稳定工作的基础必不可少。时钟电路外接40MHz晶振。Flash电路ESP32C3内置Flash但相关引脚如GPIO12/GPIO13等需要正确上拉/下拉影响启动模式。Strapping引脚这是重中之重芯片有一组特殊的Strapping引脚如GPIO2,GPIO8,GPIO9等它们在系统上电时的电平状态决定了芯片的启动模式如从内部Flash启动还是下载模式、Flash电压等。必须严格按照乐鑫官方原理图设计该上拉的上拉该下拉的下拉默认浮空的引脚绝不能随意接。这次比赛我就看到不少人这里画错了导致芯片无法启动。踩坑提醒GPIO8和GPIO9在有些型号上默认内部状态不稳定外部建议按手册要求配置明确的上拉/下拉电阻避免启动异常。② 快充电路虽然整机功耗低但充电不能慢。我采用了IP2312这款充电管理芯片。它支持最大15W的快充比如9V/1.67A给这块1000mAh的电池充电非常快。充电电流、截止电压等参数可以通过连接在ISET、VSET引脚上的电阻来调整我在原理图上已经标注了阻值。 这里有个贴心设计下载口和充电口分离。用一个USB口专门用于程序下载连接电脑另一个USB口专门用于充电。因为快充时电流可能很大这样可以彻底避免在下载程序时大电流对电脑USB端口造成潜在风险。③ 低功耗电源管理这是实现uA级休眠的关键传感器和电池检测电路即使在休眠时也会消耗微小的电流。为了彻底“断电”我用MOS管把它们和主电源隔开。传感器电源控制使用一个PMOS管如SI2301来控制给所有传感器SHT30, BMP180, BH1750供电的3.3V。ESP32C3的一个GPIO通过一个三极管来控制这个PMOS的栅极。当需要采集时GPIO输出高电平打开PMOS传感器得电采集完毕GPIO输出低电平关闭PMOS传感器完全断电实现零功耗。电池电压检测控制电池电压通过电阻分压后送到ESP32C3的ADC引脚进行测量。为了在休眠时切断这个分压电路的电流我在分压电路的高端串联了一个NMOS管。同样用一个GPIO来控制它只在需要检测电池电量时才导通分压电路。ADC通道ESP32C3的两个ADC通道被利用起来ADC1_CH2(GPIO 2)用于检测充电输入电压可以判断是否在充电状态。ADC1_CH3(GPIO 3)用于检测电池电压通过程序换算成电量百分比。④ 主供电与电源切换采集端可以由电池供电也可以由下载的USB口供电。我使用了一颗MT3410LDCDC降压芯片将电池电压约3.7V-4.2V或USB电压5V高效地降压到3.3V给ESP32C3核心系统供电。这颗芯片效率高即使在电池电压较低时也能稳定输出。 同时我设置了一个拨动开关用于手动选择电源来源是来自电池还是来自USB下载口。这个设计在调试时非常方便而且即使在电池充电时系统也可以选择由USB口供电正常工作。3. 软件与系统设计思路硬件搭好了接下来就是让它们“活”起来的软件。由于篇幅所限这里先详细讲清设计思路和关键点具体代码可以参照我后续开源的仓库。3.1 采集端 (ESP32C3) 软件流程ESP32C3的程序在Arduino框架或ESP-IDF下都可以开发核心是围绕低功耗和定时采集。// 伪代码流程示意 #include esp_sleep.h // 低功耗头文件 #include WiFi.h #include Wire.h // 用于I2C传感器 // 定义传感器对象、网络参数等 void setup() { initGPIO(); // 初始化控制传感器的电源MOS管为关闭状态 initADC(); // 初始化ADC用于电池检测 // 其他初始化... connectToWiFi(); // 连接Wi-Fi每次唤醒后重连或尝试保持 } void loop() { // 1. 打开传感器电源 powerOnSensors(); delay(10); // 等待传感器稳定 // 2. 读取所有传感器数据 float temp readSHT30Temperature(); float humidity readSHT30Humidity(); float pressure readBMP180Pressure(); float light readBH1750Light(); int batteryLevel readBatteryVoltage(); // 3. 关闭传感器电源 powerOffSensors(); // 4. 连接服务器并发送数据 if (sendDataViaTCP(temp, humidity, pressure, light, batteryLevel)) { Serial.println(Data sent successfully.); } else { Serial.println(Send failed.); } // 5. 断开Wi-Fi以省电深度休眠前 WiFi.disconnect(true); WiFi.mode(WIFI_OFF); // 6. 进入深度休眠 esp_sleep_enable_timer_wakeup(5 * 60 * 1000000); // 休眠5分钟微秒 esp_deep_sleep_start(); // 进入深度休眠程序停止 // 休眠结束后芯片重启从setup()重新开始 }关键点esp_deep_sleep_start()这是实现超低功耗的关键。芯片大部分功能关闭仅保留RTC定时器和少量内存电流可降至10uA以下。电源顺序管理在setup()或powerOnSensors()函数中一定要先控制GPIO打开传感器供电的MOS管稍作延时再进行I2C通信读取数据。关闭时顺序相反。Wi-Fi处理每次唤醒后重新连接Wi-Fi。为了进一步省电可以在发送数据后立即调用WiFi.disconnect(true)和WiFi.mode(WIFI_OFF)关闭Wi-Fi射频。3.2 监控端 (T113) 软件架构T113这边跑Linux软件层次多一些。构建Linux系统使用全志官方提供的Tina-Linux SDK进行配置和编译。需要在内核中使能LCD驱动、Wi-Fi驱动、TCP/IP网络等。最终烧录到SPI Flash中。TCP数据接收服务编写一个后台守护进程Daemon或简单的C程序在T113上作为一个TCP服务器运行。它持续监听特定端口如8080等待ESP32C3的连接。一旦收到数据包就解析出温度、湿度、气压、光照、电量等信息。LVGL图形界面应用这是UI的核心。我基于LVGL库开发了主界面应用。这个应用需要与TCP服务通信通过本地进程间通信如Unix Socket、共享内存或简单的文件读写从TCP服务进程获取最新的传感器数据。网络请求使用CURL库或类似的HTTP客户端从心知天气、和风天气等公开API获取室外的天气信息。渲染UI高斯模糊背景这是UI的亮点。可以参考开源社区如文中致谢的吴明辉大佬的代码利用LVGL的lv_canvas和图像处理算法对壁纸进行实时模糊处理实现毛玻璃效果。Lottie动画LVGL支持Lottie动画。将晴天、雨天、多云等天气图标做成Lottie JSON格式文件根据获取的天气数据动态切换播放效果非常流畅。数据绑定将LVGL的标签lv_label、进度条等控件与从TCP服务获取的室内数据、从网络获取的室外数据进行绑定定时更新显示。系统集成将TCP数据服务和LVGL应用设置为开机自启动确保板子上电后自动进入监控界面。提示UI部分的代码框架我参考了B站大佬“奥大梨呀”的项目并在其基础上集成了高斯模糊特效和我们的数据逻辑。完整的UI代码已开源在GitHubhttps://github.com/Ary-ovo/strategist_UI你可以直接克隆下来作为起点进行开发。4. 总结与心得这个项目做下来最深的体会就是“分而治之”的思想在嵌入式系统设计中的妙用。让擅长低功耗的ESP32C3专心做数据采集让性能强大的T113专心做图形显示和复杂逻辑两者通过最通用的TCP网络通信使得系统结构清晰开发和调试难度都降低了。在硬件上低功耗设计是细节的堆砌。不仅仅是选择一颗低功耗的MCU更要像我们这样从电源路径管理MOS管开关、外围电路断电传感器电源控制、静态电流消除电池检测分压电路等多个维度去“抠”每一个微安级的电流。在软件上利用好成熟的开源生态能事半功倍。LVGL社区提供了强大的图形组件和丰富特效如高斯模糊、Lottie全志的Tina-Linux SDK也大大降低了构建Linux系统的门槛。最后有几个踩过的坑提醒大家ESP32C3的Strapping引脚再说一遍务必严格按照官方数据手册设计这是血泪教训。电源时序ESP32C3的传感器供电控制GPIO输出和I2C读取之间一定要加足够的延时几十毫秒确保传感器芯片完全上电初始化完成。LVGL的内存管理在资源有限的嵌入式Linux上跑LVGL要注意动态创建和删除对象避免内存泄漏。对于复杂的静态界面可以考虑用LVGL的“快照”功能来减少实时渲染开销。希望这篇详细的剖析能帮你理清思路。硬件设计文件可以在立创EDA开源平台找到软件代码也会陆续开源。动手做起来你也能打造出一套属于自己的、颜值与实力并存的智能环境监测系统。