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Ωの抵抗は、私が販売している改造済みのセンサでは必要ありません。
▼ ArduinoやESP32、M5 Stackなどお好きなボードをお使いください。
▼ どのArduinoを選べば良いか分からない方はこちら。
▼ これらのブレッドボードやジャンプワイヤも揃えておくと便利です。
DS18B20ライブラリのインストール
ArduinoやESP32でDS18B20を扱う場合は以下のライブラリを使用すると便利です。 GitHub - matmunk/DS18B20: Arduino library for the Maxim Integrated DS18B20 1-Wire temperature sensor.
またこちらのOneWireライブラリも必要になりますので同時にインストールします。 GitHub - PaulStoffregen/OneWire: Library for Dallas/Maxim 1-Wire Chips
ライブラリマネージャーで検索してインストールするか、またはソースコードをダウンロードして直接プロジェクト内へ配置してください。
私は普段、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
DS18B20 ds(SENSOR_PIN);
void setup() {
Serial.begin(115200);
/* ESP32のGPIO34-39はソフトウェアプルアップに対応してないので注意 */
// pinMode(SENSOR_PIN, INPUT_PULLUP); // ←プルアップ抵抗が取り付けられていない場合はこちらを使う
pinMode(SENSOR_PIN, INPUT);
}
void loop() {
while (ds.selectNext()) {
uint8_t address[8];
ds.getAddress(address);
Serial.print("Address:");
for (uint8_t i = 0; i < 8; i++) {
Serial.print(" ");
Serial.print(address[i]); // ex. 40 128 207 1 0 0 0 54
}
Serial.println();
float tempC = ds.getTempC();
Serial.println(tempC);
}
delay(1000);
}
こちらの動画のように、 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 zero WHをモニター・キーボードなしで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のデータシートはこちらをご覧ください。 デジタル温度センサ(1wire)DS18B20+ - 秋月電子通商
▼ プルアップ抵抗を内蔵したDS18B20を販売中です。
コマンドで温度を取得
DS18B20の温度データをコマンドで取得してみます。
DS18B20の場所を確認
DS18B20のディレクトリの場所を確認します。 Raspberry PiとDS18B20温度センサが正しく接続されていれば、$ ls /sys/bus/w1/devices/ を実行すると、28-から始まるディレクトリが表示されるはずです。
$ ls /sys/bus/w1/devices/
28-0301a279ec09@ w1_bus_master1@
温度データの取得
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
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
sensor = W1ThermSensor()
while True:
temperature_in_celsius = sensor.get_temperature()
temperature_in_fahrenheit = sensor.get_temperature(Unit.DEGREES_F)
print("celsius: {0:.3f}".format(temperature_in_celsius))
print("fahrenheit: {0:.3f}".format(temperature_in_fahrenheit))
time.sleep(1.0)