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

DS18B20の使い方|Arduino・ESP32・Raspberry Pi
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. デジタル温度センサー
  2. 1-Wire通信
  3. 防水加工済み
  4. プルアップ抵抗内蔵
  5. ケーブル長さ2M
  6. ジャンプワイヤー付き

ただし繋ぎ目部分は簡易的な防水対策ですので浸水は避けてください。センサーの先端は防水加工済みで浸水可能です。

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の配線例
DS18B20とArduinoの配線例

DS18B20とArduinoの配線
DS18B20とArduinoの配線
DS18B20とESP32の配線
DS18B20とESP32の配線

改良版DS18B20オリジナルArduinoESP32
VCC(赤)5V3.3V
DATA(白)A0GPIO27
GND(黒or緑)GNDGND

ただし4.7kΩの抵抗は、私が販売している改造済みのセンサでは必要ありません。

DATA線はA0またはGPIO27以外のピンでも構いません。ご自身でプルアップ抵抗を用意する場合、ESP32ではGPIO34〜39番はソフトウェアプルアップに対応してませんのでご注意ください。

▼ 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で温度をシリアルモニタへ表示する簡単なサンプルプログラムを示します。

demo.ino
/**
 * @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
OSRaspbian 9.13
Python3.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は有効になってます。

shell
w1_therm                7330  0
w1_gpio                 3171  0
wire                   32947  2 w1_gpio,w1_therm

配線

こちらが、Raspberry PiとDS18B20温度センサの配線図です。

Raspberry Piと温度センサの配線図
Raspberry Piと温度センサの配線図

ラズパイDS18B20
3.3V or 5VVdd
GPIO4DQ
GNDGND

DS18B20の各ピン役割
DS18B20の各ピン役割

プルアップ抵抗

DS18B20のデータ線はプルアップする必要があります。Raspberry Piの3.3VとGPIO4の間に、4.7kΩのプルアップ抵抗をつないでください。

DS18B20のデータシートはこちらをご覧ください。 デジタル温度センサ(1wire)DS18B20+ - 秋月電子通商

▼ プルアップ抵抗を内蔵したDS18B20を販売中です。

コマンドで温度を取得

DS18B20の温度データをコマンドで取得してみます。

DS18B20の場所を確認

DS18B20のディレクトリの場所を確認します。 Raspberry PiとDS18B20温度センサが正しく接続されていれば、$ ls /sys/bus/w1/devices/ を実行すると、28-から始まるディレクトリが表示されるはずです。

shell
$ ls /sys/bus/w1/devices/
28-0301a279ec09@  w1_bus_master1@

「28-」以降の「28-0301a279ec09」はセンサデバイスが持つ固有IDです。 @(アットマーク)はシンボリックリンクの意味です。

温度データの取得

28-0301a279ec09ディレクトリの中に、w1_slaveファイルがあるので、その中身をcatコマンドで表示させてみます。
shell
$ 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を指定しないと、インポートエラーで使うことができませんでした。
shell
$ pip3 install w1thermsensor==2.0.0a2

ソースコード

摂氏温度と華氏温度を、1秒おきに表示するPythonのソースコードです。w1thermsensorを使うことで、とても簡単にDS18B20の温度データを取得できました。

py
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)

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

スマート農業(スマートアグリ)で使えるセンサー
水耕栽培はじめよう!
関連記事