Raspberry Pi で熱電対 (DS18B20) を使う
Raspberry Pi で熱電対 (DS18B20) を使って温度を計測したときのメモです。DS18B20 は 1-Wire の温度センサーで Amazon や AliExpress で防水加工されたものがよく売られています。水槽の水温などを計測するのによく使われているようですね。
Raspberry Pi に接続した記事は大量に出てくるのですんなり接続できるかと思っていたのですが、思いの外てこずったのでメモとして残しておきます。
DS18B20 の入手
今回は Amazon でこちらの製品を購入しました。2本線のタイプもあるようですが、3本線(VCC, GND, DATA)のタイプを使用しました。
接続
プルアップ抵抗としてVCC と DATA の間に 4.7kΩ の抵抗をはさみます。
[RPi] [DS18B20]
3v3 Power <--+--> VCC
|
4.7kΩ
|
GPIO4 <------+--> DATA
GND <-----------> GND
温度の計測
1-Wire を有効化するために /boot/config.txt
に追記を行うのですが、ここで色々とハマりました。
dtoverlay=w1-gpio-pullup,gpiopin=4,pullup=4
※ 使用する GPIO を変える場合には 4
の部分を変更してください。
/boot/config.txt
を編集した後は Raspberry Pi を再起動します。DS18B20 をすでに接続してあるのであれば、電源ケーブルを抜いて明示的に電源を OFF にした方が安全かもしれません。
lsmod
で w1_therm
がいることを確認できます。
$ lsmod | grep w1
w1_therm 28672 0
w1_gpio 16384 0
wire 49152 2 w1_gpio,w1_therm
/sys/bus/w1/devices/
以下に 28-030497941e1e
がいることが確認できます。
$ ls -l /sys/bus/w1/devices/
total 0
lrwxrwxrwx 1 root root 0 Aug 22 22:59 28-030497941e1e -> ../../../devices/w1_bus_master1/28-030497941e1e
lrwxrwxrwx 1 root root 0 Aug 22 22:51 w1_bus_master1 -> ../../../devices/w1_bus_master1
w1_slave
以下を読んで温度を計算するという記事が多いのですが、tempareture
というファイルが存在するので、これを読めば温度が読み取れます。以下の場合、温度は 24.562
ということになります。
cat /sys/bus/w1/devices/28-030497941e1e/temperature
24562
トラブルについて
何で手間取ったかなのですが、/boot/config.txt
に dtoverlay=w1-gpio,pullup=on
や dtoverlay=w1-gpio,pullup=on
、dtoverlay=w1-gpio,pullup=4
を追加するとい記事が多いのですが、 /sys/bus/w1/devices/
を確認するとよくわからないファイル(ランダムな文字列?)が存在していました。
$ ls -l /sys/bus/w1/devices/
total 0
lrwxrwxrwx 1 root root 0 Aug 24 20:18 00-200000000000 -> ../../../devices/w1_bus_master1/00-200000000000
lrwxrwxrwx 1 root root 0 Aug 24 20:18 00-a00000000000 -> ../../../devices/w1_bus_master1/00-a00000000000
lrwxrwxrwx 1 root root 0 Aug 24 20:13 w1_bus_master1 -> ../../../devices/w1_bus_master1
dmsg を確認すると何かデバイスは見つかっているのですが、登録ができないみたいなメッセージが残っていました。
[ 61.530269] w1_master_driver w1_bus_master1: Attaching one wire slave 00.800000000000 crc 8c
[ 61.542304] w1_master_driver w1_bus_master1: Family 0 for 00.800000000000.8c is not registered.
これらの書き方でも値が読めたこともあったのですが、環境を変えると動かなかったりと不安定な状態が続きました。
Web を検索すると似たような事象で困っている人はたくさんいるようなのですが、自分のケースに当てはまるものは見つからず、結果として dtoverlay=w1-gpio-pullup,gpiopin=4,pullup=4
で安定して値を読めるようになりました。
まとめ
トラブルの原因として不明確な部分が残ったものの、DS18B20 を Raspberry Pi に接続して温度を計測することができました。
Discussion