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 |
ライブラリのインストール
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ディスプレイ ST7789やDHT22と組み合わせて、水中(土壌)温度、気温、湿度が測れるデバイスを作ってみました。
水中(土壌)温度、気温、湿度が測れるデバイスの完成です!(WiFiやロギング機能はこれから実装予定)
— アラギ (@tosisico) December 6, 2022
それにしても最近冷えてきました...寒がりな私はメダカ先輩たちへ頭が上がりません... pic.twitter.com/V6B4o40t02