DS18B20の使い方|Arduino・ESP32・Raspberry Pi

はじめに
防水加工されたDS18B20とArduinoやESP32などのマイコンボードを繋いで、水中や土壌内の温度をカンタンに測定することが可能です。DS18B20はデジタルセンサで、1-Wireという通信方法でマイコンとやり取りします。1-Wire通信はRaspberry Piでも使えます。
DS18B20温度センサの特徴
DS18B20を使うためには通常、プルアップ抵抗が必要になります。プルアップ抵抗がないと1-Wire通信が行えません。ESP32などではソフトウェアプルアップが可能ですが、ケーブル長さが数メートルになると通信が安定しません。そこでプルアップ抵抗4.7kΩをケーブル内に内蔵し、ケーブル長さを2mに伸ばしました。プルアップ抵抗はデータ線とVccの間にはんだ付けされてます。また、ブレッドボードで刺して使えるよう、ジャンプワイヤーも装着しました。
こちらの製品の特徴をまとめますと次のとおりです。
- デジタル温度センサー
- 1-Wire通信
- 防水加工済み
- プルアップ抵抗内蔵
- ケーブル長さ2M
- ジャンプワイヤー付き
ただし繋ぎ目部分は簡易的な防水対策ですので浸水は避けてください。センサーの先端は防水加工済みで浸水可能です。
DS18B20温度センサの仕様
DS18B20は-55°C〜+125°Cの範囲で使用可能です。-10°C〜+85°Cの範囲で±0.5°Cの精度になります。またセンサへの供給電圧は、3.0V〜5.5Vの範囲でお使いになれます。
デジタルデータのやり取りは、1-Wire通信で行います。ライブラリを使うことで簡単に通信できますのでご安心ください。1-Wire通信はその名の通り、信号のやり取りをたったの1本で済ませられる規格です。しかも複数の1-Wireデバイスを数珠繋ぎにしてそれぞれのセンサからデータを読み取ることが可能です。つまり、通信線はGPIOピン1つで複数のDS18B20を繋ぐことができます。
ArduinoでDS18B20を使う
配線
DS18B20とArduinoの配線例を図に示します。



改良版DS18B20 | オリジナル | Arduino | ESP32 |
---|---|---|---|
VCC(赤) | 赤 | 5V | 3.3V |
DATA(白) | 黄 | A0 | GPIO27 |
GND(黒or緑) | 黒 | GND | GND |
ただし4.7kΩの抵抗は、私が販売している改造済みのセンサでは必要ありません。
DATA線はA0またはGPIO27以外のピンでも構いません。ご自身でプルアップ抵抗を用意する場合、ESP32ではGPIO34〜39番はソフトウェアプルアップに対応してませんのでご注意ください。
DS18B20ライブラリのインストール
ArduinoやESP32でDS18B20を扱う場合は以下のライブラリを使用すると便利です。 https://github.com/matmunk/DS18B20
またこちらのOneWireライブラリも必要になりますので同時にインストールします。 https://github.com/PaulStoffregen/OneWire
ライブラリマネージャーで検索してインストールするか、またはソースコードをダウンロードして直接プロジェクト内へ配置してください。
私は普段、VS CodeのPlatformIOを使ってArduino開発してます。ライブラリ配置の例を図で示します。
.
├── include
│ └── README
├── lib
│ ├── DS18B20
│ │ ├── DS18B20.cpp
│ │ ├── DS18B20.h
│ │ ├── OneWire.cpp
│ │ ├── OneWire.h
│ │ ├── examples
│ │ │ └── demo
│ │ │ └── demo.ino
│ │ └── util
│ │ ├── OneWire_direct_gpio.h
│ │ └── OneWire_direct_regtype.h
│ └── README
├── platformio.ini
├── src
│ └── main.cpp
└── test
└── README
ソースコード
DS18B20で温度をシリアルモニタへ表示する簡単なサンプルプログラムを示します。
/**
* @date 2022-12-01
* @author Toshihiko Arai
* @copyright https://101010.fun
*/
#include <Arduino.h>
#include <DS18B20.h>
/**
* @brief DS18B20 <--> ESP32 の配線
* VCC <--> 3.3V
* DATA <--> GPIO27
* GND <--> GND
*/
#define SENSOR_PIN 27 // ESP32
//#define SENSOR_PIN A0 // Arduino
(SENSOR_PIN);
DS18B20 ds
void setup() {
.begin(115200);
Serial/* ESP32のGPIO34-39はソフトウェアプルアップに対応してないので注意 */
// pinMode(SENSOR_PIN, INPUT_PULLUP); // ←プルアップ抵抗が取り付けられていない場合はこちらを使う
(SENSOR_PIN, INPUT);
pinMode}
void loop() {
while (ds.selectNext()) {
uint8_t address[8];
.getAddress(address);
ds
.print("Address:");
Serialfor (uint8_t i = 0; i < 8; i++) {
.print(" ");
Serial.print(address[i]); // ex. 40 128 207 1 0 0 0 54
Serial}
.println();
Serial
float tempC = ds.getTempC();
.println(tempC);
Serial}
(1000);
delay}
TFT LCDディスプレイ や DHT22 と組み合わせて、水温・気温・湿度を同時に測定できる環境モニタを作ることも可能です。Ambientにデータを飛ばせば、グラフ化することも可能です。
Raspberry PiでDS18B20を使う
ここではRaspberry Pi zero WHを使いましたが、みなさんはお好きなRaspberry Piをご使用ください。
開発環境
今回の開発環境は次の通り。
項目 | バージョン |
---|---|
ラズパイ | Raspberry Pi zero WH |
OS | Raspbian 9.13 |
Python | 3.7.0 |
温度センサ | DS18B20 |
なお、Raspberry Piの操作は、MacのターミナルからSSHでリモート操作します。SSHのセットアップは、 をご覧ください。
Raspberry Piで1-Wireを有効にする設定
Raspberry
Piでは、1-Wireデータを読み取れるドライバーが内蔵されてます。ただしデフォルトでは無効になってますので、それを使えるように有効化します。
$ sudo vi /boot/config.txt
を実行し、下記内容を追加してください。
dtoverlay=w1-gpio,gpiopin=4,pullup=y
その後Raspberry Piを再起動します。
$ lsmod | grep w1
を実行し、次のような表示がでれば1-Wireは有効になってます。
w1_therm 7330 0
w1_gpio 3171 0
wire 32947 2 w1_gpio,w1_therm
配線
こちらが、Raspberry PiとDS18B20温度センサの配線図です。

