2014年4月20日日曜日

Raspberry pi で Hydroponic に挑戦 (4) DS18B20 温度センサー

さて、いよいよ Hydroponic に使用する温度センサーをRaspberry pi に繋いでみよう。今回使用するのは DS18B20 という デジタル温度センサー、 1-Wire バスを使用して Raspberry pi と通信する。このセンサー一つ一つに固有の64bit コードが書き込まれているので、一つのバスに幾つもの温度センサーを繋ぐことができるのだ。
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 件のコメント:

コメントを投稿