ラズパイ

【ラズパイ】温度センサーの作成

参考にしたリンク

https://www.taneyats.com/entry/raspi-smart-aquarium-2

使用したアイテム

Raspberry Pi Zero W – ヘッダー ハンダ付け済み – ラズベリー・パイ ゼロ W ワイヤレス
by カエレバ

 

 

ソウテン DS18B20温度センサー 防水デジタルサーマルプローブセンサー1M長さ、1個
by カエレバ

 

手順

1-Wireを有効化

DS18B20を使用するには、1-Wireという規格のインターフェースを有効にする必要があります。sudo raspi-configを実行して、Interfacing Options > 1-Wire > Yesで有効にできる。
実際には/boot/config.txtに以下の一行が追加される。
dtoverlay=w1-gpio

作業を進めていて気づいたのですが、さらにもうちょっと値を追加する必要があります。

sudo vim /boot/config.txtで開いて以下のようにしてください。

dtoverlay=w1-gpio,pullup=on

pullup=onによってプルアップ電圧を設定するというカンジでしょうか…
プルアップ電圧とは下記参考によると、特殊な処理を行うときに通常の電力よりも多くの電力を使用する、そんなときに必要となる電圧のようです。

温度データを取得

それでは値を取得していきます。温度センサー本体にLEDとかついていなのでちゃんと動いてるかどうか心配ですね…(笑)

ちゃんと回路ができていて、値を取得できる状態にある場合、 以下の場所に28-で始まるディレクトリが現れます。

表示されない場合は、config.txtの内容と配線が正しいかどうか確認してみてください。

$ cd /sys/bus/w1/devices/
$ ls -la
total 0
drwxr-xr-x 2 root root 0 May  5 02:09 .
drwxr-xr-x 4 root root 0 May  5 02:09 ..
lrwxrwxrwx 1 root root 0 May  5 02:10 28-0517c41aecff -> ../../../devices/w1_bus_master1/28-0517c41aecff
lrwxrwxrwx 1 root root 0 May  5 02:09 w1_bus_master1 -> ../../../devices/w1_bus_master1

このディレクトリ名はセンサーに個別に振られている値のようで、再起動後や回路の再構築後にも同じディレクトリ名が現れます。

また複数個の同じセンサーをつなげても、このディレクトリ名で判別可能となるようです。

pythonなどの処理でディレクトリを決め打ちできるのでありがたい!

このディレクトリ内にあるw1_slaveというファイルにセンサーの取得した温度が格納されています。

$ cd 28-0517c41aecff
$ cat w1_slave
50 05 4b 46 7f ff 0c 10 1c : crc=1c YES
50 05 4b 46 7f ff 0c 10 1c t=85000

温度取得

https://yamashitakoji.com/2016/05/raspberry-pi-ds18b20.html

温度取得(出力)プログラムコード

1-wireデバイスからデータを取得するプログラムの実態は、定期的に「w1_slave」ファイルの中身をファイル関数で読み取るだけなので「RPi.GPIO」ライブラリを使わなくても出来るようになっています。

import os
import glob
from time import sleep

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():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

# 温度データのみを取り出して返す関数
def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines.find('t=')
    if equals_pos != -1:
        temp_string = lines[equals_pos + 2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

try:
    while True:
        print(read_temp())
        sleep(1)

except KeyboardInterrupt:
    pass

プログラム実行

これを適当なファイル名で保存し、IDLEで実行するとコンソールに温度が出力されます。

20160507131606

エラーが出た場合

SyntaxError: Non-ASCII character が出た時