STM32F407实战:用YF-S401水流量传感器DIY一个智能浇花系统(附完整代码)
STM32F407实战用YF-S401水流量传感器DIY智能浇花系统周末在家给绿植浇水时突然想到能不能做个自动浇花装置既省事又能精确控制水量。翻出吃灰的STM32开发板和YF-S401传感器决定动手实现这个想法。下面分享从硬件搭建到代码实现的完整过程特别适合想玩嵌入式又苦于没有实际项目的朋友。1. 硬件选型与搭建1.1 核心器件清单这次项目用到的关键部件都不贵大部分在50元以内器件名称型号规格数量参考价格主控芯片STM32F407ZGT61¥45水流量传感器YF-S4011¥28微型水泵DC12V 3W1¥15继电器模块5V单路1¥5OLED显示屏0.96寸SSD13061¥12特别说明YF-S401的流量系数需要实测校准我的测试数据是每升水约产生4800个脉冲与官方参数有差异。1.2 电路连接示意图整个系统的接线逻辑很简单STM32 GPIO PB7 - 继电器IN 继电器OUT - 水泵正极 水泵负极 - GND YF-S401 VCC - 5V GND - GND OUT - PA11(EXTI) OLED I2C - PB6/PB7注意水泵功率较大时建议单独供电避免开发板电源过载。我在测试时烧过一个LDO稳压芯片后来改用外接12V/2A电源就稳定了。2. 软件架构设计2.1 关键功能逻辑系统采用中断驱动架构主要处理三个事件定时中断每秒计算一次流量外部中断捕获传感器脉冲湿度检测ADC读取土壤湿度可选// 全局变量结构体 typedef struct { uint32_t pluse_1s; // 1秒脉冲计数 float acculat; // 累计流量(mL) float instant; // 瞬时流量(L/min) uint8_t receive_flag; // 计算标志位 } GOLBAL_FLOW;2.2 CubeMX配置要点使用STM32CubeMX可以快速完成基础配置TIM7基础定时器Prescaler: 8400-1Counter Period: 10000-1产生1秒中断PA11外部中断下降沿触发上拉模式I2C1接口用于OLED显示标准模式(100kHz)3. 核心代码实现3.1 流量计算模块在YFS401.c中实现流量换算算法void Flow_Calculate(GOLBAL_FLOW *flow) { const float pulsePerLiter 4800.0f; // 实测值 if(flow-pluse_1s 0) { flow-acculat (flow-pluse_1s * 1000 / pulsePerLiter); // mL flow-instant flow-pluse_1s / 80.0f; // L/min } else { flow-instant 0; } // 串口调试输出 printf(瞬时:%.2f L/min 累计:%.2f mL\n, flow-instant, flow-acculat); flow-pluse_1s 0; // 清零计数器 }3.2 浇水控制逻辑通过继电器控制水泵启停加入防抖处理void Watering_Control(float soilHumidity) { static uint32_t lastTick 0; // 土壤湿度低于30%启动浇水 if(soilHumidity 30.0f HAL_GetTick() - lastTick 5000) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); lastTick HAL_GetTick(); } // 累计浇水量达500mL或湿度达标时停止 else if(flow.acculat 500.0f || soilHumidity 60.0f) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); } }4. 功能扩展与优化4.1 OLED界面设计使用u8g2库驱动OLED显示关键信息void Display_Update(void) { u8g2_ClearBuffer(u8g2); u8g2_SetFont(u8g2, u8g2_font_6x10_tf); u8g2_DrawStr(u8g2, 0, 10, 智能浇花系统); char buf[32]; snprintf(buf, sizeof(buf), 湿度:%.1f%%, soilHumidity); u8g2_DrawStr(u8g2, 0, 25, buf); snprintf(buf, sizeof(buf), 水量:%.0fmL, flow.acculat); u8g2_DrawStr(u8g2, 0, 40, buf); u8g2_SendBuffer(u8g2); }4.2 低功耗优化对于电池供电场景可以加入睡眠模式void Enter_StopMode(void) { // 配置唤醒源 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化时钟 SystemClock_Config(); }5. 实际部署建议传感器安装技巧在水管入口处加装过滤器保持传感器水平安装使用生料带密封螺纹接口常见问题排查流量读数不稳 → 检查电源是否干净水泵不工作 → 测量继电器线圈电压OLED无显示 → 确认I2C地址(通常0x78或0x7A)进阶改进方向添加WiFi模块远程控制实现多区域分区灌溉加入天气预报数据联动整个项目最耗时的部分是YF-S401的流量系数校准建议先用量杯接水测试记录脉冲数与实际水量的对应关系。我的完整工程代码已上传GitHub搜索STM32-Smart-Watering包含PCB设计文件和手机APP控制端源码。