1. 项目背景与核心功能
家里养绿植的朋友应该都有过这样的体验:出差几天回来,发现心爱的盆栽要么干枯发黄,要么积水烂根。传统的定时浇水方式很难适应不同植物的需求,而手动浇水又太依赖人的记忆。这就是为什么我们需要一个能自动感知土壤湿度、远程控制的智能灌溉系统。
这个毕业设计项目使用STM32F103C8T6单片机作为大脑,搭配蓝牙模块实现手机远程操控。实测下来,系统可以稳定实现三大核心功能:
- 智能监测:通过土壤湿度传感器实时检测含水量,精度能达到±3%RH
- 自动灌溉:当湿度低于设定下限时自动启动水泵,超过上限自动停止
- 远程控制:用手机蓝牙连接后,可以查看实时数据、手动开关水泵、调整阈值
我去年帮学生调试这个项目时,发现加上OLED显示屏后体验提升明显。屏幕不仅能显示当前湿度和阈值,还能直观看到水泵工作状态,比单纯用LED指示灯友好得多。
2. 硬件设计详解
2.1 核心部件选型
主控芯片选择STM32F103C8T6是经过实际对比的。相比STC89C52,它的优势非常明显:
| 参数 | STM32F103C8T6 | STC89C52 |
|---|---|---|
| 主频 | 72MHz | 11.0592MHz |
| Flash | 64KB | 8KB |
| RAM | 20KB | 512B |
| ADC通道 | 10位精度×16通道 | 需外接ADC芯片 |
| 开发环境 | Keil MDK/STM32CubeIDE | Keil C51 |
蓝牙模块推荐HC-05,价格便宜(约15元)且稳定。我在测试时发现,它的有效传输距离在无障碍环境下能达到8米,完全满足家庭使用。注意要买带底板的那种,直接引出VCC、GND、TXD、RXD四个引脚,接线更方便。
2.2 传感器电路设计
土壤湿度传感器建议用YL-69,它的探针做了镀金处理,比普通不锈钢的更耐腐蚀。接线时要注意:
// STM32引脚配置 #define SOIL_SENSOR_PIN PA0 // 接AO引脚 void ADC_Init() { RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; ADC1->CR2 = ADC_CR2_ADON; // 其他配置省略... }实测中发现一个常见问题:传感器长期插在土里会导致电解腐蚀。解决办法有两种:要么采用间歇供电(测量时才通电),要么选用电容式传感器(如SEN0193)。
3. 软件实现关键点
3.1 湿度控制逻辑
主控制程序采用状态机设计,这是我在多个项目中验证过的稳定方案:
typedef enum { STATE_NORMAL, STATE_DRY, STATE_WATERING, STATE_TOO_WET } SystemState; void ManageWatering() { static SystemState state = STATE_NORMAL; uint16_t humidity = GetSoilHumidity(); switch(state) { case STATE_NORMAL: if(humidity < HUMI_MIN) { StartPump(); state = STATE_WATERING; } break; case STATE_WATERING: if(humidity > HUMI_MAX) { StopPump(); state = STATE_NORMAL; } break; // 其他状态处理... } }3.2 蓝牙通信协议
为了让手机APP能稳定通信,我设计了一套简单的协议格式:
[HEAD][LEN][CMD][DATA][CHECKSUM]其中:
- HEAD固定为0xAA
- LEN是DATA长度
- CMD包括0x01(读取数据)、0x02(设置阈值)等
- CHECKSUM是异或校验
在STM32端,用串口中断接收数据:
void USART1_IRQHandler() { if(USART1->SR & USART_SR_RXNE) { uint8_t ch = USART1->DR; // 解析协议... } }4. 低功耗优化技巧
很多同学忽略了一个问题:系统要长期插电工作,功耗很重要。通过实测发现几个优化点:
- 传感器供电控制:用MOS管控制传感器电源,测量时才通电
- STM32睡眠模式:在空闲时进入Stop模式,功耗从25mA降到0.5mA
- 蓝牙模块配置:AT+ROLE=0设置从模式,AT+PSAV=1开启低功耗
我的测试数据显示,优化后系统待机电流从58mA降到了3.2mA,用2000mAh的充电宝可以连续工作25天。
5. 常见问题解决方案
在实验室带学生做这个项目时,最常遇到三个问题:
问题1:蓝牙连接不稳定
- 检查天线是否完全展开
- 避开2.4G干扰源(如WiFi路由器)
- 修改AT+UART=115200,0,0提高波特率
问题2:水泵启动导致系统复位
- 在继电器线圈加续流二极管
- 给STM32加1000μF电容
- 电源线要足够粗(建议18AWG)
问题3:土壤湿度读数跳变
- 在软件中做滑动滤波
#define FILTER_LEN 5 uint16_t FilterValue(uint16_t new_val) { static uint16_t buf[FILTER_LEN]; static uint8_t index = 0; buf[index++] = new_val; if(index >= FILTER_LEN) index = 0; uint32_t sum = 0; for(int i=0; i<FILTER_LEN; i++) sum += buf[i]; return sum / FILTER_LEN; }6. 扩展功能建议
如果想拿高分,可以考虑这些加分项:
- 多盆栽管理:用74HC595扩展IO,控制多个水泵
- 历史数据记录:加SPI Flash存储30天数据
- 微信小程序控制:换ESP8266模块,成本只增加10元
- 光照联动:加BH1750传感器,根据光线调整浇水策略
去年有个学生加入了植物生长灯控制,在答辩时演示自动补光功能,最后拿了优秀毕业设计。其实硬件上只是多了个MOS管驱动电路,但展示效果很好。
7. 实物制作注意事项
打PCB时推荐用嘉立创的SMT贴片服务,比自己焊接省事很多。几个实用建议:
- 板子尺寸控制在10×10cm内(打样5元)
- 所有IO口引出测试点
- 电源走线宽度不小于0.3mm
- 预留SWD调试接口
测试时一定要先烧录这个死循环程序,确认所有电源电压正常:
while(1) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500); }最后提醒大家,答辩前准备个漂亮的亚克力外壳,淘宝定制大概30元,比裸板演示专业得多。记得在侧面开孔露出土壤传感器,方便评委观察。