这个基于STM32的WIFI远程可视化农业灌溉系统是我指导学弟学妹完成的毕业设计项目,它完美结合了嵌入式系统、物联网技术和农业自动化需求。系统采用STM32F103RCT6作为主控芯片,通过多种传感器实时监测环境参数,实现了智能化的农业灌溉控制。
在实际应用中,我们发现这个系统特别适合小型温室、家庭菜园或实验性农业种植场景。相比传统定时灌溉方式,它能根据土壤实际含水量和环境条件进行精准控制,节水效果显著。测试数据显示,在相同种植条件下,这套系统能节省约30%的用水量。
提示:选择STM32F103RCT6是因为它兼具性价比和丰富的外设接口,特别适合学生毕设项目。它有256KB Flash和48KB RAM,完全能满足本系统的数据处理需求。
整个系统的硬件架构可以分为四个主要部分:

系统软件采用模块化设计,主要工作流程如下:
初始化阶段:
主循环任务:
c复制while(1) {
read_sensors(); // 读取所有传感器数据
update_display(); // 刷新本地显示屏
send_to_server(); // 上传数据到远程服务器
if(auto_mode) { // 自动模式判断
check_threshold();
}
handle_commands(); // 处理远程控制指令
delay_ms(1000); // 1秒周期
}
中断服务:
主控电路采用STM32F103RCT6最小系统设计,包含以下关键部分:
电源电路:
复位电路:
时钟电路:
注意:PCB布局时,晶振要尽量靠近MCU,走线等长,避免高频干扰。
采用电阻式土壤湿度传感器,设计要点:
code复制Vout = Vcc * (R_sensor / (R_sensor + R_fixed))
数字接口设计:
水泵驱动电路设计:
plaintext复制STM32 GPIO → 1K电阻 → NPN三极管(BJT) → 继电器线圈
│
└─ 续流二极管
继电器选型参数:
传感器数据处理采用加权平均算法,提高测量稳定性:
c复制#define SAMPLE_TIMES 5
float read_soil_humidity(void) {
float sum = 0;
for(int i=0; i<SAMPLE_TIMES; i++) {
sum += ADC_GetValue(SOIL_CHANNEL) * 100 / 4095.0;
delay_ms(20);
}
return sum / SAMPLE_TIMES;
}
自动灌溉的核心算法:
c复制void check_threshold(void) {
if(soil_humidity < lower_threshold &&
temperature < 35 &&
!is_raining) {
start_watering();
}
if(soil_humidity > upper_threshold ||
is_raining) {
stop_watering();
}
}
ESP8266使用AT指令集,自定义的简单协议格式:
plaintext复制[STX][数据类型][数据长度][数据内容][CRC][ETX]
示例数据包:
code复制0x02 0x01 0x04 0x00 0x00 0x42 0x48 0x2A 0x03
实测中发现的问题及解决方案:
传感器信号滤波:
PCB布局改进:
针对电池供电场景的优化:
c复制void enter_low_power(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
SystemInit(); // 唤醒后需要重新初始化时钟
}
采用Python Flask框架搭建简易Web服务:
python复制from flask import Flask, request, jsonify
import sqlite3
app = Flask(__name__)
@app.route('/api/data', methods=['POST'])
def receive_data():
data = request.json
save_to_db(data)
return jsonify({"status": "success"})
def save_to_db(data):
conn = sqlite3.connect('irrigation.db')
c = conn.cursor()
c.execute('''INSERT INTO sensor_data
(temp, humidity, soil, light)
VALUES (?,?,?,?)''',
(data['temp'], data['humidity'],
data['soil'], data['light']))
conn.commit()
conn.close()
使用ECharts实现动态曲线展示:
javascript复制function updateChart() {
$.get('/api/history', function(data) {
let chart = echarts.init(document.getElementById('chart'));
let option = {
xAxis: {type: 'category', data: data.times},
yAxis: {type: 'value'},
series: [{
data: data.soil,
type: 'line',
smooth: true
}]
};
chart.setOption(option);
});
}
setInterval(updateChart, 5000);
在实际部署后,我们发现了几个有价值的扩展点:
太阳能供电系统:
多区域控制:
机器学习优化:
python复制from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(X_train, y_train) # 训练灌溉模型
LoRa远距离通信:
这个项目从最初的毕设原型,经过多次迭代已经发展成为一个实用的智能灌溉解决方案。特别是在小型农场和温室应用中表现优异,最大的收获是看到了理论知识如何转化为实际生产力。