ここでは、Arduinoで1-Wire接続の温度センサ(DS18B20)を使用して、温度を計測する方法を解説しています。
使用するセンサは、Amazonで安く入手することができます。
また防水加工がされているため、液体の温度も計測することが可能です。
必要となる部品
ここで必要となる部品は以下となります。
Arduinoとブレッドボードを持っていれば、抵抗と温度センサを購入するだけでよいため、非常にシンプルです。
- Arduino Uno
- ブレッドボード
- 抵抗(4.7kΩ or 5kΩ) 1本
- 温度センサ(DS18B20)
使用する温度センサ
温度センサとして、DS18B20を使用します。
DS18B20のデータシート
ここではAmazonで購入できる以下の安い温度センサを使用するものとします。
防水加工がされているため、液体の温度も計測可能です。
中華製ですので多少不安ではありますが、値段は安いです。
一応、分解してみましたが、確かにDS18B20が使われているようです。
なお、上記の温度センサには問題があり、リード線の色が説明と違うことがあります。
ひどいものだと説明とは違う色のリード線が繋がれていたりするため、使用前に一瞬だけ繋いて確認しました。
幸い自分が入手したものは、赤(電源5V)、黒(GND)、黄(データ)となっていたため、それを前提に以下では説明を行います。
上記の部品が怖いようならば秋月で部品を購入することをおすすめします。
防水加工がされておらず、値段はちょいお高めですが、確実です。
DS18B20(秋月)
Arduinoとの接続
ArduinoとDS18B20の接続は以下のようにします。
ICの電源5V(赤)とGND(黒)とデータ用(黄)の線だけであるため非常に簡単です。
電源5V(赤)とデータ用(黄)の間に抵抗(4.7kΩ)を挟み、データ用の線をプルアップします。
データ用(黄)は、Arduinoの10番ピンに接続するものとしますが、プログラム上で変更可能です。
使用するライブラリ
最初にライブラリを使用する簡単なプログラムを紹介します。
ここでは、以下の2つのライブラリを使用しします。
https://github.com/PaulStoffregen/OneWire
https://github.com/milesburton/Arduino-Temperature-Control-Library
1つ目のライブラリはOneWire用のライブラリで、2つ目はDS18B20用のライブラリです。
ライブラリは、上記のリンクからZipファイルでダウンロードを行い、Arduinoのライブラリフォルダに解凍したライブラリのフォルダをコピーします。
参考ページ:Arduinoライブラリの追加
簡単なスケッチ(プログラム)例
上記までですべでの準備は完了したため、以下のスケッチで温度を計測します。
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 10 // データ(黄)で使用するポート番号 #define SENSER_BIT 9 // 精度の設定bit OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(void) { Serial.begin(9600); //温度表示確認用 sensors.setResolution(SENSER_BIT); } void loop(void) { sensors.requestTemperatures(); // 温度取得要求 Serial.println(sensors.getTempCByIndex(0)); //温度の取得&シリアル送信 }
温度センサーの分解能は、0.5℃、0.25℃、0.125℃、0.0625℃に対応して、9、10、11、12ビットを選択することができます。上記プログラムでは、9ビットで設定しています。
精度を高くした方がよいように思われますが、精度を高くすると値のふらつきが大きくなりやすいです。
また、温度計測の時間もかかるようになります。上記の「sensors.requestTemperatures()」では温度の取得要求をDS18B20に送信した後、温度計測完了まで待ちます。精度が高ければ高いほど待ち時間は以下のように長くなります。
9bitでは、93.75ms
10bitでは、187.5ms
11bitでは、375ms
12bitでは、750ms
使用するようとに合わせ、上記のビットを変更することをお勧めします。
ただし、DS18B20自体の誤差は0.5℃程あるため、精度を求める計測は難しいかもしれません。