読者です 読者をやめる 読者になる 読者になる

DreamerDreamのブログ

夢想家の夢です。

RaspberryPiに温度センサーを付ける

僕が選んだのはRaspberryPiでの接続例の多い1-Wire接続のDS18B20

 

 

参考にさせて頂いたページ

Raspberry Piブログ : [コラム] 第9回『1-wire温度センサーで部屋の温度を測定しよう』

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

 

 

接続はセンサ真ん中の信号線をGPIOに直付け。

センサーの線を2kオーム程度の抵抗でプルアップしておくらしい。

f:id:DreamerDream:20151225142603j:plain

 

1-Wireの規格は理論上、電力の許す範囲なら無限に接続制御が可能だそうで、複数繋ぐ場合はこんな感じ?(やってみていないのですが)

f:id:DreamerDream:20151225142614j:plain

 

 

で、GPIOの3.3V、GND、GPIO4(1-wire)に接続したらRaspberryPiの設定。

 

スーパーユーザーで

/etc/modules に以下の2行を追加

w1-gpio
w1-therm

/boot/config.txt の最後に

dtoverlay=w1-gpio-pullup,gpiopin=4

追加

 

 

modprobeで設定する事も出来るらしい

modprobe w1-gpio

modprobe w1-thrm

※アンロード

modprobe -r w1-gpio
modprobe -r w1-thrm

 

 設定出来たら再起動する。

 

カーネルモジュールをロードすると/sys/bus/w1/devicesディレクトリが作成される。

ls /sys/bus/w1/devices

> 28-0000072413ae ←このようなナンバー付きのディレクトリが生成されている。

catでw1_slaveの値を取得してみる

cat /sys/bus/w1/devices/28-0000072413ae/w1_slave

 

62 01 4b 46 7f ff 0e 10 03 : crc=03 YES
62 01 4b 46 7f ff 0e 10 03 t=22125

このような値が取得できると成功。

t=22125←この値を1/1000にすると現在温度

つまり現在22.125℃

 

簡単なスクリプトを作って、温度だけをわかりやすく表示させる

roomtemp.sh

#!/bin/sh
DEVID="28-0000072413ae"

cat /sys/bus/w1/devices/$DEVID/w1_slave \
| perl -e 'while(<stdin>){ if(/t=([0-9]+)/){print $1/1000,"\n";} }'

 

パーミッションを設定して実行すれば、温度だけが表示されて見やすくなる。

chmod 755 roomtemp.sh
 ./roomtemp.sh

24.75

このように表示されれば成功。

 

モジュールの値をテキストファイルのように扱える事がわかる。

なのでpythonで値を取得出来るようにした。

importしているfile_mngは以前にブログで書いたもの。今回はLogを残すだけの目的なので無くても良い。

dreamerdream.hateblo.jp

 

sudo pyhton room_temp.py

で温度を表示するのと

他のコードでimportして.get_temp()でfloat型として取得出来る。

 

-- room_temp.py --

#!/usr/bin/python

 

import file_mng

 

def log(tmp):

        file_mng.save_log("Pi2_room_temp",tmp)

 

def get_temp():

        f = open("/sys/bus/w1/devices/28-0000072413ae/w1_slave","r")

        tmp = 0

        line = f.readlines()

        temp = line[1].split("=")

        for t in temp:

                tmp = t[:2]+"."+t[2:3]

        f.close()

        log(tmp)

        return float(tmp)

 

if __name__=='__main__':        # if script

        temp = get_temp()

        print str(temp)