Raspberry Pi Zeroで温度を計測する

Raspberry Pi Zeroで温度ロガーを作成しました


必要なもの

  • ホスト … Windows 10 64bit
  • ターゲット … Raspberry Pi Zero W
  • 温度センサ … DS18B20
  • 回路素子
    • 4.7kohm … 1つ
    • QIコネクタ (なくても可)

DS18B20

DS18B20は以下のような特徴を持った温度センサです。One-Wireインタフェースで少ないピンで複数センサを接続できる点と、防水加工されたものが購入でき、扱いやすそうだったため使用を決定

  • データシート
    • デジタルインタフェース (One-Wire)
    • レンジ … -55度 – +125度
    • 解像度 … 0.0625度
    • サンプリング … 750ms

ハードウェア接続

DS18B20からはVCC, GND, DATAの3本線が出ています。それぞれRaspberry Pi Zeroのピンヘッダ 1 (3.3V power)6 (GND)7 (GPIO4 (GPCLK0))に接続します。またVCCとDATAの間を4.7kΩで接続します (Pinoutリンク)

(データシートより抜粋)

今回はQIコネクタとブレッドボードを用いて接続しましたが、直付けでも問題ないと思います


Raspberry Pi側の設定

ハードウェアの接続が完了したら、もう一度確認したのちに電源を投入します

One-Wireの有効化

まずはOne-Wireインタフェースを有効化するために/boot/config.txtを編集します

% vi /boot/config.txt
+dtoverlay=w1-gpio
% sudo reboot

再起動後、モジュールを読み込みます

% sudo modprobe w1–gpio
% sudo modprobe w1-therm

上記実行後、/sys/bus/w1/devicesに2つのファイルが表示されていればOKです

% ls /sys/bus/w1/devices/
28-0301a279ee43  w1_bus_master1

28-0301a279ee43のファイル名はそれぞれの環境で異なると思います。最初の28はDS18B20の識別子なので共通で、後ろの0301a279ee43はそれぞれのデバイス毎に割り当てられた固有IDです。これにより、複数のDS18B20をOne-Wireに接続した場合でも、個別のセンサを識別することが可能となります

28-*以下にあるw1_slaveを表示することで、現在の計測温度を読み出すことができます

% cat /sys/bus/w1/devices/8-0301a279ee43/w1_slave
6f 01 55 05 7f a5 81 66 93 : crc=93 YES
6f 01 55 05 7f a5 81 66 93 t=22937

t=22937の部分が計測温度で、摂氏22.937度という意味です。試しにセンサ部を手で握ってみると温度が上昇しました


Pythonからの読み出し

次にPythonコードから読み出してみます。

import os

# 必要な場合のみ。root権限が必要
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

with open(os.path.join(self.path, 'w1_slave'), 'r') as f:
    lines = f.readlines()

assert len(lines) == 2
m = re.search('t=(\-{0,1}\d+)', lines[1])
assert m
print(f'temp {float(m.group(1)) / 1000} degree')

複数センサの接続

次に複数のセンサを接続してみます。上記データシートの図にあるように、デバイスを並列に接続することで同一のOne-Wire上に複数デバイスを認識させることができます。

2つ並列に接続したところ

接続した後に/sys/bus/w1/devices/に複数の28-*デバイスが認識されていればOKです

% ls /sys/bus/w1/devices/
28-0301a279ef6b 28-0301a279ee43  w1_bus_master1

(おまけ) 冷蔵庫の温度を計測

作成した温度ロガーで試しに家の冷蔵庫の温度を計測してみました (GE製)。2つのセンサを上段の奥と手前に配置して計測した結果が下記です

冷蔵庫内の温度推移

詳しく知らないんですが、意外にも温度の振れ幅が大きいんですね。奥は扉を開けていない深夜の時間帯で下は1℃から上は7.5℃あたりまで変動しています。


次回投稿では、実際にデータを記録するためにRaspberry Pi側及びホスト側で動かすプログラムの説明を行っていきます

おすすめ