M5StickCでできること 〜防水タイプの温度センサ(DS18B20)を使う

畑の端に小さな水田エリア(ミニ田んぼ)をつくり、そこで米づくりを体験してみようと考えています。

そのミニ田んぼの「水温」を測りたいなぁと思っていたところ、知り合いの方から、こちらの温度センサを紹介していただきました。


価格が安い上、防水とのことで、今回の用途にピッタリです。

また、このセンサは「1-Wire」という通信規格をつかっています。
同じ信号線に複数のセンサをつなぐことができるため、例えばふたつの温度センサで「水温」と「気温」を同時に測定するというようなことも簡単に実現できそうです。

そんな訳で、早速このセンサを購入し、M5StickCにつないで動作確認してみることにしました。
使い方については、こちら の記事を参考にさせていただきました。

まず、Arduino IDEに「OneWire」「DallasTemperature」というふたつのライブラリをインストールします。

「ファイル」>「スケッチ例」>「DallasTemperature」>「Simple」を開き、少しだけ修正します。

#include <M5StickC.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 33

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  M5.begin();
  Serial.println("Dallas Temperature IC Control Library Demo");
  sensors.begin();
}

void loop() { 
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  float tempC = sensors.getTempCByIndex(0);

  if(tempC != DEVICE_DISCONNECTED_C) {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  } else {
    Serial.println("Error: Could not read temperature data");
  }
}

温度センサの各端子に「ピンコネクタ」をつけます。

ブレッドボードをつかって、温度センサの各端子をM5StickCのGROVEポートにつなぎます。
「1-Wire」の信号線にはプルアップ抵抗が必要とのことなので、以下のように4.7kΩの抵抗をつないでいます。

先ほどのスケッチをM5StickCに書き込み、シリアルモニタを起動すると、以下のように測定した温度が表示されます。

とても簡単です!

次に、複数の温度センサをつないでみようと思います。
今回は試しに、4つの温度センサをつなぎ、それぞれで温度を測定してみたいと思います。

まずは、各温度センサのアドレスを確認するため、以下のスケッチを準備します。

#include <M5StickC.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 33

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress temp;

void setup() {
  M5.begin();

  sensors.begin();
  sensors.getAddress(temp, 0);
  for(int i=0; i<8; i++) {
    Serial.print(" 0x");
    Serial.print(temp[i], HEX);
  }
  Serial.println();
}

void loop() { 
}

このスケッチをM5StickCに書き込むと、つながっている温度センサのアドレスがシリアルモニタに表示されます。
順番に温度センサを取り替えて、各センサのアドレスを確認し、控えておきます。

次に、以下のスケッチを準備します。
先ほど調べた各温度センサのアドレスが書き込まれています。

#include <M5StickC.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 33

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress temp0 = { 0x28, 0x13, 0x0D, 0x05, 0x5F, 0x20, 0x01, 0xCA };
DeviceAddress temp1 = { 0x28, 0x14, 0x7E, 0x02, 0x5F, 0x20, 0x01, 0xEA };
DeviceAddress temp2 = { 0x28, 0xAF, 0x02, 0xD8, 0x5F, 0x20, 0x01, 0x43 };
DeviceAddress temp3 = { 0x28, 0xA1, 0xE7, 0x06, 0x5F, 0x20, 0x01, 0x4C };

void setup() {
  M5.begin();
  sensors.begin();
  M5.Lcd.setRotation(3);
}

void loop() {
  sensors.requestTemperatures();
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(0, 0, 2);
  M5.Lcd.printf("[temp0] %.2f\n", sensors.getTempC(temp0));
  M5.Lcd.printf("[temp1] %.2f\n", sensors.getTempC(temp1));
  M5.Lcd.printf("[temp2] %.2f\n", sensors.getTempC(temp2));
  M5.Lcd.printf("[temp3] %.2f\n", sensors.getTempC(temp3));
  delay(1000);
}

4つの温度センサを、以下のように1-wireの信号線につなぎます。

先ほどのスケッチをM5StickCに書き込むと、LDC画面に各センサが測定した温度が表示され、1秒毎に更新されます。
温度センサを握ると、そのセンサの温度表示だけが上がっていくことを確認できました。

ちなみに、ここで使っているコネクタは「WAGOワンタッチコネクタ」というもので、このコネクタに取り付けた5本の配線が全てつながります。


なお、M5StickCのGROVEポートは、電源が5Vなのに対し、信号線は3.3V系です。
今回は事情があって、温度センサをGROVEポートにつなぎましたが、本来はGROVEポートを使わず、HAT用の端子を使った方が良いように思います。

とても簡単に使うことができました!
これまで、いくつかの温度センサを使ってきましたが、「安い」「防水」というのは大きなメリットです。
動作温度範囲も -55℃ 〜 125℃ と広く、田んぼの他にも、色々と活用できそうです。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。