土壤湿度传感器原理图解析与STM32 ADC采集标定 简介土壤湿度传感器原理图 PDF 面向嵌入式初学者与电子设计爱好者用于理解电容式土壤湿度检测的硬件实现与调试要点。配套电路以 STM32F103C8T6 微控制器为核心包含最小系统、3.3V 供电与地网络、BOOT 启动选择、NRST 复位、8MHz 与 32.768kHz 晶振、SWD 调试接口并给出 PA13、PA12、PC13 等引脚分配以及 DO/DS 数字信号、上拉电阻与限流电阻的连接关系。资源包仅含 1 个 PDF约 61KB页面集中呈现原理图与元件标注虽体量小但信息密度较高适合直接对照绘制电路或排查接线。目前已有 671 人学习。读者可据此梳理传感器信号采集、OLED 0.96 寸显示、LED 状态指示与蜂鸣器提示等模块的电气连接并借助 ST-Link 调试思路完成硬件验证与二次开发。1. 从一张土壤湿度传感器原理图.pdf 说起先看信号链别急着抄电阻值土壤湿度传感器装到花盆里串口每 10 分钟报一次数前几天还正常一周后干土读数越来越高浇水也拉不回来。换传感器、改滑动滤波、重写 ADC 代码都没用最后把模块附带的土壤湿度传感器原理图.pdf 放大看问题出在探针供电原理图把探针一端直接接 5V另一端经 10k 到地ADC 长期读同一个直流分压。土壤里的直流电场让电极极化读数自然漂。这个标题适合两类人手里有传感器却只会调 map() 的嵌入式新手和要把土壤湿度传感器画进 PCB 原理图、再导出 PDF 归档的硬件工程师。前者需要看懂信号从探针到 ADC 的路径后者需要知道原理图怎么分区域、怎么导出、怎么让 PDF 可检索。原理图里的每个分压电阻、每个去耦电容都会变成现场调试时的参数边界。2. 土壤湿度传感器原理图里的两条主流信号链电阻分压与电容振荡土壤湿度传感器模块很多但原理图上的信号链基本归为两类电阻式把土壤电阻变成电压电容式把土壤介电常数变成频率。选型不是看模块便宜不便宜而是看土壤盐分、供电方式和 MCU 外设。电阻式电路简单一根 ADC 就能读但直流供电会电解探针电容式没有裸露电极极化问题但需要定时器输入捕获或频率计数原理图里多一颗 555 或振荡电路。先把这两条链路拆开再看 STM32F103C8T6 最小系统板怎么接后面调 ADC 参数才不会瞎试。2.1 电阻式土壤湿度传感器原理图探针、分压与 LM393 比较器电阻式土壤湿度传感器的核心是探针等效电阻 R_soil。土壤含水率越高离子导电越强R_soil 越小。原理图里常见做法是 VCC 经过固定电阻 R_fixed 接到探针节点探针另一端到 GND节点电压送给 ADC 或比较器。分压公式是 V_AO VCC × R_soil / (R_fixed R_soil)。如果 R_fixed 取 10k干燥时 R_soil 可能到 100k 到 1MV_AO 接近 VCC12 位 ADC 码值接近 4095湿润时 R_soil 掉到几 kV_AO 降到 1V 左右ADC 码值约 1200。所以电阻式模块的原始 ADC 值通常是“越大越干”写代码时别把方向搞反。常见模块还会带一颗 LM393 比较器把探针分压送到同相端反相端接电位器设定阈值输出 DO 给 GPIO。AO 是模拟输出DO 是开关输出。LM393 输出是开漏原理图上必须画上拉电阻否则 DO 永远拉不高。比较器阈值电位器调的是“湿度报警点”不是湿度测量精度。要测连续湿度重点看 AO 那条路DO 只适合做水泵启停或干涸报警。模块引脚原理图上的连接常见取值与注意VCC5V 或 3.3V3.3V 系统别把 5V AO 直接进 ADCGND公共地模拟地和数字地单点连接AO探针分压节点进 ADC 前加 RC 低通DOLM393 输出开漏需 10k 上拉探针两个电极直流供电会电解建议交替驱动注意很多模块标称 5V 供电AO 空载输出会接近 5V。STM32F103C8T6 的 ADC 引脚耐压是 3.3V直接接 5V AO 会打坏引脚。稳妥做法是在 AO 和 ADC 之间加 10k 串阻再对地接 20k把 5V 分到 3.3V 以内。2.2 电容式土壤湿度传感器原理图555 振荡与频率检测电容式土壤湿度传感器把两根电极或叉指电极做成电容 C_soil土壤水分变化时介电常数变化C_soil 跟着变。原理图里常把 C_soil 接进 555 无稳态振荡电路输出频率 f 1.44 / ((R1 2R2) × C_soil)。R1、R2 取 10k 和 100k 时C_soil 从几十 pF 到几百 pF输出频率大概在几十 kHz 到几百 kHz。MCU 不需要 ADC而是用定时器输入捕获测周期或者用外部计数在固定闸门时间里数脉冲。频率越高通常表示土壤电容越大含水率越高但具体方向要在实际土壤里标定。电容式原理图里555 的 5 脚控制电压要接 10nF 到地电源脚加 100nF 去耦。输出如果是开漏结构需要上拉。探针走线要短周围不要铺大块地否则寄生电容会淹没土壤电容变化。常见电容式模块还会加一级施密特触发器或比较器把正弦波整成 MCU 能数的方波。看原理图时先找 555 或振荡芯片再找 C_soil 接在哪两个脚最后看输出到 MCU 的哪个定时器通道。元件作用典型值R1充电电阻10kR2放电电阻100kC_soil探针电容20pF 到 200pFC55 脚滤波10nF输出上拉开漏输出10k2.3 从原理图到 MCUSTM32F103C8T6 最小系统板怎么接STM32F103C8T6 最小系统板原理图里PA0 到 PA7 对应 ADC1_IN0 到 IN7PB0、PB1 也能做 ADC。电阻式模块 AO 建议接 PA0DO 接 PA1 做中断。VCC 尽量用 3.3V 给传感器模块如果模块必须 5VAO 分压后再进 PA0。GND 必须共地ADC 参考就是 VDDA通常 3.3V。最小系统板上的 VDDA 和 VSSA 要加磁珠或 0 欧电阻隔离旁边放 100nF 和 1uF 去耦否则 ADC 读数末位会跳。接线表可以这样定传感器 AO 到 PA0DO 到 PA1VCC 到 3.3VGND 到 GND。DO 配置成上拉输入AO 配置成模拟输入。如果传感器离 MCU 超过 20cmAO 线旁边走一根 GND 回流线或者用屏蔽线。原理图导出 PDF 前把网络标签改成 SOIL_AO、SOIL_DO、SOIL_VCC不要保留 NetC1_1、NetC2_2 这种自动名否则查线时根本不知道哪根是土壤信号。下面这段 Python 用来验证电阻式分压公式和 ADC 码值范围改 R_fixed 就能看不同参数下的量程。# 根据电阻式土壤湿度传感器原理图估算 ADC 码值范围 VCC 3.3 # ADC 参考电压必须与原理图 VCC 一致 R_FIXED 10_000 # 固定分压电阻单位欧姆 R_SOIL_DRY 500_000 # 干燥土壤探针等效电阻 R_SOIL_WET 5_000 # 湿润土壤探针等效电阻 ADC_BITS 12 def estimate(r_soil): v_ao VCC * r_soil / (R_FIXED r_soil) # 探针节点电压 code int(v_ao / VCC * (2**ADC_BITS - 1)) return v_ao, code for name, r in [(干燥, R_SOIL_DRY), (湿润, R_SOIL_WET)]: v, c estimate(r) print(f{name}: R_soil{r}Ω, V_AO{v:.3f}V, ADC{c})参数说明R_FIXED 是原理图里探针上方那颗固定电阻改大到 100k 会让湿润端电压更低ADC 量程利用率下降改小到 1k 会让电流变大电解更快。R_SOIL_DRY 和 R_SOIL_WET 只是估算值实际土壤差异很大必须用真实土样标定。ADC_BITS 按 MCU 分辨率填STM32F103 是 12 位。3. 用 STM32 把土壤湿度传感器原理图跑通ADC 采集、滤波与标定看懂原理图之后下一步是让 STM32 读出稳定数值。很多教程只给一句 HAL_ADC_GetValue结果读出来末位跳几十个码就怪传感器差。问题通常在采样时间、参考电压、滤波和标定。ADC 采集土壤湿度不是高速信号但源阻抗可能很高采样保持电容充不满就会产生偏差。先把 CubeMX 里的 ADC 参数配对再做中值加均值滤波最后用干土和饱和水做两点标定读数才有物理意义。3.1 STM32 土壤湿度传感器最小采集电路与 CubeMX 配置在 CubeMX 里选 ADC1_IN0模式选独立转换连续转换模式打开DMA 循环模式打开。采样时间不要用 1.5 cycles土壤湿度模块 AO 输出阻抗常见几 k 到几十 k选 71.5 cycles 或 239.5 cycles 更稳。时钟预分频让 ADC 时钟别超过 14MHzSTM32F103 通常 12MHz 或 9MHz。DMA 缓冲长度设 16 或 32每次取平均。下面代码基于 HAL 库把校准、DMA 启动和均值读取串起来。// STM32F103C8T6 土壤湿度传感器 AO 接 PA0DMA 循环采样 #include stm32f1xx_hal.h extern ADC_HandleTypeDef hadc1; #define SAMPLE_N 16 uint16_t adc_buf[SAMPLE_N]; void SoilSensor_Init(void) { HAL_ADCEx_Calibration_Start(hadc1); // F1 系列先做 ADC 校准 HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_buf, SAMPLE_N); // DMA 循环采集 } uint16_t SoilSensor_ReadRaw(void) { uint32_t sum 0; for (uint8_t i 0; i SAMPLE_N; i) { sum adc_buf[i]; } return (uint16_t)(sum / SAMPLE_N); // 先均值后续再做中值 }逻辑说明HAL_ADCEx_Calibration_Start 会修正 ADC 内部电容偏差F1 系列上电后建议执行一次。HAL_ADC_Start_DMA 让 ADC 在后台把转换结果写进 adc_buf主循环读均值不会阻塞。SAMPLE_N 取 16 是折中太大响应慢太小滤波效果差。采样时间在 CubeMX 的 ADC Parameter Settings 里改土壤湿度传感器不是音频信号牺牲速度换稳定完全值得。提示如果读数总是满量程 4095先用万用表量 AO 对 GND 电压。若电压接近 3.3V说明探针开路或分压电阻虚焊若电压为 0检查探针是否短路或模块没供电。3.2 土壤湿度 ADC 值的滤波与三点标定均值滤波只能压随机噪声压不住尖峰。比较稳的做法是连续采 9 次去掉最大最小再对剩下 7 次取平均。标定至少做两点干燥空气和饱和水。把探针擦干放在空气中读 dry_code把探针插入水中注意水面不要碰到模块电路读 wet_code。之后湿度百分比 (dry_code - raw) × 100 / (dry_code - wet_code)。如果 raw 大于 dry_code按 0% 处理小于 wet_code按 100% 处理。不同土壤类型可以再加一个中间点比如手握成团但不滴水的湿土记录 mid_code用分段线性插值。typedef struct { uint16_t dry; // 干燥空气标定值 uint16_t wet; // 水中标定值 } SoilCalib; float SoilMoisture_Percent(uint16_t raw, SoilCalib *cal) { if (raw cal-dry) return 0.0f; if (raw cal-wet) return 100.0f; return (float)(cal-dry - raw) * 100.0f / (float)(cal-dry - cal-wet); }参数说明cal-dry 和 cal-wet 必须在同一供电电压下测换 5V 供电后要重新标定。水温、土壤盐分会改变电导水中标定时间不要超过 10 秒否则探针开始电解。函数返回 0 到 100 的百分比适合送显示或水泵控制。如果用来做灌溉决策建议再加回差比如低于 35% 开泵高于 55% 停泵避免继电器在阈值附近抖。标定点操作典型 ADC 码值注意dry探针悬空、擦干3800 到 4095不要用手碰电极wet探针插入清水1200 到 1800水面不碰电路板mid实际土壤手握成团2000 到 3000同一种土才有效3.3 原理图 PDF 里容易被忽略的电源与保护细节土壤湿度传感器原理图里电源和保护部分最容易被新手跳过。ADC 精度直接受电源噪声影响模块 VCC 和 GND 之间要加 100nF 陶瓷电容再并 10uF 钽电容或电解电容。AO 到 ADC 之间加 RC 低通R 取 1kC 取 100nF截止频率约 1.6kHz能压住水泵、继电器和电机碳刷带来的高频干扰。如果传感器线缆比较长ADC 引脚再加 BAT54S 双肖特基钳位到 3.3V 和 GND防止静电或浪涌打坏 MCU。模拟地和数字地不要混在一起铺最小系统板上用 0 欧电阻单点连接。项目原理图位置参数作用去耦传感器 VCC-GND100nF 10uF抑制电源纹波RC 低通AO 到 ADC1k 100nF截止约 1.6kHz钳位ADC 引脚BAT54S过压保护分压5V AO 到 3.3V ADC10k 20k降低到 2/3注意如果原理图里 AO 直接连到 ADC没有任何串阻和电容现场又靠近水泵读数会在电机启动瞬间跳几百个码。加 RC 低通是最便宜有效的改法改 PCB 之前先在飞线上试。4. 看懂和导出土壤湿度传感器原理图.pdfAD 分区域、ORCAD 书签与版本管理原理图设计完只是开始团队里更多人拿到的是导出的 PDF。PDF 能不能快速定位探针接口、ADC 分压、电源去耦取决于画图时有没有分区域、网络标签有没有意义、导出时有没有生成书签。常见坑是 AD 导出原理图 PDF 只有部分区域或者 ORCAD 导出 PDF 原理图没有书签翻页靠猜。把导出参数和命名规范固定下来土壤湿度传感器原理图.pdf 才能当成交付物而不是一张只能看的图。4.1 AD 导出原理图 PDF 只有部分区域先查 Sheet 范围和页面设置在 AD 系列里常见路径是 File - Smart PDF向导里第一步选 Project 或 Document。如果只选了当前 Document导出的 PDF 就只有当前 Sheet看起来就像“只有部分区域”。要导出整张土壤湿度传感器原理图选 Project并在后续页面勾选 All Sheets。另一个常见原因是页面尺寸小于图纸比如原理图用 A2 画页面设置还是 A4PDF 会裁掉右半边。在 Page Setup 里把 Scale Mode 改成 Fit to Page或者手动选 A2、A1。导出选项中勾选 Include BOMPDF 末尾会附元件清单方便和实物核对。# 检查导出的土壤湿度传感器原理图.pdf 是否包含完整页和书签 from PyPDF2 import PdfReader reader PdfReader(土壤湿度传感器原理图.pdf) print(页数:, len(reader.pages)) print(书签:, reader.outline) # 若导出时勾选书签会列出各功能区 for i, page in enumerate(reader.pages, 1): text page.extract_text() or if 土壤 in text or Soil in text: print(f第{i}页包含土壤湿度相关文字)逻辑说明PdfReader 读取页数reader.outline 返回书签树如果为空说明导出时没生成书签。参数说明文件名替换成实际 PDF 路径。这个脚本适合在交付前跑一遍确认没有漏页。如果书签为空在 ORCAD 里要勾选 Create PDF Bookmarks在 AD 的 Smart PDF 向导里要确认 Generate PDF Bookmarks 已选。现象可能原因解决PDF 只有一页或部分区域只选中 Current SheetSmart PDF 选 Project勾选 All Sheets内容被裁切页面尺寸小于原理图Page Setup 改 A2/A1 或 Fit to Page网络标号看不清缩放比例太小调大 Scale或分区域导出BOM 缺失未勾选 BOM导出向导中勾选 Include BOM4.2 原理图分区域与网络标签让土壤湿度传感器原理图可检索分区域不是画几条线好看而是让 PDF 阅读者能按功能找线。AD 里常用 Place - Drawing Tools - Line 画边框再用 Text Frame 标注“电源区”“探针接口区”“信号调理区”“MCU 区”。土壤湿度传感器原理图可以分成四块探针和分压、RC 滤波和钳位、ADC 接口、电源去耦。每块之间用网络标签连接不要用长线跨页。网络标签用 SOIL_AO、SOIL_DO、SOIL_VCC、ADC_IN0、PROBE_DRV_H、PROBE_DRV_L看到名字就知道信号含义。自动生成的 NetC1_1、NetC2_2 在 PDF 里搜不到也没法做规则检查。AD 原理图编译设置也要打开。Project - Options - Error Reporting 里把悬浮网络、单端网络、重复网络标签的警告级别调高。编译后如果 SOIL_AO 只出现在一个地方就说明线没接全。原理图确认无误后Design - Update PCB Document 生成 PCB 原理图对应网络再导 PDF 归档。分区域和网络标签做得好后面改 5V 转 3.3V 分压时只需要在 PDF 里搜 SOIL_AO就能找到所有相关页。# 从 AD 导出的 BOM CSV 中核对土壤湿度传感器关键件是否齐套 # 假设 BOM 列为 Comment,Designator,Footprint awk -F, NR1 || $1 ~ /(LM393|NE555|10k|100nF|BAT54S)/ {print} soil_sensor_bom.csv逻辑说明awk 按逗号分割 CSVNR1 打印表头后面匹配 Comment 列里包含关键元件的行。参数说明-F, 指定分隔符$1 是第一列。如果 LM393 或 NE555 缺失说明原理图 PDF 和 BOM 不一致要回去检查元件标号。这个命令适合在导出 PDF 后做一次快速交叉核对。4.3 ORCAD 导出 PDF 原理图与 BOM 交叉核对ORCAD Capture 导出 PDF 的常见路径是 File - Export - PDF选择 Whole Design输出目录选版本文件夹勾选 Create PDF Bookmarks。书签会按页和原理图符号生成找探针接口直接点书签。如果只想导出某个区域可以在原理图里框选选择 Selection 导出但交付文件最好给全图另附一张分区域截图。ORCAD 的 BOM 可以从 Reports 里导出和 PDF 书签里的元件位号交叉核对确认探针接口、分压电阻、滤波电容都在。导出工具关键选项产出物AD Smart PDFEntire Project、Fit to Page、BOM带书签 PDFORCAD Export PDFCreate PDF Bookmarks、Whole Design带书签 PDF版本管理文件名带日期和版本号可追溯交付物提示文件名不要只叫“土壤湿度传感器原理图.pdf”建议加版本和日期例如“SoilSensor_SCH_V1.2_202506.pdf”。PCB 原理图分析时PDF、BOM、网表三者版本必须一致否则查线会查到旧网络。5. 土壤湿度传感器原理图的进阶技巧防电解、温度补偿与长期漂移排查5.1 用 GPIO 交替驱动探针从原理图层面压住电解漂移电阻式土壤湿度传感器最大的长期问题是直流电解。原理图里如果探针一直接 VCC 和 GND土壤中的水分子被电解电极附近离子浓度变化读数慢慢漂。改法是在原理图上加两个 GPIO通过电阻交替驱动探针MCU 只在采样前翻转极性。下面代码用 PA4 和 PA5 交替拉高每次翻转后等 1ms 再读 ADC两次读数取平均。// 用两个 GPIO 交替驱动电阻式探针降低直流极化 void SoilProbe_Measure(void) { GPIOA-BSRR GPIO_PIN_4; // PA4 高PA5 低 HAL_Delay(1); uint16_t raw1 SoilSensor_ReadRaw(); GPIOA-BSRR GPIO_PIN_5; // 反相PA5 高PA4 低 HAL_Delay(1); uint16_t raw2 SoilSensor_ReadRaw(); uint16_t raw (raw1 raw2) / 2; // 平均抵消极化 }逻辑说明BSRR 写 1 置位写 0 复位这里只置位对应引脚实际还要配 GPIO_InitTypeDef 把 PA4、PA5 设成推挽输出。参数说明翻转间隔 1ms 足够让探针节点稳定占空比接近 50%。采样频率不要太高每分钟一次就够土壤湿度变化很慢。原理图里两个驱动脚各串 1k 电阻再接到探针两端防止 GPIO 直接短路。5.2 温度补偿与长期漂移排查表土壤电导随温度变化同样含水率下温度每升高 1℃电阻式读数可能变化 1% 到 3%。如果项目跨越昼夜温差建议在原理图里加一颗数字温度传感器比如 DS18B20 或 SHT 系列用温度对湿度百分比做线性补偿。补偿系数没有通用值要在同一土样里升温降温测出来。下面表格是现场排查顺序先看探针供电再看电极腐蚀然后看电源干扰最后才怀疑代码。问题现象排查处理读数漂移干土越来越高探针是否直流改 GPIO 交替驱动浇水后不恢复电极发黑电解腐蚀改电容式或镀金探针早晚差 10%温度变化加温度传感器线性补偿ADC 跳变水泵启动示波器看 AORC 低通加屏蔽最后给一个具体技巧把探针驱动、RC 低通、ADC 分压和温度补偿全部画进同一张原理图按“电源区 / 探针区 / 调理区 / MCU 区”分区域网络标签用 SOIL_AO、SOIL_DRV_H、SOIL_DRV_L、TEMP_DATA导出 PDF 时勾选书签和 BOM。下次换 MCU 或改 5V 转 3.3V只在 PDF 里搜 SOIL_AO就能定位到所有需要改的页不用重新猜管脚。本文还有配套的精品资源点击获取