|
| 1 | +--- |
| 2 | +title: 温度传感器 DS18B20 |
| 3 | +order: 8 |
| 4 | +icon: thermometer |
| 5 | +--- |
| 6 | + |
| 7 | +## 简介 |
| 8 | + |
| 9 | +本章介绍使用Air001开发板驱动 DS18B20。 |
| 10 | + |
| 11 | +::: tip |
| 12 | + |
| 13 | +DS18B20 是数字温度传感器,使用1Wire(单总线)通信接口,只需要一条数据线 (和地线) 即可与处理器进行数据传输。 |
| 14 | +器件可以工作在-55°C至+125°C范围,在-10°C至+85°C范围内测量精度为±0.5°C。 |
| 15 | +每个DS18B20具有唯一的64位序列号,从而允许多个DS18B20挂接在同一条1-Wire总线。 |
| 16 | + |
| 17 | +::: |
| 18 | + |
| 19 | +## 硬件准备 |
| 20 | + |
| 21 | +- 按[☁️ Air001开发板入门](/tutorial-advanced/Air001_start.html),将`Air001`和`DAPLink调试器`使用排针排母连接。 |
| 22 | + |
| 23 | +- 将`DS18B20`模块与`Air001开发板`,按如下表格进行相连: |
| 24 | + |
| 25 | +| DS18B20 | Air001 | |
| 26 | +| :-----: | :----: | |
| 27 | +| GND | GND | |
| 28 | +| VCC | 3.3V | |
| 29 | +| DQ | PA_5 | |
| 30 | + |
| 31 | +::: warning |
| 32 | + |
| 33 | +如果你是直接连接的`DS18B20`元器件,你需要为`DQ`进行上拉操作。 |
| 34 | +(比如在`VCC`与`DQ`之间连接一颗`4.7K电阻`) |
| 35 | + |
| 36 | +::: |
| 37 | + |
| 38 | +## 软件部分 |
| 39 | + |
| 40 | +首先,安装`DallasTemperature`库,并选择`全部安装`以安装所需依赖。 |
| 41 | + |
| 42 | +:::details 打开Arduino管理库,进行安装 |
| 43 | + |
| 44 | +可以打开Arduino管理库,找到`Adafruit DallasTemperature Library`库,并选择`全部安装`以安装所需依赖。 |
| 45 | + |
| 46 | + |
| 47 | + |
| 48 | + |
| 49 | + |
| 50 | +::: |
| 51 | + |
| 52 | +为了保证单总线的时序保持正常,我们需要将芯片主频设置为最高的 48M。 |
| 53 | + |
| 54 | +:::details 在Arduino中设置芯片主频 |
| 55 | + |
| 56 | + |
| 57 | + |
| 58 | +::: |
| 59 | + |
| 60 | +开头引用`OneWire`包与`DallasTemperature`包,并实例化对象`sensors`,后续仅需调用`sensors`对象即可使用DS18B20。 |
| 61 | + |
| 62 | +```cpp |
| 63 | +// 引用必要的库 |
| 64 | +#include <OneWire.h> |
| 65 | +#include <DallasTemperature.h> |
| 66 | + |
| 67 | +// 初始化一个单总线对象,设置使用PA_5引脚进行通信 |
| 68 | +OneWire oneWire(PA_5); |
| 69 | +// 初始化一个传感器对象,使用刚新建的单总线对象 |
| 70 | +DallasTemperature sensors(&oneWire); |
| 71 | +``` |
| 72 | +
|
| 73 | +在`setup()`函数中初始化串口与`sensors`对象: |
| 74 | +
|
| 75 | +```cpp |
| 76 | +void setup() { |
| 77 | + //初始化串口 |
| 78 | + Serial.begin(9600); |
| 79 | + //初始化传感器库 |
| 80 | + sensors.begin(); |
| 81 | +} |
| 82 | +``` |
| 83 | + |
| 84 | +在`loop()`函数中添加如下代码: |
| 85 | + |
| 86 | +```cpp |
| 87 | +void loop() { |
| 88 | + Serial.print("开始获取温度信息..."); |
| 89 | + sensors.requestTemperatures(); //发出获取温度的请求 |
| 90 | + Serial.println("获取完成"); |
| 91 | + // 我们只取第一个传感器的温度信息 |
| 92 | + float tempC = sensors.getTempCByIndex(0); |
| 93 | + |
| 94 | + //检查一下是不是真的获取成功了 |
| 95 | + if (tempC != DEVICE_DISCONNECTED_C) { |
| 96 | + Serial.print("获取到的温度为:"); |
| 97 | + Serial.print(tempC); |
| 98 | + Serial.println("℃"); |
| 99 | + } else { |
| 100 | + Serial.println("数据读取失败!"); |
| 101 | + delay(500); |
| 102 | + } |
| 103 | + Serial.println(); |
| 104 | +} |
| 105 | +``` |
| 106 | + |
| 107 | +- 使用`sensors.requestTemperatures`方法,尝试获取温度。 |
| 108 | +- 使用`sensors.getTempCByIndex`方法,获取到第一个设备的温度值。 |
| 109 | +- 如果成功获取,将温度值打印出来 |
| 110 | + |
| 111 | +## 输出结果 |
| 112 | + |
| 113 | +在串口监视器中将波特率调至9600,可观察到当前的信息,如下: |
| 114 | + |
| 115 | +```log |
| 116 | +开始获取温度信息...获取完成 |
| 117 | +获取到的温度为:27.19℃ |
| 118 | +
|
| 119 | +开始获取温度信息...获取完成 |
| 120 | +获取到的温度为:27.25℃ |
| 121 | +
|
| 122 | +开始获取温度信息...获取完成 |
| 123 | +获取到的温度为:27.19℃ |
| 124 | +
|
| 125 | +开始获取温度信息...获取完成 |
| 126 | +获取到的温度为:27.25℃ |
| 127 | +
|
| 128 | +开始获取温度信息...获取完成 |
| 129 | +获取到的温度为:27.19℃ |
| 130 | +
|
| 131 | +开始获取温度信息... |
| 132 | +``` |
0 commit comments