1. 项目背景与核心功能
这个毕设项目是我在农业物联网领域的一次完整实践,通过STM32微控制器结合WiFi模块,实现了农田环境的远程监控与自动化灌溉。整套系统最核心的创新点在于将传统农业灌溉的"经验判断"升级为"数据驱动决策",同时通过可视化界面让非技术人员也能直观掌握田间状态。
系统硬件部分采用STM32F103C8T6作为主控,搭配DHT11温湿度传感器、土壤湿度传感器和继电器控制的电磁阀组成终端节点。数据通过ESP8266 WiFi模块上传到云端服务器,我用Python+Flask搭建了后端服务,前端采用ECharts实现动态数据可视化。当土壤湿度低于设定阈值时,系统会自动触发灌溉,同时支持手机APP远程手动控制。
提示:选择STM32F103C8T6是因为其性价比高(约10元/片),且具备足够的GPIO和UART接口,完全满足传感器数据采集和WiFi通信需求。ESP8266-01S模块价格仅15元左右,整套硬件成本可控制在200元以内。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件系统设计与实现
2.1 主控电路设计
主控板采用最小系统设计,包括:
- STM32F103C8T6核心电路
- 3.3V/5V双路LDO电源(AMS1117-3.3和LM7805)
- SWD调试接口(节省空间未用JTAG)
- 传感器接口扩展排针
电路设计时特别注意了防反接保护,在电源输入端加入了SS34肖特基二极管。实测中发现,如果直接连接5V电源,在频繁插拔时容易烧毁芯片,加入二极管后彻底解决了这个问题。
2.2 传感器选型与接口
土壤湿度检测对比了电阻式和电容式两种方案:
| 传感器类型 | 优点 | 缺点 | 最终选择 |
|---|---|---|---|
| 电阻式 | 价格低(5元) | 易腐蚀 | 否 |
| 电容式 | 不直接接触土壤(15元) | 需校准 | 是 |
电容式传感器通过ADC1_IN0通道连接,代码中需要做非线性校准:
c复制// 土壤湿度校准公式(实测数据拟合)
float GetSoilHumidity(uint16_t adc_val) {
return 0.0002*adc_val*adc_val - 0.3567*adc_val + 158.3;
}
2.3 WiFi通信模块
ESP8266配置为STA模式,通过AT指令与STM32交互。关键配置步骤:
- 发送AT+CWMODE=1设置客户端模式
- AT+CWJAP="SSID","password"连接路由器
- AT+CIPSTART="TCP","服务器IP",8080建立连接
注意:ESP8266的TX应接STM32的PA3(USART2_RX),RX接PA2(USART2_TX)。我最初接反导致通信失败,用逻辑分析仪才排查出问题。
3. 软件系统架构
3.1 下位机程序框架
采用裸机开发,没有上RTOS,通过状态机实现多任务调度:
c复制while(1) {
switch(sys_state) {
case SENSOR_READ:
Read_DHT11();
Read_Soil_Humidity();
break;
case WIFI_SEND:
ESP8266_SendData();
break;
case VALVE_CTRL:
if(humidity < threshold) Relay_On();
break;
}
Delay_ms(100);
}
传感器数据打包为JSON格式发送:
json复制{
"device_id": "farm01",
"temp": 25.3,
"humidity": 60.2,
"soil": 45.7,
"timestamp": 1654321000
}
3.2 云端服务搭建
使用阿里云ECS(1核2G配置)部署服务端:
- Nginx做反向代理
- Flask处理HTTP请求
- MySQL存储历史数据
- Redis缓存实时数据
关键API接口:
python复制@app.route('/api/data', methods=['POST'])
def receive_data():
data = request.get_json()
# 数据校验
if not all(k in data for k in ['device_id','temp','humidity','soil']):
return jsonify({'status':'error'}), 400
# 存入数据库
db.session.add(SensorData(
device_id=data['device_id'],
temperature=data['temp'],
humidity=data['humidity'],
soil_moisture=data['soil']
))
db.session.commit()
return jsonify({'status':'success'}), 200
3.3 可视化前端实现
采用Vue.js + ECharts构建看板,核心功能点:
- 实时数据曲线(WebSocket推送)
- 历史数据查询(日期选择器)
- 阈值设置与报警提示
- 设备状态监控
灌溉控制逻辑流程图:
mermaid复制graph TD
A[获取土壤湿度] --> B{湿度<阈值?}
B -->|是| C[开启电磁阀]
B -->|否| D[关闭电磁阀]
C --> E[持续检测]
D --> E
4. 关键问题与解决方案
4.1 WiFi断连重连机制
现场测试发现ESP8266在信号弱时会断连,改进方案:
- 增加心跳包(每30秒发送"AT"指令)
- 三次失败后执行软重启
- 保存未发送数据到EEPROM
c复制void WiFi_KeepAlive() {
static uint8_t retry = 0;
if(ESP8266_SendCmd("AT", "OK", 1000) != 0) {
retry++;
if(retry > 3) {
ESP8266_Reset();
retry = 0;
}
}
}
4.2 传感器数据滤波
土壤湿度传感器存在波动,采用滑动平均滤波:
c复制#define FILTER_LEN 5
uint16_t filter_buf[FILTER_LEN];
uint16_t Filter_ADC(uint16_t new_val) {
static uint8_t index = 0;
filter_buf[index] = new_val;
index = (index + 1) % FILTER_LEN;
uint32_t sum = 0;
for(uint8_t i=0; i<FILTER_LEN; i++) {
sum += filter_buf[i];
}
return sum / FILTER_LEN;
}
4.3 低功耗优化
为延长电池供电时的使用时间,采取以下措施:
- STM32进入Stop模式,通过RTC定时唤醒(每小时1次)
- 传感器供电改用MOSFET控制(采样时上电)
- ESP8266发送完成后立即进入深度睡眠
实测电流对比:
| 模式 | 原始方案 | 优化后 | 节电效果 |
|---|---|---|---|
| 运行 | 85mA | 65mA | 23% |
| 待机 | 15mA | 0.8mA | 95% |
5. 项目扩展与改进方向
当前系统已稳定运行3个月,后续计划:
- 增加LoRa组网功能,解决WiFi覆盖不足问题
- 引入机器学习算法,根据历史数据预测灌溉需求
- 开发微信小程序替代网页端
- 添加摄像头模块实现作物生长监测
硬件成本明细表:
| 部件 | 型号 | 单价 | 数量 | 小计 |
|---|---|---|---|---|
| MCU | STM32F103C8T6 | 10.5 | 1 | 10.5 |
| WiFi模块 | ESP8266-01S | 15.8 | 1 | 15.8 |
| 土壤传感器 | CAP-01 | 16.0 | 2 | 32.0 |
| 温湿度传感器 | DHT11 | 5.5 | 1 | 5.5 |
| 继电器模块 | 5V单路 | 3.2 | 1 | 3.2 |
| 其他 | PCB/线材等 | - | - | 25.0 |
| 合计 | 92.0 |
在田间部署时发现,电磁阀直接控制220V水泵存在安全隐患,后来改用12V直流隔膜泵,虽然扬程降低但安全性大幅提升。这个经验告诉我,农业电子设备必须把可靠性放在第一位,有时需要牺牲部分性能来换取更高的稳定性。
