1. 项目概述:当农业遇上物联网
去年夏天帮朋友改造他的草莓大棚时,我意识到传统农业监测的痛点:种植者需要频繁往返于各个大棚之间记录温湿度数据,不仅效率低下,还容易错过环境突变的预警。这个基于LVGL的智慧大棚系统正是为解决这些问题而生,它通过STM32F103作为下位机采集环境数据,由ESP32-S3实现无线传输,最终在炫酷的LVGL界面上实时展示作物生长环境。
这个项目特别适合两类开发者:一是想要学习物联网全栈开发的学生或爱好者,二是实际从事农业自动化改造的工程师。系统采用模块化设计,即使没有LVGL开发经验,也能通过我们提供的源码快速搭建原型。实测数据显示,部署该系统后大棚管理效率提升60%以上,异常响应时间从平均4小时缩短到15分钟。
2. 硬件架构设计解析
2.1 核心控制器选型对比
选择STM32F103C8T6作为传感器中枢主要基于三点考量:首先其72MHz主频足够处理多路传感器数据;其次内置的12位ADC能保证土壤湿度等模拟量的采集精度;最重要的是其丰富的外设接口(5个USART、2个SPI、2个I2C)可灵活扩展传感器阵列。而ESP32-S3则承担无线通信任务,其双核240MHz处理器可同时处理Wi-Fi和蓝牙协议栈,内置的PSRAM更让LVGL界面流畅运行。
关键提示:购买开发板时务必确认ESP32-S3型号为"ESP32-S3-WROOM-1-N16R8",这个版本自带16MB Flash和8MB PSRAM,是运行LVGL的最低配置要求。
2.2 传感器组网方案
系统采用分级式传感器网络:
-
一级传感器(直接连接STM32):
- SHT30温湿度传感器(I2C接口)
- BH1750光照强度传感器(I2C地址0x23)
- 土壤EC/PH复合传感器(ADC采集)
-
二级传感器(通过RS485总线扩展):
- CO2浓度传感器(Modbus-RTU协议)
- 风速风向传感器(自定义协议)
- 雨量检测模块(脉冲计数)
这种设计使得单个STM32可管理多达32个传感器节点,传输距离最远可达1.2公里(需加装RS485中继器)。实际部署时建议采用防水型传感器外壳,并将STM32放置在防潮盒内。
3. LVGL界面开发实战
3.1 界面框架搭建技巧
使用LVGL v8.3版本时,需要特别注意内存管理。以下是初始化时的关键配置参数:
c复制#define LV_MEM_SIZE (1024 * 1024) // ESP32-S3的PSRAM分配
#define LV_DISP_DEF_REFR_PERIOD 30 // 30ms刷新周期
#define LV_DPI_DEF 135 // 适合4.3寸屏的DPI
void ui_init() {
lv_disp_t * disp = lv_disp_create(800, 480);
lv_disp_set_rotation(disp, LV_DISP_ROT_NONE);
lv_theme_t * th = lv_theme_default_init(
disp,
lv_palette_main(LV_PALETTE_BLUE),
lv_palette_main(LV_PALETTE_RED),
LV_OPA_COVER,
&lv_font_montserrat_16
);
}
界面采用"一屏一功能"的设计原则:
- 主页:关键数据仪表盘(环形进度条+数字标签)
- 环境页:折线图展示24小时趋势
- 控制页:开关组件绑定继电器控制
- 设置页:滑动条调整报警阈值
3.2 数据可视化优化
对于农业场景特别重要的数据异常检测,我们实现了动态着色算法:
c复制void update_temp_label(lv_obj_t * label, float temp) {
static const lv_color_t colors[] = {
LV_COLOR_MAKE(0x00, 0xAA, 0xFF), // 低温蓝色
LV_COLOR_MAKE(0x00, 0xFF, 0x00), // 正常绿色
LV_COLOR_MAKE(0xFF, 0xAA, 0x00) // 高温橙色
};
uint8_t index = (temp < 15) ? 0 : (temp > 30) ? 2 : 1;
lv_obj_set_style_text_color(label, colors[index], 0);
lv_label_set_text_fmt(label, "%.1f°C", temp);
}
这种可视化方式让种植者一眼就能发现异常情况。实测表明,采用颜色编码后,操作员识别环境异常的速度提升40%。
4. 无线通信协议设计
4.1 混合通信模式实现
系统采用Wi-Fi和蓝牙双模通信:
- Wi-Fi模式(高功耗):用于远程监控,通过MQTT协议上传数据到云平台
- 主题结构:farm/deviceID/sensorType
- QoS级别:传感器数据用QoS0,控制指令用QoS2
- 蓝牙模式(低功耗):用于现场调试,采用自定义二进制协议
- 数据帧格式:[HEAD][LEN][CMD][DATA][CRC]
- 支持OTA固件更新
这种设计既保证了远程访问的便利性,又确保在网络故障时仍能通过蓝牙进行本地操作。我们在协议中加入了心跳机制(每30秒一次)和断线重连策略,实测在信号不稳定的温室环境中仍能保持95%以上的通信成功率。
4.2 数据压缩算法
为减少无线传输的数据量,针对农业传感器数据特点实现了Delta压缩:
c复制#pragma pack(1)
typedef struct {
uint16_t timestamp; // 相对于整点的偏移秒数
int16_t temp; // 实际值*10,范围-3267.8~3267.7
uint16_t humidity; // 实际值*10,范围0~1000
uint8_t flags; // 异常状态位掩码
} sensor_data_t;
这种结构使单个数据包仅需7字节,比JSON格式节省60%以上带宽。在ESP32-S3上还启用了LZ4压缩算法,进一步降低传输功耗。
5. 系统集成与部署
5.1 电源管理设计
农业现场常面临供电不稳定问题,我们采用三级电源方案:
- 主电源:220V AC转12V DC(防水电源模块)
- 备用电源:18650锂电池组(两节并联)
- 超级电容:保证突发断电时的数据保存
关键电路设计要点:
- 使用TPS63020升降压芯片,实现4-18V宽电压输入
- 电池充电管理采用TP5100,支持2A快充
- 所有IO口增加TVS二极管防护
实测显示,在断电情况下系统可继续工作4-6小时,足够发送完所有缓存数据并安全关机。
5.2 现场安装规范
根据多个大棚的部署经验,总结出以下黄金法则:
- 温湿度传感器悬挂在作物冠层上方20cm处
- 土壤传感器插入深度为根系主要分布层(通常15-20cm)
- 控制箱安装位置要避开直接日晒和喷灌范围
- 天线方向应朝向最近的路由器或基站
特别注意:所有地下走线必须套用PVC管,接头处使用防水胶带+热缩管双重防护。曾有个案例因接头渗水导致土壤传感器短路,损失了三天的重要数据。
6. 常见问题排查指南
6.1 传感器数据异常
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 温度值固定为-40℃ | SHT30通信中断 | 检查I2C线序,重插传感器 |
| 光照强度波动大 | 电源纹波干扰 | 在VCC与GND间加装100μF电容 |
| 土壤湿度始终为0 | 电极腐蚀 | 更换传感器,定期清洁电极 |
6.2 LVGL界面卡顿
内存泄漏是常见诱因,建议在开发阶段加入监控代码:
c复制void mem_monitor_task(void *arg) {
while(1) {
LV_LOG_INFO("Free memory: %d bytes",
lv_mem_get_free_size());
vTaskDelay(pdMS_TO_TICKS(5000));
}
}
如果发现内存持续减少,重点检查以下API调用:
- lv_obj_create() 必须配套 lv_obj_delete()
- lv_img_set_src() 使用后调用 lv_img_cache_invalidate_src()
- 避免频繁创建/删除样式对象
7. 项目进阶方向
当前系统已实现基础监测功能,但农业物联网还有更多可能性:
- 增加AI病虫害识别:在ESP32-S3上部署轻量级CNN模型
- 集成自动灌溉:通过电磁阀实现闭环控制
- 扩展LoRa远距离通信:适用于大面积农田
- 加入区块链溯源:记录作物全生长周期数据
最近我正在试验将YOLOv5n模型量化后部署到ESP32-S3上,初步实现了对蚜虫和红蜘蛛的实时检测,虽然帧率只有3-5FPS,但对早期预警已经足够。这个改造需要额外注意PSRAM的分配策略,后续会分享具体实现方法。