ラズパイと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を有効にする設定
ラズパイでは、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のデータ線はプルアップする必要があります。ラズパイの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-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水温センサと組み合わせて、ビオトープやアクアリウムで使えそうな商品をご紹介します。
センサとリレーを組み合わせれば、さらにやれることが広がります。ぜひラズパイとリレーモジュールもご覧ください。