ラズパイとDS18B20で水温測定(1-Wire通信)

 

ラズパイとDS18B20で水温測定(1-Wire通信)

こんなこと、やります。

  • ラズパイでDS18B20の使い方
  • ラズパイで1-Wire通信を使う方法

つかうもの

この記事でつかうものを説明します。

ラズパイつかうよー
ラズパイつかうよー

Raspberry Pi

Raspberry Pi zero WHを使いましたが、みなさんはお好きなラズパイをご使用ください。

DS18B20温度センサ

防水加工されたDS18B20温度センサを使いました。DS18B20はデジタル温度センサです。DS18B20は「1-Wire」通信でデータ転送を行います。供給電圧は3.3Vと5Vのどちらでも使えます。

その他の電子部品

4.7kΩのプルアップ抵抗が必要になります。また、ブレッドボードやジャンプワイヤをお持ちでない方は揃えておいてください。

メルカリで販売中!

ケーブル長さを3mに延長し、ジャンプワイヤーを取り付けたものをメルカリで販売中です!

▼ プルアップ抵抗内蔵版

▼ 4.7kΩのプルアップ抵抗付き

開発環境

今回の開発環境は次の通り。

開発じゃー!
開発じゃー!

項目 バージョン
ラズパイ Raspberry Pi zero WH
OS Raspbian 9.13
Python 3.7.0
温度センサ DS18B20

なお、ラズパイの操作は、MacのターミナルからSSHでリモート操作します。SSHのセットアップは、Raspberry Pi OSのインストール - モニター・キーボードなし、SSH接続するまでをご覧ください。

準備

ラズパイとDS18B20で水温測定(1-Wire通信)
ラズパイとDS18B20で水温測定(1-Wire通信)

ラズパイでDS18B20をつかえるように準備します。

イチニッ、サンシッ
イチニッ、サンシッ

ラズパイで1-Wireを有効にする設定

ラズパイでは、1-Wireデータを読み取れるドライバーが内蔵されています。ただしデフォルトでは無効になってますので、それを使えるように有効化します。

$ sudo vi /boot/config.txt を実行し、下記内容を追加してください。

dtoverlay=w1-gpio,gpiopin=4,pullup=y

その後ラズパイを再起動します。

$ lsmod | grep w1を実行し、次のような表示がでれば1-Wireは有効になっています。

w1_therm                7330  0
w1_gpio                 3171  0
wire                   32947  2 w1_gpio,w1_therm

1-Wireとは

1-Wireとは、GNDと電源供給を兼ねた信号線だけでデータ転送を行う規格です。低速なデータ転送にはなりますが、長い距離でも通信が可能となっています。

有名な温度センサDHT11でも1-Wire通信でデータ転送を行なっています。

DHT11の使い方は、ラズパイとDHT11で温度・湿度を測るをご覧ください

ラズパイとDS18B20温度センサの配線

こちらが、ラズパイとDS18B20温度センサの配線図です。

ラズパイと温度センサの配線図
ラズパイと温度センサの配線図

ラズパイ DS18B20
3.3V or 5V Vdd
GPIO4 DQ
GND GND

DS18B20の各ピン役割
DS18B20の各ピン役割

プルアップ抵抗

DS18B20のデータ線はプルアップする必要があります。ラズパイの3.3VとGPIO4の間に、4.7kΩのプルアップ抵抗をつないでください。

DS18B20のデータシートはこちらをご覧ください。

DS18B20の温度データをコマンドで取得

DS18B20の温度データをコマンドで取得してみます。

サササッ
サササッ

DS18B20の場所を確認

DS18B20のディレクトリの場所を確認します。

ラズパイとDS18B20温度センサが正しく接続されていれば、$ ls /sys/bus/w1/devices/ を実行すると、28-から始まるディレクトリが表示されるはずです。

$ ls /sys/bus/w1/devices/
28-0301a279ec09@  w1_bus_master1@
「28-」以降の「28-0301a279ec09」はセンサデバイスが持つ固有IDです。
@(アットマーク)はシンボリックリンクの意味です。

温度データの取得

28-0301a279ec09ディレクトリの中に、w1_slaveファイルがあるので、その中身をcatコマンドで表示させてみます。

$ cat /sys/bus/w1/devices/28-0301a279ec09/w1_slave
5c 01 55 05 7f a5 a5 66 50 : crc=50 YES
5c 01 55 05 7f a5 a5 66 50 t=21750

t=21750がDS18B20で測定された温度になります。摂氏温度で1000倍にして表示されます。ですからこの場合、21.75℃であることがわかります。

DS18B20センサを手で握ったりして、もう一度確認してみてください。温度が変化しているはずです。

DS18B20の温度データをPythonで取得

つぎに、DS18B20の温度データをPythonで取得してみます。

カタカタカタ...
カタカタカタ...

1-Wireのライブラリ

先ほどのコマンドによるデータ表示のとおり、1-Wireのデータはテキストファイルに書き込まれます。よって、それをPythonで読み取りパースすれば、必要なデータの取得はできるでしょう。

ただし、すでにPythonで1-Wireデータ取得できるライブラリがありますので、ここではそれを使っていきます。

w1thermsensorのインストール

Pythonで1-Wireを簡単に扱うことができる、 w1thermsensor というライブラリをインストールします。

pip3をつかって、次のようにしてインストールしました。ただし、バージョン2.0.0a2を指定しないと、インポートエラーで使うことができませんでした。

$ pip3 install w1thermsensor==2.0.0a2

ソースコード

摂氏温度と華氏温度を、1秒おきに表示するPythonのソースコードです。w1thermsensorを使うことで、とても簡単にDS18B20の温度データを取得できました。

from w1thermsensor import W1ThermSensor, Unit
import time

sensor = W1ThermSensor()

while True:
    temperature_in_celsius = sensor.get_temperature()
    temperature_in_fahrenheit = sensor.get_temperature(Unit.DEGREES_F)
    print("celsius:    {0:.3f}".format(temperature_in_celsius))
    print("fahrenheit: {0:.3f}".format(temperature_in_fahrenheit))

    time.sleep(1.0)

空芯菜とメダカのビオトープ
空芯菜とメダカのビオトープ

水温計の応用例

さいごに、DS18B20水温センサと組み合わせて、ビオトープやアクアリウムで使えそうな商品をご紹介します。

センサとリレーを組み合わせれば、さらにやれることが広がります。ぜひラズパイとリレーモジュールもご覧ください。

記事に関するご質問などがあれば、お問い合わせ までご連絡ください。
関連記事