🌡️

Raspberry Pi で熱電対 (DS18B20) を使う

2023/09/27に公開

Raspberry Pi で熱電対 (DS18B20) を使って温度を計測したときのメモです。DS18B20 は 1-Wire の温度センサーで Amazon や AliExpress で防水加工されたものがよく売られています。水槽の水温などを計測するのによく使われているようですね。
Raspberry Pi に接続した記事は大量に出てくるのですんなり接続できるかと思っていたのですが、思いの外てこずったのでメモとして残しておきます。

DS18B20 の入手

今回は Amazon でこちらの製品を購入しました。2本線のタイプもあるようですが、3本線(VCC, GND, DATA)のタイプを使用しました。
https://www.amazon.co.jp/gp/product/B086GV3DBG

接続

プルアップ抵抗として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 にした方が安全かもしれません。

lsmodw1_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.txtdtoverlay=w1-gpio,pullup=ondtoverlay=w1-gpio,pullup=ondtoverlay=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