DS18B20を使ってESP32で水中や土壌の温度を測定する

DS18B20を使ってESP32で水中や土壌の温度を測定する

つかうもの

この記事でつかうものをご紹介いたします。

DS18B20温度センサ

防水加工されたDS18B20温度センサを使います。水中や土壌の温度を気軽に測定できます。DS18B20は「1-Wire」という規格で通信するデジタル温度センサです。供給電圧は3.3Vと5Vのどちらでも使えますのでArduinoやESP32だけでなくラズパイでもお使いになれます。 データシート によれば、-55°Cから+125°Cの範囲で使用可能、-10°Cから+85°Cの範囲で±0.5°Cの精度だそうです。

\ラズパイでDS18B20の使い方/

メルカリで販売中!

ケーブル長さを3mに延長し、ジャンプワイヤーを取り付けたものをメルカリで販売中です!

▼ プルアップ抵抗内蔵版

▼ 4.7kΩのプルアップ抵抗付き

ESP32

WayinTopさんから販売されているESP32を使用しました。技適マークも刻印されていますので、安心して国内で使えます。GPIOの役割図は 商品ページ に詳しく掲載されていますのでご参考ください。

▼ WiFiやBluetooth接続が必要なければ、他のArduinoでも構いません。こちらの記事で色々な種類のArduinoをご紹介していますので、ご参考になさってみてください。

DS18B20とESP32の配線

DS18B20とESP32の配線は次の通り行いました。GPIO27以外のピンでも構いませんが、ソフトウェアプルアップが可能なピンを選んでください。ESP32ではGPIO34〜39番はソフトウェアプルアップに対応してませんので、そこへ繋ぐ場合はハード的なプルアップ抵抗が必要になります。

DS18B20 ESP32
VCC (赤) 3.3V
DATA (黄) GPIO27
GND (黒) GND
1-Wire通信はその名の通り信号のやり取りを一本で済ませられる規格です。しかも複数のDS18B20をシリアルLEDのように数珠繋ぎで配線して、それぞれのデバイスの温度を読み取ることが可能なようです。

ライブラリのインストール

matmunkさんの「DS18B20」というライブラリを使用します。ライブラリマネージャーで検索してインストールするか、または下記URLからソースコードをダウンロードして直接配置してください。

またこのライブラリを使うために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

温度測定のサンプルプログラム(ソースコード)

次は温度をシリアルモニタへ表示するだけの簡単なソースコードになります。ESP32へスケッチをアップロードして温度が正常に表示されるか確認しましょう。

/**
 * @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

DS18B20 ds(SENSOR_PIN);

void setup() {
    Serial.begin(115200);
    /* GPIO34-39はソフトウェアプルアップに対応してないので注意 */
    pinMode(SENSOR_PIN, INPUT_PULLUP);
}

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ディスプレイ ST7789DHT22と組み合わせて、水中(土壌)温度、気温、湿度が測れるデバイスを作ってみました。

記事に関するご質問などがあれば、お問い合わせ までご連絡ください。
関連記事