FEATURED · 精选文章

自制土壤温湿度检测计:从传感器选型到单片机实现全解析

发布时间 / 2026/9/7 17:03:39
来源 / 创域科博编辑部
栏目 / 资讯中心
自制土壤温湿度检测计:从传感器选型到单片机实现全解析 简介这是一份基于STC89C52单片机与YL-69土壤湿度传感器的温湿度检测计设计PDF文档面向电子、嵌入式及农业物联网方向的初学者和课程设计人员重点解决传统湿度测量精度低、操作不便、成本较高的问题。资源共1个PDF文件大小约1.56MB内容涵盖选题背景、总体方案对比、单元模块电路设计、软件流程及系统调试全过程。文档详细展示了时钟模块、复位模块、报警模块、LCD1602显示模块的实现方法并结合YL-69传感器讲解了信号采集、数据处理与超限报警的软硬件协同设计思路既适合课程设计、毕业设计参考也可作为实际农业湿度监测项目的初始模板。目前已有208人学习下载对于需要快速搭建单片机检测系统或撰写设计报告的用户有较高参考价值。2. 为什么要自己做一台土壤温湿度检测计做这个项目的起因很朴素种了几盆花总是把握不好浇水时机。浇多了烂根浇少了叶子发蔫。市面上的检测仪要么贵得离谱要么测出来的数据让人摸不着头脑。后来一想自己是搞单片机的为什么不自己动手做一台既能测土壤湿度、又能测温度的小设备这个项目说难不难但也不是插上电就能跑通的玩具。它涵盖了传感器数据采集、信号处理、模数转换、显示交互这几个嵌入式开发的核心环节非常适合拿来练手。无论你是刚学完51单片机基础知识的学生还是想做一个完整课程设计的开发者这个项目都能让你把课本上的知识点串成一条线。整套系统做下来核心逻辑并不复杂土壤中的水分含量会影响传感器的电气参数单片机通过采集这些参数的变化经过换算得到湿度值再配合温度传感器读取环境温度最终显示在液晶屏上。听起来简单但每一步都有值得抠的细节。3. 整体设计和方案选型3.1 系统框架和核心模块先画一个整体的功能图土壤温湿度检测计 传感器采集模块 信号调理电路 主控单片机 显示模块 供电系统。各模块各司其职传感器负责感知土壤状态单片机负责读取数据并做换算显示屏负责将结果呈现给用户。这个框架几乎是所有测量类仪表的通用结构做熟了这一套后面再做光照度计、气压计、雨滴传感器检测器都是换汤不换药。选主控芯片时我考虑了51单片机和STM32两个方向。如果只是完成基本功能STC89C52这类51单片机完全够用而且上手门槛低、资料多、价格便宜。如果后续想扩展物联网功能——比如把数据传到云端、手机App远程查看——那直接上STM32会更从容。我这版先用51单片机做基础版本稳扎稳打。提示学习阶段优先选熟悉的主控平台。如果51刚入门没必要为了显得高级直接跳STM32先把传感器的数据读取逻辑搞清楚比换个更强的芯片更有效。3.2 传感器选型其实是这个项目的关键土壤湿度传感器市面上主要分两类电阻式和电容式。电阻式传感器是两个金属探针插进土里利用土壤水分含量不同导致电阻值不同来测湿度。优点是结构简单、成本低缺点是探针容易电化学腐蚀长期埋在土里会氧化影响精度而且施加在探针上的直流电压可能对土壤和植物根系有影响。电容式传感器通过测量土壤的介电常数来推算含水量。水分的介电常数远大于空气和干土所以含水量越高电容值变化越明显。它不易腐蚀、寿命长、精度更高缺点是电路略复杂、价格贵一些。我这个项目选了电容式传感器配合NE555定时器组成振荡电路把电容变化转换为频率变化再用单片机测频换算湿度。整个过程是纯模拟电路和数字电路的配合做起来很有学习价值。温度传感器选的是DS18B20一线总线协议单根数据线就能完成双向通信而且测量精度在-10℃到85℃范围内可以做到±0.5℃完全满足园艺场景需求。用这个传感器还能顺带练习时序读写一举两得。4. 硬件电路各模块拆解4.1 传感器检测电路原理完整的检测电路包括两部分一是偏置与放大单片机采集到的电压信号通过分压电阻配合运放把信号调理到ADC的输入范围内二是信号的数字化处理。实际制作时我利用单片机内部的ADC直接采集传感器输出端的模拟电压。电容式传感器的输出随土壤含水量近似线形变化但输出幅度往往较小需要调理。我的做法是用一个轨到轨运算放大器搭建同相放大电路把传感器输出从0.2V-0.8V范围放大到0V-3.3V尽可能利用ADC的满量程分辨率。单片机的ADC分辨率一般是10位或12位。以10位ADC为例参考电压3.3V时最小分辨率是3.3/1024大约3.2mV。传感器输出电压变化范围如果只有0.6V对应的有效量化级数只有约187级不算特别精细。放大之后可以完整利用1024级湿度分辨能力会明显提升。这一点非常值得注意很多新手做出来读数跳变剧烈、精度差根因往往就是没有做信号调理。4.2 电源和显示电路设计电源部分需要仔细规划。系统里5V给单片机、LCD供电3.3V给传感器和运放供电所以选用了AMS1117-3.3稳压芯片。AMS1117压差小、纹波低配合输入输出端的10uF和0.1uF电容能保证很稳的供电环境。锂电池升压到5V的方案可以后面再加这一版先用USB的5V输入。显示模块用的是LCD160216个字符两行显示温度25.5℃ 湿度68%这种信息刚刚好。1602的缺点是视角窄、接口占用引脚多但它无处不在、资料多、驱动起来不费劲。想做得更精致也可以换OLED屏I2C接口只需要两根线显示效果也更细腻。实操心得LCD1602的对比度调节电阻Vo引脚一定要装用10K电位器把它调到刚好能看清字又不出重影的位置。不要直接接地或接VCC否则要么字看不清要么满屏方块。4.3 PCB布局和抗干扰设计画PCB的时候有几个细节需要注意。首先是模拟部分和数字部分的地线处理——传感器信号是模拟量非常容易被数字信号干扰最好在布局上把模拟电路和数字电路分开单点接地。另外晶振要尽量靠近单片机的XTAL引脚走线要短而粗铺铜区域做好过孔阵列连接。还有一个很多人会踩的坑DS18B20的数据线要加一个4.7K上拉电阻否则通信时好时坏时读得到时读不到。接插件方面传感器和主板之间我用了一个XH2.54的4Pin插座方便以后换传感器。供电入口加了一个自恢复保险丝和反接保护二极管防止正负极接反烧板子。这几块钱的元件关键时刻能救一块板子。5. 软件逻辑与核心代码实现5.1 单片机程序整体架构程序主要分三个模块传感器驱动、数据处理、LCD显示。我习惯不把全部代码堆在一个main.c里而是拆成文件分开写便于排查问题也便于别人阅读比如humidity.c、temperature.c、lcd.c和main.c。这种模块化思维对后面做更复杂的项目很重要。主循环的逻辑很清晰每2秒读一次土壤湿度读一次温度做一次滤波处理刷新一次显示。这样既保证了实时性又不会因为传感器频繁上电导致局部发热影响读数。void main(void) { System_Init(); while (1) { SoilMoisture_Process(); Temperature_Process(); LCD_Display(); delay_ms(2000); } }5.2 土壤湿度换算的校准公式这是整个项目最关键的地方。原始ADC值不是湿度百分比它只是一个随湿度变化的电压数字量。要得到直观的百分之多少必须做标定。我采用两点标定法把传感器完全插入干燥的土壤中记录ADC值再把它插入刚刚浇透水的土壤中记录另一个ADC值。理论上干燥时ADC值高湿润时ADC值低。把这两个值作为量程的0%和100%端点再做线性映射。uint16_t get_soil_percent(uint16_t adc_val) { uint16_t dry_val 720; // 干燥土壤标定值 uint16_t wet_val 220; // 饱和土壤标定值 uint32_t percent 0; if (adc_val dry_val) return 0; if (adc_val wet_val) return 100; percent (uint32_t)(dry_val - adc_val) * 100 / (dry_val - wet_val); return (uint16_t)percent; }注意这个标定是基于你手头这块传感器和土壤类型来的。不同土壤的物理特性差别很大砂土和黏土的介电特性完全不同所以换一种土就得重新标定。代码里的两个端值就是给你留的旋钮。延时滤掉高频噪音也要做好。ADC采集的数据如果直接用屏幕上的数字会跳得厉害。我用了简单的滑动平均滤波连续采5次去掉最大值和最小值中间三个值取平均。这个办法运算量小、效果立竿见影。5.3 DS18B20温度读取DS18B20的时序读写看起来容易实际坑很多。它的通信完全靠严格的时序来保证差几微秒就不能正常工作比如复位时序要求主机拉低至少480us然后再释放等待DS18B20拉低60-240us作为存在脉冲。忘记检查存在脉冲可能会导致后面一直读到0xFF。我建议用逻辑分析仪或者示波器看一遍时序波形。没有示波器的话也不着急可以先把DS18B20返回的原始数据用串口打印出来确认读到的字节是不是0x10 0x05这种符合环境温度的数值再做BCD转换和负数处理。凡是做温度类项目这一步省不了。温度处理有一个容易忽略的点DS18B20默认是12位分辨率转换时间最长750ms。如果你读得太频繁会发现偶尔读不到数据。我的做法是在两次温度转换之间插入足够延时或者利用它的温度转换完成标志位判断不要傻傻地等固定时间效率高很多。6. 调试过程中的典型问题与反复排查6.1 ADC读数跳变的排查我遇到过的最典型问题传感器放在同一个位置不动屏幕上的湿度值却不停地跳。排查思路是一层一层剥先看电源用万用表量传感器供电电压发现纹波很大。手头没有示波器的话可以看ADC参考电压Vref是否稳定AMS1117输出端如果没有加足够容量的电容负载一变纹波就出来了。解决办法是在传感器电源引脚旁边加一个100uF电解电容和0.1uF陶瓷电容并联。再查接地。传感器信号的地和单片机数字地如果走线绕了弯路也会引入噪声。PCB上保证模拟地单点连接效果立竿见影。最后是软件滤波。硬件问题解决之后再用滑动平均滤波兜底数据就稳了。6.2 DS18B20读取失败的原因做了三块板子有两块DS18B20第一次上电能读到数据断电后再上电就显示85℃——这个值其实很有名是DS18B20上电复位后的默认温度寄存器的值。出现这个情况优先检查数据线上的上拉电阻有没有焊好其次是接线是否正确再次是程序里有没有在每次转换后正确读取暂存器。我那块问题板子最后查出来是数据线虚焊。解决办法就是补焊然后把线用热熔胶固定住杜绝接触不良。注意DS18B20供电不能高于5.5V也不能直接把数据线接到12V之类的电源上否则芯片直接报废。另外如果传感器离单片机比较远线长超过50cm通信时序会被分布电容拖垮要么用屏蔽线要么降低通信速率。6.3 校准后的数据与实际手感不一致有一阵子我发现传感器显示湿度85%但用手摸土感觉并不湿。后来想明白了传感器探头的物理长度有限它测的只是探头周围一小片区域的土壤湿度不是整个花盆的平均湿度。如果探头插的地方恰好有个空洞或者根系密集区数据自然不准。解决办法是多次测量取平均并建议用户把探头插在植物根系分布最均匀的区域避开盆壁、陶粒排水层、未分解的有机肥团块。这个经验在你自己做使用测试时非常实用也是做产品必须要处理好的问题。7. 从课程设计到实用产品的扩展思路这个检测计目前能完成测出来、显示出来的任务但离好用还有不少距离。如果要做成实用产品有几个方向值得深入一是低功耗设计。现在的版本是一直上电工作如果用电池供电撑不了太久。可以给单片机加睡眠模式每5分钟唤醒一次做测量测完再睡回去。实测能把整机功耗从十几毫安降到微安级别一节18650电池用几个月没问题。二是加入报警和自动控制。接一个继电器模块湿度低于阈值就自动打开水泵浇水高于阈值就关停。再配合蜂鸣器做高温报警可以变成一个小型智能种植系统。三是数据上云。加一个ESP8266模块通过串口和单片机通信把温湿度数据上传到云平台手机端做数据可视化和历史曲线查询。这个玩法适合买了ESP8266吃灰的朋友。四是多探头扩展。一个主机接多个传感器探头分别检测花盆不同深度、不同位置的湿度用I2C或单总线方式扩展对研究植物根系吸水规律很有帮助。每一版升级都能让你对这套系统的理解更深一层。我自己做完校准和低功耗这两步之后对ADC采样、定时唤醒、传感器驱动这些概念的认知和之前完全不同——这些是光看芯片手册感受不到的经验。8. 最后分享一点我的体会整套设备从画原理图、打板、焊接、写驱动、调试界面到最终能稳定显示一个可信的数据前后花了我两个周末。回头来看最难的不是某一个知识点而是把所有环节串起来的能力。传感器手册上写的电气特性LCD驱动时序图里那些t和th参数只有在你真的遇到问题时才会深刻理解它们为什么要那么标注。如果让我给正在做类似项目的人一句建议先用开发板和杜邦线把整个流程跑通确认传感器读数逻辑没问题之后再去画PCB打板。直接上PCB的话一旦硬件有设计错误排查起来会很痛苦把学习成本全压在调板子上不划算。另外一个我很受用的习惯是每次调试时把关键数据用串口打印出来别只盯着屏幕上的最终结果。原始ADC值、滤波后的中间值、最终百分比每一层数据都清楚了问题定位就快了。这比把代码蒙着眼睛改几十遍再烧录试错高效得多。这个项目做下来等于把51单片机里最常用的外设全摸了一遍ADC、定时器、外部中断、串口还顺带练习了PCB画板和焊接。做完之后你对单片机能干什么、不能干什么心里会非常有数。下一步我准备在这个基础上加一块太阳能板和电池管理芯片做一个真正能在阳台长期放着不管的版本。// 如果你也想动手试试遇到具体问题卡住了欢迎交流。做项目最怕一个人闷头踩坑有些问题别人一句话就能点醒你。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