1-Wire接続の温度センサーDS18B20×Raspberry Piで温度測定に成功
カテゴリー:Beaglebone・Raspberry Pi(記事数:62)

2015/09/28

1-Wire接続の温度センサーDS18B20×Raspberry Piで温度測定に成功


購入したのは DS18B20という温度センサーの防水加工品。センサー自体は秋月で350円ほど、今回は防水加工されたものをAmazonで送料込み880円購入。

これまでI2Cというデジタル接続規格のセンサーで遊んできましたが、これは3本の線で接続可能な1wireという規格らしい(3.3VとGNDとGPIO1つ)。同期シグナル線が無くて低速通信なのでけっこう配線を長く伸ばせるらしい。

接続のための前準備として
/etc/modules

w1-gpio
w1-therm
を追加。
/boot/config.txt

dtoverlay=w1-gpio-pullup
を追加。意味は分からん。これでデフォルトのGPIO4で1wire接続できるようになるらしい。GPIO4以外に接続するには
dtoverlay=w1-gpio-pullupgpiopin=x
と書くらしい(未確認)。
また、Raspberry Pi内の回路を使ってプルアップするには
dtoverlay=w1-gpio-pullupgpiopin=xpullup=y
と書くらしいが、うまくいかなかった。信号線と3.3Vの間に抵抗入れてプルアップしないと動作しない。
あとは下記のように接続されているデバイス数を表示したり、デバイスコードを取得したり、温度を読み出したりと簡単。

センサーはオンデマンドで認識されるみたいでRaspberry Piの電源入れっぱなしでセンサーを接続すると5秒ぐらいで認識されだす感じ。t=xxxxxが摂氏温度の1000倍になっている。

Pythonで温度部分を抽出してネット上のサーバーに投げるスクリプトの例としては
--------------------------
import urllib
import time
import subprocess #外部コマンド実行モジュール
import re #正規表現のモジュール

resulttext = subprocess.check_output(["cat","/sys/bus/w1/devices/28-00000728de5e/w1_slave"])
print resulttext

temp=re.search('(?<=t=)(-*\d+)',resulttext) #正規表現でt=以降を取得
temp=float(temp.group(1))/1000 取得した部分はgroup(1)に入る
print str(temp)

r=urllib.urlopen('http://xxx.xx/xxx/xxx.cgi?'+str(temp))
print r.read()
--------------------------

本当は得意のperlで書きたかったんだけど、Raspberry Piでどうやっても途中で止まってしまってモジュールLWPをインストール出来なかった。orz

Category:Beaglebone・Raspberry Pi


■ ■ ■ コメント ■ ■ ■

いいっすね!=20
001 [09/29 02:21]匿名@Dion:cpanでのインストールで失敗するのはメモリ不足が原因だったような気がします。GPUメモリが初期値で64MB割り当てられているので、HDMIを使わないなら最小値の16MBにすると良いかも。 (6)
002 [09/30 08:56]ふぇちゅいん(パパパパ) TW★56:>>001 情報サンキューです! (5)
003 [10/01 02:23]匿名@Dion:あとswapが標準では100MBなので1024MBに変更したほうが良いかもしれません。やり方はぐぐると出てくると思います。 (3)

名前 ↑B

コメント(※改行は省略されます)

※3回以上の連続書き込み不可
この記事のアクセス数:
Amazon


→カテゴリー:Beaglebone・Raspberry Pi(記事数:62) (コメント数)