DS18B20是DIY温控项目里用得最多的数字温度传感器之一,测温范围-55°C到+125°C,精度0.5°C,最关键的是它走1-Wire单总线协议,只需要一根数据线就能跟Arduino通信,不像模拟温度传感器那样需要ADC转换。这块板子几块钱一片,防水版探头二三十块,做鱼缸温控、温室监测、自动浇水系统都用得上。

单总线协议是什么,为什么只有一根线
DS18B20用的Dallas 1-Wire协议,所有通信都走一根DQ数据线。每片DS18B20出厂时都烧了一个全球唯一的64位序列号,所以你可以把很多片传感器并在一根线上,Arduino靠序列号区分每一个。实际项目里这很实用,比如温室里拉一根线挂5个探头,每个角落测一路温度,不需要5个模拟口。
接线其实就三根:VDD接5V,GND接地,DQ接Arduino任意数字引脚(比如D2)。关键是在DQ和VDD之间要加一个4.7kΩ的上拉电阻,不然总线空闲时电平不稳,读出来就是-127°C错误值。这个电阻很多人忘,第一次接线踩坑基本都是这里。
标准模式和寄生模式怎么选
DS18B20有两种供电方式。标准模式是三根线都接,VDD直接供5V,稳定可靠,线长2-3米都没问题。寄生模式只用DQ和GND两根线,传感器从数据线上"偷电",好处是少焊一根线,坏处是长距离或者挂多个探头时供电不稳。
家用项目建议老老实实用标准模式。寄生模式看着省事,但线一长、探头一多,就容易出读不到数据或者-127°C的坑。我试过用寄生模式挂了3个防水探头,线长1.5米左右,时不时就掉一个,后来老老实实全改成标准供电才稳。
防水探头版本的那些坑
防水版DS18B20是不锈钢管封装的,尾部出三根线,一般红皮是VDD、黄皮是DQ、黑皮是GND。但不同厂家线序可能不一样,拿到手先看卖家给的接线图,别凭颜色直接接。有人接到水里直接短路烧了,就是因为线序反了。
防水探头的密封性也是个坑。便宜货的热缩管封口质量差,泡个两三天水就渗进去了,表现为空气中正常、一入水就读-127°C。解决办法是自己加一层灌封胶或者用带胶热缩管再封一次。做鱼缸长期泡水的项目,建议买靠谱厂家的,别省那几块钱。
代码怎么写:OneWire和DallasTemperature库
Arduino IDE里装两个库:OneWire(Paul Stoffregen版)和DallasTemperature(Miles Burton版),装好之后代码很简单。核心就是三步:初始化总线、请求温度转换、读取结果。
12位精度下转换需要750ms,别读太快。异步方式更好:先发转换命令,让传感器自己算,主循环继续干别的事,算完了再来取。这样Arduino不会卡在那等,适合做多任务的温控系统。默认分辨率12位,0.0625°C步进,如果觉得慢可以降到9位(94ms),但精度就变成0.5°C了。
多传感器并联:一根线读多个温度
这是DS18B20最大的优势之一。所有传感器的DQ线并在一起接Arduino同一个引脚,VDD和GND各并一路,4.7kΩ上拉电阻只需要一个。代码里用sensors.getDeviceCount()扫描总线上有几片,然后按索引逐个读温度。每个传感器的64位唯一地址也可以打印出来,方便你标记哪个探头放在哪个位置。
实际做的时候注意一点:并联超过3个探头时,上拉电阻可以降到2.2kΩ甚至1.5kΩ,线长超过3米也建议降低阻值。总线负载大了,4.7kΩ上拉可能不够强,信号沿太慢就会通信失败。
DS18B20这个传感器,几块钱的价格、数字信号抗干扰、单总线省引脚,在Arduino DIY温控领域基本是标配了。新手第一次做温控项目从它入手,老手做多点监测也够稳。唯一要注意的就是上拉电阻别忘、防水版密封性要检查、线长探头多时调整阻值。










寄生模式确实不太稳,我用过一片挂2米线上,偶尔就读到-127。后来改成标准供电就没问题了。
请问如果我要挂5个防水探头做温室监测,线长大概5-6米,上拉电阻要换多小的?
上拉电阻4.7k这个真的容易忘,我第一次接线死活读不出数据,折腾半天才发现忘了加上拉。加了之后就正常了。
DS18B20确实好用,我之前做鱼缸温控也是用的这个。不过有个坑提醒大家一下:防水版探头的线序不统一,有的厂家红黄黑是VDD/DQ/GND,有的反过来。我第一次接反了直接短路冒烟,后来用万用表量了一遍才搞清楚。建议大家拿到手先查卖家给的引脚图,别想当然。