DS18B20の概要
DS18B20は、デジタル温度センサーで、1-Wire通信方式を採用しています。
1本のデータ線で複数のセンサーを同時に扱えるため、複数点の温度を計測するのに非常に便利です。
防水タイプのプローブ型も多く販売されており、屋外や液体の温度測定にも使えます。
この記事では、複数のDS18B20を単一のESP32に接続して使う際の検証コードに付いて説明しています。
Amazonで購入できるDS18B20のモジュール例
ESP32との接続方法
DS18B20は1-Wire通信なので、複数のセンサーを並列接続しても、データ線は1本で済みます。
電源方式には「外部給電」と「寄生給電」の2種類がありますが、安定動作のため外部給電方式 (3本線接続) をおすすめします。
以下は例として GPIO4 をデータ線に利用する場合の配線表です。
| DS18B20ピン | ESP32ピン | 備考 |
|---|---|---|
| VCC (赤) | 3.3V | 電源 |
| GND (黒) | GND | Gランド |
| DQ (黄) | GPIO4 | データ線(10kΩプルアップ抵抗をVCCと接続) |
※複数のDS18B20を接続する場合も、VCC、GND、DQを並列接続します。
必要なライブラリ
ESP32でDS18B20を使う場合、以下のライブラリが必要です。
- OneWire
- 作者: Jim Studt, others
- URL: https://github.com/PaulStoffregen/OneWire
- DallasTemperature
- 作者: Miles Burton, Tim Newsome, Guil Barros, Rob Tillaart, others
- URL: https://github.com/milesburton/Arduino-Temperature-Control-Library
サンプルコード
以下は、複数のDS18B20をESP32に接続したときに、すべてのセンサーから温度を取得する最小限のサンプルコードです。
#include <OneWire.h>
#include <DallasTemperature.h>
// DS18B20のデータ線を接続したGPIO番号
#define ONE_WIRE_BUS 4
// OneWireバスの初期化
OneWire oneWire(ONE_WIRE_BUS);
// DallasTemperatureライブラリにOneWireバスを渡す
DallasTemperature sensors(&oneWire);
void setup() {
// シリアルモニタ開始
Serial.begin(115200);
Serial.println("DS18B20 複数センサー温度計測開始");
// センサー初期化
sensors.begin();
Serial.print("検出されたセンサー数: ");
Serial.println(sensors.getDeviceCount());
}
void loop() {
// 温度測定をリクエスト
sensors.requestTemperatures();
// 全センサーの数を取得
int deviceCount = sensors.getDeviceCount();
// 各センサーの温度を取得して出力
for (int i = 0; i < deviceCount; i++) {
float tempC = sensors.getTempCByIndex(i);
Serial.print("センサー ");
Serial.print(i);
Serial.print(" の温度: ");
if (tempC == DEVICE_DISCONNECTED_C) {
Serial.println("センサーが接続されていません");
} else {
Serial.print(tempC);
Serial.println(" ℃");
}
}
// 2秒待機
delay(2000);
}
動作方法と出力サンプル
- Arduino IDEで上記のコードをESP32に書き込みます
- シリアルモニタを115200bpsで開きます
- 複数のDS18B20を同じデータ線に接続していれば、自動的にすべてのセンサーが検出されます
出力サンプル(例)
DS18B20 複数センサー温度計測開始
検出されたセンサー数: 3
センサー 0 の温度: 25.62 ℃
センサー 1 の温度: 26.18 ℃
センサー 2 の温度: 24.97 ℃
