始めに
以前の記事でDS18B20を使用した温度入力をしようとしたが、GPIOにアナログ入力がないためにあきらめて・・・と書きました。
が、ほかの方からの指摘で、このセンサーはアナログではなく、1-Wireというれっきとしたデジタル通信にて温度情報を出力するセンサーとの情報を頂きました。
そこで今回はリベンジ!とばかりにリトライしてみます。
とりあえず初期化
扱い慣れている方にとってはまったく問題ないのかもしれませんが、何分初心者。行き詰った際に何が悪影響しているのか切り分けするだけの知識もありません。とりあえずラズパイを初期化することにしました。
電源を入れた直後の画面に「Shift」と表示されます。これが表示されている間にキーボードのShiftキーをおします。
すると、NOOBSによるOS管理画面になります。
ここで、インストールするOSの種類を選択する画面になります。
今回はシステムを初期化するのが目的のため、前回同様Rasbianを選択しました。
インストール開始時に、以前のデータを上書きするか確認があるため、これを「はい(Y)」にすると、インストールが開始されました。
[ モニタの写真を撮ってはいたのですが、極端に移りが悪かったため掲載を遠慮しましたm(__)m ]
下準備
ラズパイのコンフィグファイルに以下の行を足します。
dtoverlay=w1-gpio-pullup,gpiopin=4
合わせて以下の行も足します。
w1-gpio
w1-therm
設定修正後にシステムを再起動します。
$ reboot
回路
最終的に、この様に接続しました。
[DS18B20の素子の向きに対して電源とGNDの向きが逆じゃないか?との指摘があり画像を修正しました。ご指摘ありがとうございました。]
当初プルアップを接続していませんでしたが、その場合次項の[アドレス確認]で確認しているDS18B20のアドレスが表示されませんでした。
2KΩのプルアップ抵抗で認識する様になりました。
また、手元にセンサーが二つあったので二つを並列に接続しました。
アドレス確認
接続しているDS18B20のアドレスを確認します。
$ls -l /sys/bus/w1/devices/
1-Wireのデバイスは、重複のない64bitのアドレスを持っているとのこと。
上記コマンドで確認可能なアドレスは、これを表しています。
今回接続したセンサーのアドレスは[28-*****]の物です。
プログラム
#!/usr/bin/python
# coding: utf-8
import time
from ds18b20_sub import get_temp
print ("DS18B20 test Start!")
try:
while 1:
temp0=get_temp(0)
temp1=get_temp(1)
print('temp0:{0:3.3f} degC\ttemp1:{1:3.3f} degC'.format(temp0, temp1))
time.sleep(1)
except:
pass
print ("DS18B20 test End!")
#!/usr/bin/python
# coding: utf-8
# モジュールをimport
import os
import glob
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
path = '/sys/bus/w1/devices/'
# センサー入力
def get_w1_slave(id):
devdir = glob.glob(path + '28*')[id]
device = devdir + '/w1_slave'
file = open(device, 'r')
lines = file.readlines()
file.close()
return lines
# 温度データ
def get_temp(id):
cnt = 0
lines = get_w1_slave(id)
while lines[0].strip()[-3:] != 'YES':
sleep(0.1)
if cnt > 3 :
return -1
cnt = cnt + 1
lines = get_w1_slave(id)
pos = lines[1].find('t=')
if pos != -1:
strtemp = lines[1][pos + 2:]
temp_c = float(strtemp) / 1000.0
return temp_c
2本の温度センサーの値を取得することが出来ました。
片方のセンサーを手で触ってみると、温度が変化するのが分かります。
感想
先にテストしていたI2Cと同じく温度の情報を比較的簡単に取得できました。
I2Cでは、表示出力が行えるLCDモジュールなどもあるようです。
今回使用したDS18B20が使用している1-Wireではどんな機器があるのでしょうか?ちょっとググった感じでは、I2Cの方が使いやすい機器が多いように感じました(^^ゞ