这个基于单片机的家庭花卉智能灌溉系统,是我去年为邻居王大爷解决阳台花草养护问题时的意外收获。当时看到他每天早晚定时给二十多盆植物浇水,既费时又经常因为出差忘记照顾,我就琢磨着能不能做个自动化方案。没想到这个简单的想法,最终演化成了一个功能完备的智能灌溉系统,还顺带完成了我的毕业设计。
系统核心是通过土壤湿度传感器实时监测盆栽状态,当检测到土壤干燥时自动启动水泵浇水,同时支持手机APP远程控制和手动模式切换。最让我自豪的是,整套硬件成本不到100元,却实现了市售上千元智能花盆的基础功能。下面我就把这个项目的完整实现过程拆解给大家,包括硬件选型、电路设计、程序逻辑以及那些只有实际动手才会遇到的"坑"。
系统采用典型的嵌入式三层架构:
特别说明选择STM32而不是更常见的Arduino的原因:首先,STM32的72MHz主频能更好处理多传感器数据;其次,其丰富的外设接口方便后续扩展;最重要的是,Cortex-M3内核的低功耗特性特别适合需要长期运行的灌溉系统。实测下来,整套系统待机电流仅15mA,接个充电宝能连续工作两周。
土壤湿度传感器:对比了电阻式和电容式两种:
水泵选择:
储水方案:
测试过多种容器后,发现5L的农夫山泉桶最实用:
主控电路采用经典的STM32最小系统:
code复制[电路图示意]
PA0 - 土壤湿度传感器AO
PA1 - DHT11数据线
PA2 - 继电器控制
USART1 - ESP8266 WiFi模块
特别注意:所有传感器信号线都加了10K上拉电阻,这是调试时发现的必要措施,否则DHT11会频繁无响应。
电源部分采用双路设计:
手工焊接时发现几个关键点:
采用前后台系统架构:
c复制void main() {
hardware_init();
while(1) {
read_sensors();
control_logic();
uart_handler(); // 处理WiFi指令
delay_ms(100);
}
}
传感器读取采用状态机实现,避免阻塞:
c复制enum { INIT, REQUEST, READ } dht_state;
void read_dht11() {
switch(dht_state) {
case INIT: 拉低总线18ms; break;
case REQUEST: 等待传感器响应; break;
case READ: 解析40bit数据; break;
}
}
经过多次试验,总结出最佳灌溉策略:
这个算法有效避免了频繁启停水泵,实测能使土壤湿度稳定在±5%范围内。关键参数存储在STM32的Flash中,支持APP远程修改。
使用ESP8266模块通过AT指令与STM32通信:
code复制AT+CIPSTART="TCP","api.xxx.com",80
AT+CIPSEND=48
GET /update?key=XXX&field1=25.6 HTTP/1.1
数据上传到OneNET平台,再通过APP查询。调试时发现必须严格遵循以下时序:
用3mm亚克力板制作了分层支架:
重要经验:水箱一定要高于花盆形成重力辅助,这样能减轻水泵负担。我的设计是采用壁挂式安装,用免钉胶固定支架,既美观又不破坏墙面。
经过多次迭代,最终方案是:
每个花盆配置1-2个滴头,通过调节管夹控制流量。特别提醒:首次使用前要用醋水循环清洗管路,防止藻类滋生。
湿度值跳变:
DHT11无响应:
启动后立即停止:
出水流量小:
频繁断线:
数据上传失败:
在实际使用三个月后,发现几个值得改进的点:
最近尝试在原有系统上加装了摄像头,通过OpenMV识别植物叶片状态,当检测到萎蔫时触发紧急灌溉。这个功能在出差时特别有用,有次成功救活了王大爷的宝贝兰花。