DS1820ワンワイヤー温度センサーをGPIOでRaspberry Piに接続する方法
Raspberry Piで室内または屋外温度を監視するには、最小限のセットアップで可能です。本ガイドでは、DS18S20(DS1820)1-WireセンサーをGPIOピンに直接配線し、ソフトウェアで温度を読み取り、RRDtoolでデータをログ記録する方法を示します。
Raspberry Piと1-Wire
DS18S20、DS18B20、DS1822はすべてTO-92パッケージに収まる1-Wire温度センサーで、センサー、ADC、シリアルインターフェースを一体化。ピンアウトとソフトウェアインターフェースは共通ですが、コストと精度で異なります – DS18S20は±0.5℃、DS18B20は±0.5℃、DS1822も±0.5℃ですがより安価。
各デバイスは3ピン:グランド(GND、ピン1)、データ(DQ、ピン2)、電源(VDD、ピン3)。寄生電源(3–5V)により、プルアップ抵抗を用いてデータラインのみからセンサーに給電可能。
抵抗1本だけ
センサーのDQピンをPiのGPIO 4に接続。GNDをPiのグランドに、VDDをGNDに接続し、寄生電源モードを有効化。3.3VとGPIO 4の間に4.7kΩプルアップ抵抗を配置。小型ブレッドボードや直角ヘッダで配線を整理し、Piの公式ケース内に収まります。
1-Wireソフトウェアドライバ
Raspbian(またはDebian系ディストリビューション)でカーネルモジュールをロード:
sudo modprobe w1-gpio pullup=1 sudo modprobe w1-therm
pullup=1フラグは、センサーがプルアップ抵抗経由で給電されることをドライバに伝えます。ロード後、各センサーは/sys/bus/w1/devices配下のサブディレクトリとして出現。ディレクトリ名はファミリコードとセンサー固有の64ビット識別子で構成:DS18S20/DS1820はファミリコード10、DS18B20は28、DS1822は22。
各ディレクトリ内のw1_slaveには2行が含まれます。1行目は生レジスタダンプとCRCチェック。2行目はt=xxxxで終わり、ミリ度セ氏単位の温度。例:
cd /sys/bus/w1/devices cd 10-000801b5* cat w1_slave 0f 00 4b 46 ff ff 06 10 0c : crc=0c YES 0f 00 4b 46 ff ff 06 10 0c t=7375
値7375は7.375℃に相当。データシート精度は±0.5℃なので、真の温度は読み取り値の±0.5℃以内。
起動時にモジュールを自動ロードするには、/etc/modulesに追加:
# /etc/modules w1-gpio pullup=1 w1-therm
ラウンドロビンデータベース(RRDtool)
長期保存と可視化にはRRDtoolが最適。インストール:
sudo apt-get install rrdtool python-rrdtool
15分ごとに値を記録し、日次集計を10年保持するデータベース定義:
rrdtool create temperature.rrd --step 900 \ DS:temp0:GAUGE:1200:-40:80 \ DS:temp1:GAUGE:1200:-40:80 \ RRA:AVERAGE:0.5:1:960 \ RRA:MIN:0.5:96:3600 \ RRA:MAX:0.5:96:3600 \ RRA:AVERAGE:0.5:96:3600
Pythonによるデータ取得
以下はw1_slaveを読み取り、RRDtoolデータベースに値を挿入する最小限のPythonスクリプト。センサーパスとデータベースファイル名は適宜調整。
import os
import rrdtool
W1_PATH = '/sys/bus/w1/devices'
DB_FILE = 'temperature.rrd'
def read_temp(sensor_id):
with open(f'{W1_PATH}/{sensor_id}/w1_slave') as f:
lines = f.readlines()
if lines[1].strip().endswith('YES'):
temp_milli = int(lines[1].strip().split('t=')[-1])
return temp_milli / 1000.0
return None
# 2センサーの例
temps = {
'temp0': read_temp('10-000801b5'),
'temp1': read_temp('28-0000045e')
}
rrdtool.update(DB_FILE, ','.join(str(t) for t in temps.values()))
スクリプトを定期的に実行(例:cron経由)してデータベースを更新し続けます。
製造プロセス
- 5ドルI2C温度センサーで作るRaspberry Pi温度ロガー
- 複数DS18B20 1-WireセンサーをRaspberry Pi接続で精密温度監視
- Raspberry Pi 2でDS18B20温度センサー読み取りガイド
- Raspberry PiとDS18B20によるプロフェッショナルな温度監視
- Raspberry PiでMaxim 1-WireセンサーとDS2482 I2Cブリッジを用いた温度測定
- Raspberry PiでTMP006赤外線温度センサーを使う – Pythonライブラリとセットアップガイド
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Raspberry Piで気象観測ステーションを構築し、日次天気データをメール送信
- Raspberry Piでサーバークローゼットの温度を正確に監視
- HC-SR04超音波距離センサーをRaspberry Pi 3に接続 – 完全ガイド
- Raspberry PiでPIRモーションセンサーとLEDを制御