当前位置: 首页 > news >正文

用STM32F103C8T6做个智能花盆:土壤湿度传感器ADC采集与OLED显示保姆级教程

用STM32F103C8T6打造智能花盆:从传感器到显示的完整实现指南

周末给阳台的多肉植物浇水时,突然想到能否用手边的STM32开发板做个自动监测装置。这个念头最终演变成了一个完整的智能花盆项目——通过土壤湿度传感器采集数据,在OLED屏上直观显示植物"口渴"程度。作为电子爱好者,我们追求的不仅是功能实现,更是理解每个环节的技术细节。

市面上大多数教程只给出代码片段,而本文将带你完整走通硬件连接、ADC采集、数据转换和显示输出的全流程。你会学到如何用STM32F103C8T6这块性价比极高的MCU,配合常见的YL-69土壤湿度传感器和0.96寸OLED,构建一个具有实用价值的智能园艺设备。

1. 项目规划与硬件选型

1.1 核心组件功能解析

STM32F103C8T6作为主控芯片,其内置的12位ADC模块是关键所在。这款Cortex-M3内核的MCU有高达72MHz的主频,足以流畅处理传感器数据转换和显示刷新。相比Arduino,STM32的ADC精度更高(4096级vs 1024级),特别适合需要精确测量的场景。

YL-69土壤湿度传感器的工作原理其实很简单:通过探针间的电阻变化反映土壤含水量。输出方式有两种:

  • 数字信号(DO):简单的高低电平阈值判断
  • 模拟信号(AO):输出0-3.3V连续电压值

我们将使用模拟输出,因为:

  1. 能反映湿度连续变化
  2. 可通过校准获得更精确的百分比读数
  3. 避免数字输出的"非湿即干"二值化问题

SSD1306驱动的0.96寸OLED选择I2C接口版本,只需4根线就能实现显示。其128x64的分辨率足够显示:

  • 实时湿度数值
  • 历史趋势简图
  • 系统状态提示

1.2 完整物料清单

组件型号数量备注
MCUSTM32F103C8T61蓝色pill开发板
传感器YL-691带比较器模块
显示屏SSD1306 OLED1I2C接口
电阻10KΩ2I2C上拉电阻
杜邦线母对母若干建议不同颜色区分
电源Micro USB15V供电
花盆-1实际测试用

提示:购买传感器时注意选择工作电压3.3V版本,避免电平不兼容问题。部分厂家会标注"3.3/5V兼容"。

2. 硬件电路搭建

2.1 传感器接口设计

YL-69传感器有4个引脚需要连接:

  1. VCC → 3.3V
  2. GND → GND
  3. DO → 悬空(不使用)
  4. AO → PA5(ADC1通道5)

实际接线时会发现一个有趣现象:干燥环境下AO输出电压接近VCC,湿润时趋近于0。这是因为水分子增加了土壤导电性,降低了探针间电阻。这种反比关系需要在代码中进行处理。

ADC输入电路建议增加一个简单的RC滤波:

PA5 ───┬───→ 10KΩ ───┐ │ │ === 0.1μF │ │ │ GND ADC_IN5

2.2 OLED显示模块连接

I2C接口的OLED只需要4线连接:

  • SCL → PB6
  • SDA → PB7
  • VCC → 3.3V
  • GND → GND

记得给I2C总线加上拉电阻:

// 硬件连接示意图 +3.3V───10KΩ───SCL │ OLED │ +3.3V───10KΩ───SDA

2.3 电源方案考虑

虽然开发板可通过USB供电,但长期运行建议:

  1. 使用手机充电器+Micro USB供电
  2. 或接18650锂电池+TP4056充电模块
  3. 如需低功耗,可启用STM32的睡眠模式

3. 软件实现详解

3.1 ADC采集配置要点

STM32的ADC初始化有几个关键参数需要注意:

ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单通道 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; // 1个转换通道

采样时间设置很有讲究,对于土壤湿度这种变化缓慢的信号:

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);

这个239.5周期的采样时间能确保充分采样,减少噪声干扰。

3.2 数据滤波算法实现

直接读取ADC原始值会存在波动,采用移动平均滤波:

#define SAMPLE_TIMES 20 // 采样次数 uint16_t get_filtered_adc(uint8_t channel) { uint32_t sum = 0; for(uint8_t i=0; i<SAMPLE_TIMES; i++){ sum += adc_read(channel); delay_ms(5); // 适当间隔 } return sum / SAMPLE_TIMES; }

更高级的做法可以结合中值滤波:

  1. 采集奇数个样本(如15个)
  2. 排序后取中间值
  3. 再对中间值做平均

3.3 湿度百分比转换

传感器输出电压与湿度成反比,需要转换:

