#第九届立创电赛# 基于ESP32C3低功耗采集与T113-Linux监控的智能环境监测系统设计
第九届立创电赛:手把手教你打造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.9V,DDR内存电压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服务获取的室内数据、从网络获取的室外数据进行绑定,定时更新显示。
- 高斯模糊背景:这是UI的亮点。可以参考开源社区(如文中致谢的吴明辉大佬)的代码,利用LVGL的
- 系统集成:将TCP数据服务和LVGL应用设置为开机自启动,确保板子上电后自动进入监控界面。
提示:UI部分的代码框架,我参考了B站大佬“奥大梨呀”的项目,并在其基础上集成了高斯模糊特效和我们的数据逻辑。完整的UI代码已开源在GitHub:https://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开源平台找到,软件代码也会陆续开源。动手做起来,你也能打造出一套属于自己的、颜值与实力并存的智能环境监测系统。
