STM32实战:雨滴与土壤湿度传感器的智能环境监测系统搭建

张开发
2026/4/16 10:49:27 15 分钟阅读

分享文章

STM32实战:雨滴与土壤湿度传感器的智能环境监测系统搭建
1. 项目背景与系统设计想象一下你正在打理一个小型家庭花园每天最头疼的就是判断什么时候该浇水。浇多了植物会烂根浇少了又会干枯。这时候如果有个自动监测系统能告诉你土壤湿度状况甚至能预测雨天来临是不是特别实用这就是我们今天要搭建的智能环境监测系统。这个系统的核心是STM32微控制器搭配雨滴传感器和土壤湿度传感器。我选择STM32F103C8T6这款芯片价格亲民性能足够特别适合DIY项目。两个传感器都采用模拟量数字量双输出设计既能获取精确数据又能快速判断阈值。系统工作流程是这样的传感器实时采集环境数据STM32通过ADC模块读取模拟信号同时检测数字信号状态。处理后的数据可以通过OLED屏幕直观显示比如土壤湿度百分比、雨水强度等级。我还设计了一个简单的LED报警系统当数据超过设定阈值时会亮灯提醒。2. 硬件选型与电路连接2.1 传感器深度解析雨滴传感器我选用的是常见的LM393模块它的感应板设计很巧妙。我拆开看过铜箔走线呈梳齿状交错排列这种设计能最大化接触面积。实测下来从干燥到完全浸湿电阻值变化范围在10MΩ到200kΩ之间灵敏度完全够用。土壤湿度传感器要注意选择镀金探头的版本。我刚开始贪便宜买了普通探头结果用不到两周就氧化了。后来换了镀金款虽然贵了20块钱但使用寿命明显延长。探头长度建议选10cm的太短了检测不到深层土壤湿度。2.2 硬件连接详解具体接线时要注意几个关键点传感器VCC接3.3V或5V都可以但STM32的ADC参考电压是3.3V如果想统一标准就直接用3.3V模拟输出(AO)接STM32的PA1引脚这个引脚支持ADC1通道1数字输出(DO)接PA0配置为上拉输入模式OLED屏幕使用I2C接口接PB6(SCL)和PB7(SDA)第一次搭建时我犯了个低级错误把传感器的GND接错了位置导致ADC读数一直不稳定。后来用万用表排查才发现问题。建议大家接线时先用不同颜色的杜邦线区分功能这样排查故障会方便很多。3. STM32开发环境配置3.1 工程搭建要点我习惯用Keil MDK开发STM32这里分享几个实用技巧新建工程时一定要选对芯片型号STM32F103C8T6属于Medium-density系列在Manage Run-Time Environment里勾选CMSIS核心和Device Startup添加必要的库文件stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_adc.cADC配置有个坑要注意STM32的ADC时钟不能超过14MHz。我一开始把APB2时钟设为72MHzADC分频设为2结果读数一直不准。后来改成6分频(12MHz)就正常了。3.2 关键外设初始化代码ADC初始化要特别注意采样时间的设置void ADC1_Init(void) { // 开启GPIOA和ADC1时钟 RCC-APB2ENR | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_ADC1EN; // 配置PA1为模拟输入 GPIOA-CRL ~GPIO_CRL_CNF1; GPIOA-CRL ~GPIO_CRL_MODE1; // ADC校准 ADC1-CR2 | ADC_CR2_ADON; delay_ms(1); ADC1-CR2 | ADC_CR2_CAL; while(ADC1-CR2 ADC_CR2_CAL); // 设置采样时间 239.5周期 ADC1-SMPR2 | ADC_SMPR2_SMP1_0 | ADC_SMPR2_SMP1_1 | ADC_SMPR2_SMP1_2; // 规则通道配置 ADC1-SQR1 ~ADC_SQR1_L; ADC1-SQR3 ADC_SQR3_SQ1_1; }4. 传感器数据处理算法4.1 模拟信号处理技巧直接从ADC读到的数值需要经过两步处理才有实用价值转换为电压值voltage adc_value * 3.3 / 4095映射到实际物理量比如土壤湿度0-100%对应电压1.1V-2.8V我建议采用滑动平均滤波来消除瞬时干扰#define FILTER_LEN 10 float filter_buf[FILTER_LEN]; uint8_t filter_index 0; float moving_average(float new_val) { filter_buf[filter_index] new_val; if(filter_index FILTER_LEN) filter_index 0; float sum 0; for(int i0; iFILTER_LEN; i){ sum filter_buf[i]; } return sum / FILTER_LEN; }4.2 数字信号应用场景数字输出(DO)适合做快速响应。比如检测到开始下雨时立即触发保护动作if(GPIOA-IDR GPIO_IDR_IDR0){ // 无雨状态 }else{ // 检测到下雨 emergency_protect(); }阈值调节有个小技巧先用ADC读取当前环境值然后调节电位器直到DO状态变化这时就是最合适的阈值点。5. 系统集成与功能扩展5.1 OLED显示优化我用的是0.96寸SSD1306屏幕显示内容分为三个区域顶部状态栏显示系统运行时间和电池电量(如果使用)中间主区域大号字体显示土壤湿度百分比和雨量等级底部状态栏显示报警信息和阈值设置为了提升用户体验我设计了简单的动画效果。当数值变化时会有过渡动画而不是直接跳变。实测下来这种细节能显著提升使用体验。5.2 报警功能实现除了基本的LED报警我还增加了蜂鸣器提示。报警策略采用三级预警一级预警(湿度30%)慢闪LED二级预警(湿度20%)快闪LED间歇蜂鸣三级预警(湿度10%)常亮LED持续蜂鸣实际部署时发现蜂鸣器太吵后来改成只有二级以上预警才会触发声音提示。6. 系统调试与优化6.1 常见问题排查ADC读数不稳是新手常见问题我总结了几点经验确保电源稳定最好给模拟部分单独加滤波电容检查接地是否良好模拟地和数字地要在一点连接适当增加采样时间特别是高阻抗信号源时避免在ADC转换期间操作其他大电流外设有一次调试时发现土壤湿度读数周期性波动最后发现是因为旁边有手机在充电电磁干扰导致的。给传感器线缆加磁环后问题解决。6.2 功耗优化技巧如果使用电池供电功耗优化很重要采用间歇工作模式每10秒唤醒一次采集完立即休眠关闭未用外设时钟比如用不到USART就关掉其时钟降低主频在满足需求前提下主频越低功耗越小使用DMA传输数据减少CPU工作时间实测下来优化后的系统用2000mAh锂电池可以连续工作3个月以上。7. 项目进阶方向完成基础功能后可以考虑这些扩展增加WiFi模块上传数据到云端结合历史数据预测浇水时间添加温度传感器完善环境监测开发手机APP远程查看数据我最近在尝试用太阳能供电配合超级电容做能量缓冲目标是做成完全无线的监测节点。不过遇到阴雨天续航问题还在优化中。

更多文章