从土壤湿度到云端控制:一个STM32物联网施肥机的开发手记
作为一名嵌入式开发者,我始终对物联网技术在农业领域的应用充满兴趣。去年夏天,我决定亲手打造一套智能施肥系统,将传统的农业灌溉与现代化物联网技术相结合。这个项目不仅涉及硬件设计、传感器选型,还需要解决云端数据传输和移动端控制等一系列技术挑战。经过三个月的开发和调试,最终成功实现了从土壤数据采集到远程控制的完整闭环。本文将分享这个项目的详细开发过程,希望能为同样对智慧农业感兴趣的开发者提供参考。
1. 系统架构设计与核心组件选型
在开始具体开发前,我首先明确了系统的核心需求:实时监测土壤湿度与肥料浓度,根据预设阈值自动执行灌溉施肥操作,并通过WiFi将数据上传到云端,支持手机APP远程监控与控制。整个系统分为感知层、控制层、传输层和应用层四个部分。
感知层负责环境数据采集,我选择了YL-69土壤湿度传感器和MQ系列气体传感器。YL-69采用电阻式测量原理,通过检测土壤导电性间接反映湿度水平,虽然精度不是最高,但成本低廉且完全满足农业应用需求。MQ传感器则用于检测土壤中的氨气含量,从而间接判断肥料浓度,其模拟电压输出与气体浓度呈正相关。
控制层以STM32F103C8T6为核心,这款32位ARM Cortex-M3内核的MCU具有丰富的外设接口和足够的处理能力。我特别看重其内置的12位ADC模块,可以直接读取传感器模拟信号,无需额外转换芯片。同时,STM32的低功耗特性也符合农业设备长期野外工作的需求。
传输层采用ESP8266 WiFi模块,通过AT指令与STM32进行串口通信。ESP8266支持STA和AP两种模式,可以灵活接入现有无线网络或自建热点。我选择MQTT协议作为通信协议,其轻量级和发布/订阅模式非常适合物联网设备与云端的双向数据交换。
应用层包括云端数据平台和手机APP。我使用阿里云IoT平台作为数据中转站,提供设备管理、数据存储和API接口。手机APP则基于Android开发,通过调用云端API实现远程监控和控制功能。
提示:在选择传感器时,务必考虑其测量范围、精度与实际应用场景的匹配度。农业环境往往存在灰尘、湿度变化大等挑战,需要选择防护等级适当的传感器。
2. 硬件电路设计与集成
硬件设计是整个项目的基础,我采用模块化设计思路,将系统分为主控板、传感器模块、执行器模块和通信模块四个部分。
主控板以STM32F103C8T6最小系统为核心,包括晶振电路、复位电路和电源管理。农业现场通常只有12V或24V直流电源,我使用LM2596降压模块将电压降至5V,再通过AMS1117-3.3转换为MCU所需的工作电压。电源输入端加入了TVS二极管和自恢复保险丝,防止雷击和过流损坏设备。
传感器接口电路设计需要考虑信号调理。YL-69传感器输出信号较弱,我使用了LM358运放搭建同相放大电路,将信号放大到0-3.3V范围以适应STM32的ADC输入。MQ传感器则需要加热电压稳定,我专门设计了基于TL431的精密基准源为其供电,确保测量稳定性。
执行器部分采用继电器控制水泵和肥泵。STM32的IO口驱动能力有限,我使用ULN2003达林顿阵列驱动继电器线圈,并在继电器触点两端并联RC吸收电路,抑制感性负载产生的反电动势。
通信模块通过串口与主控连接,ESP8266的工作电压为3.3V,与STM32电平兼容,直接连接即可。为增强无线信号稳定性,我在PCB上预留了外接天线接口,实际部署时可根据需要安装高增益天线。
关键硬件参数配置表:
| 模块 | 型号 | 关键参数 | 接口方式 |
|---|---|---|---|
| 主控MCU | STM32F103C8T6 | 72MHz, 64KB Flash, 20KB RAM | - |
| 土壤湿度传感器 | YL-69 | 检测深度38mm, 工作电压3.3-5V | ADC1_IN0 |
| 肥料浓度传感器 | MQ-135 | 检测范围10-1000ppm, 响应时间<10s | ADC1_IN1 |
| WiFi模块 | ESP8266-01S | 支持802.11b/g/n, 内置TCP/IP协议栈 | USART1 |
| 继电器 | SRD-05VDC-SL-C | 触点容量10A/250VAC | GPIOB.12 |
硬件集成时,我特别注意了电磁兼容性问题。模拟信号线与数字信号线分开布线,电源路径尽量短而宽,关键信号线添加了屏蔽层。整个控制箱采用IP65防护等级,确保在野外环境中能长期稳定工作。
3. 嵌入式软件设计与实现
嵌入式软件采用Keil MDK开发环境,基于HAL库进行开发。软件架构采用前后台系统设计,主循环处理正常任务,中断处理紧急事件。
系统初始化包括时钟配置、GPIO初始化、ADC校准和串口设置。STM32的时钟树配置较为复杂,我使用STM32CubeMX生成初始化代码,将系统时钟设置为72MHz,ADC时钟分频为12MHz(最大允许14MHz),确保采样率满足需求。
// 系统时钟配置
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
// 配置HSE和PLL
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 配置系统时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}
数据采集任务通过ADC多通道扫描实现。我配置ADC1的通道0和通道1分别采集土壤湿度和肥料浓度,采用DMA传输减少CPU开销。采样值经过移动平均滤波后,转换为实际物理值。
// ADC数据采集处理
void ADC_Process(void)
{
// 读取ADC原始值
uint16_t soil_moisture_raw = adc_buffer[0];
uint16_t fertilizer_raw = adc_buffer[1];
// 移动平均滤波
soil_moisture_filter = (soil_moisture_filter * 0.9) + (soil_moisture_raw * 0.1);
fertilizer_filter = (fertilizer_filter * 0.9) + (fertilizer_raw * 0.1);
// 转换为实际值
soil_moisture = (soil_moisture_filter / 4095.0) * 100.0; // 百分比
fertilizer_concentration = (fertilizer_filter / 4095.0) * 1000.0; // ppm
}
控制逻辑采用有限状态机实现,根据当前传感器数据和系统状态决定执行机构动作。我设置了手动和自动两种模式,在自动模式下,系统比较当前值与阈值,决定是否启动灌溉或施肥。
// 控制状态机
void Control_FSM(void)
{
switch(current_state)
{
case STATE_IDLE:
if(soil_moisture < SOIL_MOISTURE_THRESHOLD)
current_state = STATE_WATERING;
else if(fertilizer_concentration < FERTILIZER_THRESHOLD)
current_state = STATE_FERTILIZING;
break;
case STATE_WATERING:
HAL_GPIO_WritePin(WATER_PUMP_GPIO_Port, WATER_PUMP_Pin, GPIO_PIN_SET);
if(soil_moisture >= SOIL_MOISTURE_THRESHOLD + 5) // hysteresis
current_state = STATE_IDLE;
break;
case STATE_FERTILIZING:
HAL_GPIO_WritePin(FERTILIZER_PUMP_GPIO_Port, FERTILIZER_PUMP_Pin, GPIO_PIN_SET);
if(fertilizer_concentration >= FERTILIZER_THRESHOLD + 50)
current_state = STATE_IDLE;
break;
}
}
WiFi通信任务负责与云端数据交换。我实现了MQTT客户端,定时发布传感器数据,并订阅控制主题接收远程指令。为节省流量,我设置了数据变化上报机制,只有数据变化超过一定幅度时才上报。
4. 云端平台与移动端开发
云端平台选择阿里云IoT平台,其主要优势在于提供完整的设备管理能力和海量数据存储服务。我在平台上创建了产品型号,定义了设备功能点(土壤湿度、肥料浓度、水泵状态等),生成了设备三元组(ProductKey、DeviceName、DeviceSecret)用于设备认证。
设备连接采用MQTT over TLS加密通信,确保数据传输安全。我使用ESP8266的AT固件支持SSL加密,虽然增加了计算开销,但对于农业数据保护是必要的。连接成功后,设备定期发布JSON格式的传感器数据:
{
"id": "1234567890",
"version": "1.0",
"params": {
"soil_moisture": 45.6,
"fertilizer_concentration": 320,
"water_pump_status": 0,
"fertilizer_pump_status": 0
},
"method": "thing.event.property.post"
}
云端规则引擎将数据转发到TSDB时序数据库存储,同时触发数据流转到函数计算服务进行异常检测。我编写了简单的函数代码,当检测到土壤湿度持续低于阈值时,自动发送报警通知到手机APP。
移动端采用Android平台开发,使用MQTT协议直接与设备通信,同时也通过REST API从云端获取历史数据。主界面显示当前传感器数据和控制按钮,数据趋势以图表形式展示,支持按时间范围查询历史数据。
云端数据处理流程:
- 设备上传原始数据到IoT平台
- 规则引擎数据解析和转发
- 时序数据库长期存储
- 函数计算实时分析
- 手机APP实时展示和控制
- 微信小程序轻量级访问
在实际部署中,我发现农村地区的网络覆盖并不理想,因此增加了离线工作模式。设备在网络中断时继续本地自动控制,同时缓存重要数据,待网络恢复后补传数据,确保系统可靠性。
5. 系统测试与性能优化
系统开发完成后,我进行了全面的测试,包括单元测试、集成测试和现场测试。测试不仅验证功能正确性,还评估系统在恶劣环境下的可靠性。
硬件测试主要包括传感器精度校准和执行机构响应测试。我使用标准土壤湿度计和气体检测仪作为参考,对比测量结果,建立传感器原始值与实际物理量的对应关系。发现YL-69传感器对不同土壤类型的响应特性差异较大,为此我增加了土壤类型选择功能,用户可根据实际土壤设置校准参数。
软件测试重点验证边界条件下的系统行为。我模拟了传感器故障、网络中断、电源波动等异常情况,确保系统能够正确处理异常而不崩溃。特别是测试了突然断电后的恢复能力,增加了状态保存机制,重启后能恢复之前的工作状态。
现场测试在实际农田中进行,连续运行30天,记录系统性能数据。测试期间发现了几个关键问题:阳光直射导致传感器测量误差、晨露造成电路板短路风险、昆虫进入设备箱等。针对这些问题,我增加了防晒罩、防水涂层和防虫网等改进措施。
性能优化措施:
- 功耗优化:采用间歇工作模式,CPU大部分时间处于睡眠状态,只有定时采集时才唤醒
- 通信优化:压缩传输数据,减少MQTT报文大小,节省流量和功耗
- 控制算法优化:增加滞后环防止执行机构频繁启停,延长设备寿命
- 内存优化:使用内存池管理动态内存,避免内存碎片问题
经过优化后,系统平均功耗从85mA降至22mA,可以使用太阳能电池板供电,真正实现能源自给。数据传输量减少60%,即使在信号较弱的地区也能稳定通信。
6. 实际部署与运维经验
项目最终部署在朋友的蔬菜大棚中,覆盖面积约2亩地。部署过程中遇到了许多预料之外的问题,这些经验对后续项目很有借鉴意义。
设备安装位置选择很有讲究。最初我将土壤传感器插入地面约10cm深度,但发现测量值不能准确反映作物根区的实际情况。后来请教了农业专家,了解到不同作物的根系深度不同,需要根据具体作物调整传感器安装深度。现在通常安装在不同深度的多个传感器,全面监测土壤情况。
网络连接是另一个挑战。大棚内信号强度往往较弱,我尝试了多种方案:首先使用ESP8266自带天线,信号不稳定;然后改用外接天线,有所改善但仍不理想;最后部署了LoRaWAN网关作为中继,彻底解决了覆盖问题。虽然增加了成本,但保证了通信可靠性。
维护方面,我建立了远程诊断系统,设备定期自检并报告状态。通过手机APP可以查看设备健康度,提前预警潜在故障。我还编写了详细的维护手册,指导用户如何进行日常清洁、校准和更换耗材。
注意:农业电子设备需要定期维护,特别是传感器探头容易因土壤腐蚀而性能下降。建议每月清洁一次传感器,每季度进行一次全面校准,确保测量准确性。
这个项目给我的最大启示是:技术方案必须紧密结合实际应用场景。实验室环境下运行完美的系统,到了真实农田中可能会遇到各种意想不到的问题。只有深入了解农业生产的实际需求,才能设计出真正实用的智能农业系统。
现在这套系统已经稳定运行半年多,朋友反馈说不仅节省了人工成本,水肥利用率也提高了30%左右。最近我正在开发第二代产品,增加了图像识别功能,能够根据作物生长状态调整灌溉策略,让农业生产更加智能化。
175



被折叠的 条评论
为什么被折叠?



