僕が選んだのはRaspberryPiでの接続例の多い1-Wire接続のDS18B20
こちらはチップではなく防水加工済みでお買い得な商品↓
参考にさせて頂いたページ
Raspberry Piブログ : [コラム] 第9回『1-wire温度センサーで部屋の温度を測定しよう』
RaspberryPi - Raspberry Piで1-Wireデジタル温度センサのDS18B20を使う - Qiita
接続はセンサ真ん中の信号線をGPIOに直付け。
センサーの線を2kオーム程度の抵抗でプルアップしておくらしい。
1-Wireの規格は理論上、電力の許す範囲なら無限に接続制御が可能だそうで、複数繋ぐ場合はこんな感じ?(やってみていないのですが)
で、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を残すだけの目的なので無くても良い。
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)