float convert_to_percent(uint16_t adc_val) { const float Vref = 3.3f; // 参考电压 const uint16_t max_adc = 4095; // 12位ADC最大值 // 读取电压值 float voltage = (float)adc_val * Vref / max_adc; // 反比转换(需校准) float humidity = 100.0f - (voltage * 100.0f / Vref); // 限制在0-100%范围内 return fmaxf(0.0f, fminf(100.0f, humidity)); }

实际项目中建议增加校准步骤:

  1. 将传感器完全浸入水中,记录此时ADC值(100%湿度)
  2. 将传感器置于干燥空气中,记录ADC值(0%湿度)
  3. 建立线性映射关系

4. OLED界面设计与优化

4.1 显示布局规划

有效的UI设计应该包含:

  • 顶部:项目名称和状态图标
  • 中部:大号字体显示湿度百分比
  • 底部:历史趋势简图或文字提示

示例布局:

+----------------------+ | 智能花盆 [电池图标] | | | | 湿度: 65.2% | | | | [=====------] 50-80% | +----------------------+

4.2 图形化显示实现

利用SSD1306的绘图功能创建直观显示:

// 绘制湿度条 void draw_humidity_bar(uint8_t percent) { uint8_t bar_width = (percent * 100) / 128; OLED_DrawRectangle(10, 40, 118, 48, 1); OLED_Fill(12, 42, 12+bar_width, 46, 1); // 添加标尺 OLED_ShowString(10, 50, "0%", 8); OLED_ShowString(110, 50, "100%", 8); }

4.3 低功耗优化技巧

  1. 降低刷新频率(从60Hz降到1-2Hz)
  2. 使用局部刷新代替全屏刷新
  3. 在无变化时关闭背光
  4. 实现唤醒-睡眠循环:
while(1) { update_display(); enter_stop_mode(); // 进入低功耗模式 delay_ms(2000); // 2秒唤醒一次 }

5. 项目进阶与扩展

完成基础功能后,可以考虑:

  • 增加蓝牙模块,手机远程查看数据
  • 添加水泵控制,实现自动浇水
  • 记录历史数据,分析植物需水规律
  • 集成温湿度传感器,完善环境监测

一个实用的自动浇水逻辑示例:

if(humidity < 30.0f && temperature < 35.0f) { pump_on(3000); // 开启水泵3秒 log_event("自动浇水"); }

硬件扩展建议:

  1. 继电器控制水泵
  2. DS18B20测温
  3. HC-05蓝牙模块
  4. SD卡数据存储

调试这类项目时,最常遇到的问题是传感器接触不良。我的经验是给探针涂一层导电漆,既能防腐蚀又能保持良好接触。另一个坑是OLED的I2C地址——部分屏是0x3C,有些是0x78,遇到显示不正常时先用I2C扫描工具确认地址。

http://www.jsqmd.com/news/732545/

相关文章:

  • Cadmus系统集成指南:如何在Discord、Zoom、Skype中完美使用
  • 不平衡数据分类实战:玻璃识别与优化策略
  • 百度网盘加速-实测有效
  • 使用OpenClaw连接Taotoken快速搭建自动化AI工作流与智能体
  • AKShare量化金融数据获取从入门到精通
  • 对比不同模型在Taotoken平台上的实际调用成本感知
  • 告别重复劳动!用Python的PyAutoGUI库打造你的第一个自动化脚本(附完整代码)
  • 六西格玛黑带备考6个月攻略 - 众智商学院官方
  • 终极游戏音频解密指南:三分钟掌握acbDecrypter核心功能
  • 逆向思维:从一次失败的UDS 27服务解锁,聊聊安全算法DLL的调试与验证技巧
  • 短视频怎么在线解析去水印?2026 短视频在线解析去水印方法,短视频在线解析去水印工具推荐 - 科技热点发布
  • 为Hermes Agent自定义配置Taotoken作为模型提供商
  • EtherCAT和TSN(时间敏感网络)是工业自动化领域两种重要的实时以太网技术,分别以高性能专有协议和开放标准著称
  • Ollamac:图形化界面让本地大模型部署与对话更简单
  • 单细胞数据可视化进阶:手把手教你用R绘制基因共表达密度图与高级热图
  • 拒绝一知半解,你对ChatGPT的了解可能是错误的
  • 基于Docker沙盒构建安全隔离的AI模型运行环境
  • 视频分析神器:5分钟掌握AI视频内容理解完整教程
  • 在 Ubuntu 系统中配置 OpenClaw 使用 Taotoken 作为其 Agent 运行后端
  • CoreELEC技术栈在创维E900V22C媒体中心部署与优化指南
  • 快速部署MRPT:Ubuntu/Debian安装与配置完整指南
  • 【Leetcode】509. Fibonacci Number
  • ZNC Web管理界面完全指南:远程控制你的IRC bouncer
  • 网易云QQ音乐歌词提取工具:一键获取LRC歌词的终极解决方案
  • 从“阿大阿二阿三”到产品代码:一个嵌入式工程师的BACnet MS/TP协议栈移植笔记(基于STM32+FreeRTOS)
  • SOCD Cleaner终极指南:免费解决游戏按键冲突的完整方案
  • 终极指南:企业级API设计的架构模式与最佳实践
  • 专题--Redis
  • 如何使用SmartSwipe实现Activity滑动返回功能
  • 在Node.js服务中集成Taotoken实现稳定高效的大模型调用