Raspberry Piで1-Wireデジタル温度センサDS18B20をPythonで使う

Raspberry Pi ZERO WHに1-Wireデジタル温度センサDS18B20を接続して、温度を読み取ってみようと思いました。温度センサDS18B20秋月電子で購入しました。

 

「DS18B20」を使用するには、「1-Wire」を有効化する必要があります。まずは /etc/modules ファイルの設定です。管理者権限で「nano」コマンドで、下記の2行(「w1-gpio」「w1-therm]を追記します。

「i2c-dev」は、今は関係ないと思います。

次は、Raspbian 2015-01-31(NOOBS 1.3.12)以降のOSを使用している場合に必要となります。設定手順は先程と同じで、/boot/config.txtファイルに1行(dtoverlay=w1-gpio-pullup,gpiopin=4)を追加します。

準備ができれば、Raspberry Pi を再起動します。

センサーの配線や、ファイルの追記等がうまくいくと、「 /sys/bus/w1/devices 」にファイルが生成されます。実際にフォルダを開いてみると、28-ではじまるショートカットフォルダが、生成されていることが確認できます。下の図では、温度センサーを2つつないでいるので、2つのショートカットフォルダがあります。「28-00000b1ba851」「28-00000b1cc5b2」が温度センサーのデバイスIDになります。

ショートカットフォルダの中の「w1-slave」に情報が記載されています。

テキストエディタでも開くことはできます。catコマンドで中身をのぞくと、
暗号のような文字列ですが、温度は「t」の値で上記のデータでは「27937」となります。値は1000倍されているため、「27.937℃」ということになります。ファイルを読み込むたびに温度を取得する仕様となっているので、直接ファイルを開いた場合でも、温度データが更新されます。

次に、温度を自動取得するプログラムを色々と参考にしながら書きました。

# -*- coding: utf-8 -*-
import os
import glob
import time
import subprocess

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out,err = catdata.communicate()
    out_decode = out.decode('utf-8')
    lines = out_decode.split('\n')
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

while True:
    s = "celsius: {0:.3f}, fahrenheit: {1:.3f}"
    temp = read_temp()
    print(s.format(*temp))
    time.sleep(3)

実行結果は、1つの温度センサーで取得したデータを摂氏と華氏で表示しています。約5秒ごとの測定です。

次は、もう少し改良していきたいと思います。

 

 

  • X