【ラズベリーパイ】複数の防水温度センサー(DS18B20)で温度を測定&記録(CSV出力)

プログラミング

Amazonで1つ当たり300円程度で購入可能なDS18B20を内蔵した温度センサー。

このセンサーを使った温度測定や記録方法は先人たちの残した情報が溢れていますが、プログラミングやラズベリーパイ初心者にとっては「これなに???」と疑問に思う点が多々あります。

今回は典型的なDS18B20を使った温度測定や記録プログラムや、それ以前の前提知識にについて、あまり見かけない目線から情報をまとめてみます。

DS18B20ってなに?

そもそもDS18B20という単語が含まれる商品が多数存在します。

実際に「センサーを買ってみよう」となった時に、知識がない人が最初に引っかかるのはここではないでしょうか?Amazonで検索した限りでもこんな風に複数の商品がヒットします。

メーカーも別々ですが、DS18B20という単語が必ず含まれています。これはDS18B20を内蔵した製品を、色々なメーカーが製造・販売しているということです。実物のDS18B20はマキシムと言う大変有名なメーカーが製造する温度センサーで、見た目は黒いチップから3本の足が生えている典型的なセンサーです。

これではちょっと使いにくいですよね?

だから上でも紹介したような色々なメーカーが、長い配線をつけたり、先端のプローブを付けたり、防水処理を施して製品として販売しているのです。

これが同じセンサーの名前を銘打っておきながら色々なメーカーから多様な製品が販売されている理由です。

要するに同じセンサーを使っていれば、基本的に同じプログラムや設定で動作するため、あとは好みにあわせて配線の長いものを選んだり、防水性の高いものを選んだり、自分にとって使い勝手の良い物を選べば良いわけです。

1-Wireとは?

ちなみにこのDS18B20は、1-Wireという技術が使用されているセンサーです。

センサー界隈ではよく見かけるものなのでざっくりとした概要を知っておくと便利です。

1-Wireとは、1本の電源線だけで信号を送る技術です。

電子工作初心者の方にはピンと来ないかもしれませんが、センサーには電源用に1本、接地用に1本、信号用に1本以上の線が必要です。

電源はその名の通り電気をセンサーに供給する線です。

接地は電気の+と-で言うところのマイナス側です。+と-がつながることで、初めて電気が流れます。

最後に信号とは、センサーが取得した温度などのデータを伝えるための線です。

1-Wireはこの電源用の線と信号用の線を1本にまとめてしまう技術と言うわけです。

しかし、思い返してみれば先ほど紹介したDS18B20の写真ではセンサーから3本の線が伸びていました。

これは本末転倒な話に聞こえるかもしれませんが、電源と信号を共用すると電源供給が不安定になったりと弊害があるため、信号線のほかに電源線を追加しているからなのです。

DS18B20を接続する方法

DS18B20を接続する方法は非常にシンプルです。

電源線、信号線、接地線の3本があるので、それぞれ以下のように接続します。

  • 電源線(赤) → 5V もしくは 3.3V
  • 信号線(黄) → GPIO4
  • 接地線(黒) → Ground

なお、()内の色表記は私も使用しているDiyStudioの温度センサーの配線色を示しています。

電源線と信号線には4.7kΩ程度の抵抗を並列に接続します。

お行儀よく接続するなら+とー列を使うのですが、ここでは省略しています。

(3.3Vで動作しますが、5Vの方が安定するそうです。抵抗も入っているし3.3Vで問題が出たことはありませんが)

抵抗は色々なシーンで出番があるので、安価なセット品を購入することをおすすめします。

抵抗1個1個の価格は非常に安価なのですが、ばら売りされているものはやや割高の傾向があります。

複数のDS18B20で温度を測定・記録するプログラムの解説

DS18B20は先述した1-Wireという技術を利用しています。

この1-Wire温度センサー用のライブラリが公開されているので是非利用しましょう。

コマンドラインを開き、以下のコマンドを実行します。

sudo pip install w1thermsensor

あとは以下のようにPythonでコードを書きましょう。

Pythonの編集は標準で付属しているThonnyを使ったり、手元のWindowsパソコン等で作成してからラズベリーパイに移動しても良いでしょう。

import csv 
import time
import w1thermsensor 
import datetime 

CSV = '/home/pi/Desktop/temp_log.csv' # 保存先のCSVファイル名 
INTERVAL = 30 # CSVへ温度を記録する間隔(秒) 
def get_row(sensors):
     a = [datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")]
     for s in sensors:
         a.append(s.get_temperature())
     return a 
sensors = w1thermsensor.W1ThermSensor().get_available_sensors() 
with open(CSV, 'a') as f:
     writer = csv.writer(f)
     while True:
         writer.writerow(get_row(sensors))
         time.sleep(INTERVAL)

get_rowメソッドはセンサーの配列を受け取ってCSVに書き出すための配列を作成しています。

日付, センサー1の温度, センサー2の温度, センサー3の温度, …

と言う風に日付の後に接続されているすべてのセンサーの温度が続きます。

sensors = W1ThermSensor().get_available_sensors()の処理で接続されているすべてのセンサーを配列で受け取ることができます。

その後、CSVファイルを開いてループの中でINTERVALに指定した間隔ごとに記録を続けます。

ファイル名をlogger.pyなど適当につけて保存し、コマンドラインから実行します。

実行コマンドは以下のような感じです。

python /home/pi/Desktop/logger.py

logger.pyをデスクトップに保存している場合の例です。

終了する場合にはCtrlキーとCキーを同時に押下します。

もしSSHなどで外部から接続してプログラムを実行した場合、接続を切断するとプログラムの実行も止まってしまいます。

そういう時はscreenコマンドを活用して

screen python /home/pi/Desktop/logger.py

のように実行すると、画面を閉じても処理が継続されます。

詳しくはこちら。

Raspberry pi で SSH ログアウト後もプロセスを残したい – 子育てしながらエンジニアしたい

DS18B20を複数接続する方法

DS18B20を複数台接続する場合には、単純に並列に接続するだけでOKです。

ブレッドボードに3台以上のセンサーを接続すると、かなりごちゃごちゃとするので複数台のセンサーの配線を一度束ねてしまっても良いでしょう。

DS18B20の配線を延長する

この温度センサーを何の工夫もなしに、単純に配線を延長するとおおよそ4~5m程度まで問題なく温度を測定可能です。

それ以上伸ばすと認識しなくなってしまいます。

センサーの配線に4m以上を要するのは問題なので、それ以上伸ばしたい場合には、ラズベリーパイの設置場所を変えたり、分割することで対応すると良いでしょう。

タイトルとURLをコピーしました