Arduino では 別にこのセンサーアドレスを調べるプログラムをインストールしなければならなかったが、Raspbian には すでにこの1-Wire 温度センサーのデーターを読み込むライブラリが用意されているので、Adafruit's Raspberry Pi Lesson 11. DS18B20 Temperature Sensing に従って、3本のセンサーをBread board に繋ぎ、アドレスを調べる。
000005cd2b5e、000005cd67f7、000005cd2b5e が3本のセンサーのアドレス。
22625(22.625℃)が センサー000005cd2b5e の温度。
Lesson 11 に従って、 Python 上でプログラミング。このプログラムは Root 権限がないと動かない。パパチャックは Raspbian に付属の IDLE という Python 開発環境 でプログラミング しているのだが、 デスクトップ上の IDLE アイコンをダブルクリックして起動すると、Root権限が無いためこのプログラムは動かない。
そこで、Raspbian デスクトップから LXTerminal を起動し、sudo idle とタイプして IDLE にRoot権限を与えて起動する必要がある。
Lesson 11 のプログラムは一つのセンサーから温度データーを読むプログラムなので、それを 先ほど取得したセンサーアドレスを使用して3つのセンサーから同時に温度データーを読み込むように改良。
以下がプログラムコード
#######################################################
# #
# Read Temperature data from 3 DS18B20 sensors #
# #
#######################################################
import os
import time
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
device_address = ['000005cd2b5e', '000005cd67f7', '000005cda0da'] #Sensor addresses
device_prefix = '/sys/bus/w1/devices/28-'
device_suffix = '/w1_slave'
def read_temp_raw(address_index):
device_file = device_prefix + device_address[address_index] + device_suffix
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp(adrs_index):
lines = read_temp_raw(adrs_index)
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw(adrs_index)
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
#temp_f = temp_c * 9.0 / 5.0 + 32.0
return temp_c
while True:
for ad_index in range(len(device_address)):
print'Sensor#%d: %05.2f C,' % (ad_index, read_temp(ad_index)),
time.sleep(1)
print
0 件のコメント:
コメントを投稿