今回は、温度センサーDS18B20を紹介します。データシートによると、「… digital thermometer provides 9-bit to 12-bit」とだけあり、計測原理などについての言及はないようです。おそらくICセンサーかと思われます。(ワンチップ)ICセンサーとは「センシング入門」(オーム社)によると、「トランジスタのベース-エミッタ間電圧が、温度に比例して変化することを利用している・・・大量生産されるために安価であり、小型・高精度で経時変化も少ないのが特長である」だそうです。実際、このセンサーは非常に安く、同じ製品が様々な価格で売られているのですが、Amazonでは例えば2m程度のケーブル付きで、センシング部が金属の防水ケースに入ったものが10本3000円程度で売られています。ケーブルの価格だけでこのくらいするんじゃないかという価格です。DS18B20で検索して下さい。データシートはこちら。

https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

 

 

一度、壊れたものを鉄ノコで切断して中身を覗いたことがあります。こんなに小さいのに、なかなか切断に苦労しました。ケースはクロムメッキされた鉄でできているように見えました。ちょっと踏んだくらいでは壊れない、頑丈なつくりです。ケーブルなしで、センサーそのものだけでも売っています(下の写真で、カッターマットのグリッドは5mmです)。

 

 

この温度センサーはデジタルで、印加電圧(VDD・GND)に加えて1本の通信線を使用します。I2CでもSPIでもないということです(第5回参照)。データシートにある主な特長をまとめます。

・計測温度範囲:-55oC to +125oC

・正確度:±0.5oC正確性(-10oC to +85oC)

・プログラムにより分解能を9~12 Bitで変更可

 

DS18B20の使用方法

 このセンサーの優れた点は、いくら芋づる式に多連にして使っても1つのピンしか通信に使わないということです。I2Cに似て、個々のセンサーがそれぞれの固有の64-bitアドレスを有しています。ところがこのアドレスは購入したときの袋などには一切書いていないので、Arduino(などのマイコン)を使って読み出してやらなければなりません。このときは、1つずつ繋いで読み取っていきます。まずは以下のように一本ずつつないでください。DQのピンはどこでもいいです。スケッチで指定してください。ここではデジタルピン8を使っています。

注意点:

・ケーブルは何色が何、などという説明はついていません。赤・黒・黄でくることが多いですが、常識に沿って、赤:VDD、黒:GNDで、残った黄が通信線(データシートではDQと書かれています)になります。

・単につないだだけだとうまく通信できないことがあります。この場合、図のようにDQとVDDの間に1kΩ程度のプルアップ抵抗を入れてください。データシートの例では4.7kΩとありますが、私の経験では、Arduinoを使った場合、もう少し小さい抵抗でないと応答しませんでした。

 

 

次に、以下のスケッチを走らせます(どこかから拝借してきたものです。どこが元か忘れてしまいました。作った人、クレジットできずすみません)。以下のライブラリが必要になります。

OneWire.h

https://github.com/PaulStoffregen/OneWire

 



#include <OneWire.h>

 

OneWire ds(8);  // This is where DQ of your DS18B20 will connect.

 

void setup(void) {

  Serial.begin(9600);

  getDeviceAddress();

}

 

void getDeviceAddress(void) {

  byte i;

  byte addr[8];

 

  Serial.println("Getting the address...\n\r");

  /* initiate a search for the OneWire object we created and read its value into

  addr array we declared above*/

 

  while(ds.search(addr)) {

    Serial.print("The address is:\t");

    //read each byte in the address array

    for( i = 0; i < 8; i++) {

      Serial.print("0x");

      if (addr[i] < 16) {

        Serial.print('0');

      }

      // print each byte in the address array in hex format

      Serial.print(addr[i], HEX);

      if (i < 7) {

        Serial.print(", ");

      }

    }

    // a check to make sure that what we read is correct.

    if ( OneWire::crc8( addr, 7) != addr[7]) {

        Serial.print("CRC is not valid!\n");

        return;

    }

  }

  ds.reset_search();

  return;

}

 

void loop(void) {

  // do nothing

}

 

 

そしてArduino IDEのシリアルモニタを立ち上げると、センサーのアドレスが表示されます。これを何かにひかえてください。40代前後の人はドラクエIIの復活の呪文を思い出すかもしれません。書き間違えると悲劇が待っているやつです。

 

 次に、DS18B20で温度を測る場合です。接続は先ほどの図のままでいいのですが、ここでは2つのDS18B20をつないだ例を示します。以下のスケッチでは、前記のOneWire.hに加えて以下のライブラリが必要になります。

DallasTemperature.h

https://github.com/milesburton/Arduino-Temperature-Control-Library

 

 

一つコツなのですが、delay(800)やdelay(200)とあるように、センサーとの通信の間に少し時間を置く必要がある場合があります。説明通りにつないだのに動かない、という場合は、接続を確認するのは当然のこと、その他にあらためて、

・プルアップ抵抗を使っているか(使っていてても、抵抗値を変えてみる)

・センサーとの通信の間に時間をとっているか

・アドレスを書き間違えていないか

を確認してください。

 



#include <OneWire.h>

#include <DallasTemperature.h>

 

#define ONE_WIRE_BUS 8 // データ(黄)で使用するポート番号

#define SENSER_BIT    9      // 精度の設定bit

 

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

 

DeviceAddress temp0 = { 0x28,0xF7,0xD8,0x26,0x00,0x00,0x80,0x7C }; //1つ目のDS18B20のアドレス

DeviceAddress temp1 = { 0x28,0xFF,0xDC,0x12,0x86,0x16,0x04,0x9C }; //2つ目のDS18B20のアドレス

 

void setup(void)

{   

    Serial.begin(9600);

    while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

    }

 

    sensors.setResolution(SENSER_BIT);

 

    delay(1000);

}

 

void loop(void)

{

    sensors.requestTemperatures();              // 温度取得要求

    delay(800);

    Serial.println(sensors.getTempC(temp0)); //1つ目のDS18B20から温度の取得、シリアルモニタに表示

    delay(200);

    Serial.println(sensors.getTempC(temp1)); //2つ目のDS18B20から温度の取得、シリアルモニタに表示

    delay(1000);}

 

 

実用例

 実用例として、積雪深ゲージを示します。寒冷地では融雪による土構造物の不安定化が懸念されることがあり、積雪深は地盤工学的にも興味があるところです。私が思いつく限り、積雪深を測る方法はいくつかありますが(Nishimura et al., 2000)、温度センサーのアレー(例えば10cmごと)を用意しておくというのは中でも利点の多い方法です。温度センサーが雪に埋まると、雪が断熱材となり気温の日変化に対して鈍感になるので、温度の変化に着目すると、どのセンサーまで雪に埋まったかすぐにわかります。インターバルカメラによる直接観察は、レンズに降雪が付着したり、電池寿命に限界があったりしますし、写真から積雪深を読み取る作業が必要です。データが大きく、無線遠隔転送にも向きません。超音波センサーなどによる測距は、上から地表にセンサーを向けるため、そこそこ大がかりなやぐらが必要になりますし、雪の表面が柔らかいと反射をよくピックアップできないこともあります。この温度センサーアレー方式は、積雪深分解能がセンサー間隔で決まるという限界がありますが、これに目をつむれば、なかなか優れたやり方に思えます。オマケとして、雪の温度も測れます(そんないい加減な測り方をしてはいけないとA川先生に怒られそうですが)。塩ビ管に穴をあけてDS18B20を埋め込むやり方なら、Arduinoと電池も含めて5000円くらいで製作できます。ちなみに下の図では、てっぺんにもいろいろ搭載されていますが、これは後の回で説明します。