ラズパイ | DS18B20 |
---|---|
3.3V or 5V | Vdd |
GPIO4 | DQ |
GND | GND |

プルアップ抵抗
DS18B20のデータ線はプルアップする必要があります。Raspberry Piの3.3VとGPIO4の間に、4.7kΩのプルアップ抵抗をつないでください。
DS18B20のデータシートはこちらをご覧ください。 https://akizukidenshi.com/catalog/g/gI-05276/
▼ プルアップ抵抗を内蔵したDS18B20を販売中です。 https://mercari-shops.com/products/jJDyt8LEJ9gUwHL2bfcWTW
コマンドで温度を取得
DS18B20の温度データをコマンドで取得してみます。
DS18B20の場所を確認
DS18B20のディレクトリの場所を確認します。 Raspberry
PiとDS18B20温度センサが正しく接続されていれば、$ ls /sys/bus/w1/devices/
を実行すると、28-
から始まるディレクトリが表示されるはずです。
$ ls /sys/bus/w1/devices/
28-0301a279ec09@ w1_bus_master1@
「28-」以降の「28-0301a279ec09」はセンサデバイスが持つ固有IDです。 @(アットマーク)はシンボリックリンクの意味です。
温度データの取得
28-0301a279ec09
ディレクトリの中に、w1_slave
ファイルがあるので、その中身をcat
コマンドで表示させてみます。
$ cat /sys/bus/w1/devices/28-0301a279ec09/w1_slave
5c 01 55 05 7f a5 a5 66 50 : crc=50 YES
5c 01 55 05 7f a5 a5 66 50 t=21750
t=21750
がDS18B20で測定された温度になります。摂氏温度で1000倍にして表示されます。ですからこの場合、21.75℃であることがわかります。
DS18B20センサを手で握ったりして、もう一度確認してみてください。温度が変化しているはずです。
Pythonで温度を取得
つぎに、DS18B20の温度データをPythonで取得してみます。
1-Wireのライブラリ
先ほどのコマンドによるデータ表示のとおり、1-Wireのデータはテキストファイルに書き込まれます。よって、それをPythonで読み取りパースすれば、必要なデータの取得はできるでしょう。ただし、すでにPythonで1-Wireデータ取得できるライブラリがありますので、ここではそれを使っていきます。
w1thermsensorのインストール
Pythonで1-Wireを簡単に扱うことができる、 w1thermsensor というライブラリをインストールします。
pip3
をつかって、次のようにしてインストールしました。ただし、バージョン2.0.0a2
を指定しないと、インポートエラーで使うことができませんでした。
$ pip3 install w1thermsensor==2.0.0a2
ソースコード
摂氏温度と華氏温度を、1秒おきに表示するPythonのソースコードです。w1thermsensorを使うことで、とても簡単にDS18B20の温度データを取得できました。
from w1thermsensor import W1ThermSensor, Unit
import time
= W1ThermSensor()
sensor
while True:
= sensor.get_temperature()
temperature_in_celsius = sensor.get_temperature(Unit.DEGREES_F)
temperature_in_fahrenheit print("celsius: {0:.3f}".format(temperature_in_celsius))
print("fahrenheit: {0:.3f}".format(temperature_in_fahrenheit))
1.0) time.sleep(
関連記事
- ESP32でAdafruit STEMMA Soil Sensorを使って土壌水分量と温度の測定
- 【Raspberry Pi】はじめてのI2C設定
- ダイソーのリモコンシャッターをESP32で通信するためのヘルパー関数
- ESP32とMH-Z19CセンサでCO2濃度の測定
- 自作LANケーブルの作り方〜Arduinoとセンサ間をLANケーブルでI2C、1-Wire、電源供給