ds18b20 简介
DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C ,其IO只有3个:VCC,GND,和 DQ,其中 DQ 为单总线,可以输出和输入数据,特别的,多个 18b20 的 DQ 可以连接到 MCU 同一个 IO 口上,每个 18b20 都有一个 唯一ID,MCU通过该ID来读取指定传感器的温度值。
ds18b20 是通过总线竞争来避免数据干扰的,详见:DS18B20单总线策略的分析
程序设计
1. 库安装
驱动 ds18b20 需要安装2个库,第1个库为单总线库 OneWire:
本文安装的版本为 2.3.5
第二个库为 ds18b20 的库 DallasTemperature :
本文安装的版本为 3.9.0
至此已完成了本文所需库的安装
2. 硬件连接
本文使用了 2个 ds18b20 ,接入一个 4.7k 上拉电阻(这一步是必须的,否则无法读取温度),DQ 数据线接入 D2 中:
3. 运行例程
Arduino 的库通常有一些简单好用的例程,我们可以直接使用:、
文件 -> 示例 -> DS18B20 -> Multiple
该示例为读取多点温度的程序,Alarms 应该为报警温度,在ds18b20中,也可以设置最高和最低温度报警值,如果以读取报警温度的指令来读取,则只有处于报警温度的设备会反馈温度。Multiple 代码如下:
#include <DS18B20.h>
DS18B20 ds(2);
void setup() {
Serial.begin(9600);
Serial.print("Devices: ");
Serial.println(ds.getNumberOfDevices());
Serial.println();
}
void loop() {
while (ds.selectNext()) {
switch (ds.getFamilyCode()) {
case MODEL_DS18S20:
Serial.println("Model: DS18S20/DS1820");
break;
case MODEL_DS1822:
Serial.println("Model: DS1822");
break;
case MODEL_DS18B20:
Serial.println("Model: DS18B20");
break;
default:
Serial.println("Unrecognized Device");
break;
}
uint8_t address[8];
ds.getAddress(address);
Serial.print("Address:");
for (uint8_t i = 0; i < 8; i++) {
Serial.print(" ");
Serial.print(address[i]);
}
Serial.println();
Serial.print("Resolution: ");
Serial.println(ds.getResolution());
Serial.print("Power Mode: ");
if (ds.getPowerMode()) {
Serial.println("External");
} else {
Serial.println("Parasite");
}
Serial.print("Temperature: ");
Serial.print(ds.getTempC());
Serial.print(" C / ");
Serial.print(ds.getTempF());
Serial.println(" F");
Serial.println();
}
delay(10000);
}
第3行,指明了 DQ 连接 MCU 为 GPIO2 ,本文连接在丝印 D2 处也就是 GPIO4
所以应该将括号内的 2
改为 4
:
#include <DS18B20.h>
DS18B20 ds(4);
void setup() {
Serial.begin(9600);
Serial.print("Devices: ");
Serial.println(ds.getNumberOfDevices());
Serial.println();
}
void loop() {
while (ds.selectNext()) {
switch (ds.getFamilyCode()) {
case MODEL_DS18S20:
Serial.println("Model: DS18S20/DS1820");
break;
case MODEL_DS1822:
Serial.println("Model: DS1822");
break;
case MODEL_DS18B20:
Serial.println("Model: DS18B20");
break;
default:
Serial.println("Unrecognized Device");
break;
}
uint8_t address[8];
ds.getAddress(address);
Serial.print("Address:");
for (uint8_t i = 0; i < 8; i++) {
Serial.print(" ");
Serial.print(address[i]);
}
Serial.println();
Serial.print("Resolution: ");
Serial.println(ds.getResolution());
Serial.print("Power Mode: ");
if (ds.getPowerMode()) {
Serial.println("External");
} else {
Serial.println("Parasite");
}
Serial.print("Temperature: ");
Serial.print(ds.getTempC());
Serial.print(" C / ");
Serial.print(ds.getTempF());
Serial.println(" F");
Serial.println();
}
delay(10000);
}
可以看到获取到2个ds18b20,并打印出他们的温度:
重要提示:这个例程似乎会出现 内存 问题,导致读取几次温度后,会打印一些信息,经测试是esp重启了,原因不明。