説明

DS18B20デジタルサーモメータのDS18B20は、9ビット~12ビットの摂氏温度測定値を提供し、不揮発性のユーザー設定可能な上限/下限トリガポイントを備えたアラーム機能を内蔵しています。DS18B20は1-Wire®バス上で通信を行います。名称通りに、このバスは中央のマイクロプロセッサとの通信に1つのデータライン(およびグランド)のみを必要とします。このデバイスは-55℃~+125℃の温度範囲で動作し、精度は-10℃~+85℃の範囲で±0.5℃です。さらに、DS18B20はデータラインから直接給電することが可能なため(「寄生電源」)、外部電源は不要です。
各DS18B20は固有の64ビットシリアルコードを備えているため、複数のDS18B20が同一の1-Wireバス上で機能することができます。そのため、1つのマイクロプロセッサを使用して広範囲に分散した多数のDS18B20を制御することが容易です。この機能が役立つアプリケーションとして、HVAC環境制御、ビル/機器/機械内の温度監視システム、およびプロセス監視/制御システムなどがあります。

DSC_5465

必要なパーツ

PI
Pi3ボード x1
EASM100100
DS18B20 x1
EACW100500
ジャンプワイヤー x3

ハードウェア

DS18B20モジュールの”S”PINとラズパイのGPIO4(BCM)と接続して、”-“とラズパイの”GND”、真ん中の”+”とラズパイの5Vを接続してくださいませ。配線図をご確認くださいませ:

ds18b20_python

Raspberry Pi3の GPIO端子の 1-Wire®機能を有効化

コマンド欄に下記のコマンドを入力、動作して、configファイルを編集します。

sudo nano /boot/config.txt

カーソルをconfigファイルの一番下に移動して、下記の内容をファイルにコーピーして下さい。

dtoverlay=w1-gpio

キーボードのCtrlとXキーを押して、Yを入力したら、ファイルを保存します。

コマンド欄に下記のコマンドを動作したら、ラズパイを再起動して、配置を有効にする

sudo reboot

再起動したら、下記のコマンドを動作して、 1-Wire®が起動していたと確認できます。詳しく画像をご確認:

lsmod

2017-03-20-075235_1824x984_scrot

上記の画像のように、w1_gpio wire などの内容が有ったら、1-Wire®が正常起動していたと判明できます。もし、無ければ、下記のコマンドを動作して、1-Wire®を有効します。

sudo modprobe w1-gpio
sudo modprobe w1-therm

下記の各コマンドを作動したら、今現在の温度をリターンします。

sudo modprobe w1-gpio Enterキー
sudo modprobe w1-therm Enterキー
cd /sys/bus/w1/devices Enterキー
cd /28-xxxxxx Enterキー
cat w1_slave Enterキー

ソフトウエア

下記のコマンドを動作したら、temp.pyファイルを新規作成します。

sudo nano temp.py

下記の内容をtemp.pyファイルにコーピーして下さい。

import os
import glob
import time

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    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, temp_f
  
while True:
  print('C =%3.3f F = %3.3f'% read_temp())  
  time.sleep(1)

キーボードのCtrlとXキーを押して、Yを入力したら、ファイルを保存します。

ファイルが保存したら、下記のコマンドを動作して、結果を確認します。

sudo python  ./temp.py

2017-03-20-084757_1824x984_scrot

説明:

1)os.system(‘modprobe w1-gpio’)とos.system(‘modprobe w1-therm’)はプログラムの最初にmodprobeコマンドを作動します。

2)base_dir = ‘/sys/bus/w1/devices/’とdevice_folder = glob.glob(base_dir + ’28*’)[0]は/sys/bus/w1/devices/の28からのファイルを獲得します。

3)device_file = device_folder + ‘/w1_slave’はファイルを開けて、データを獲得します。

4)while lines[0].strip()[–3:] != ‘YES’: 読み取れたファイル第1行最後の文字はYESかどうか判明します。

5)equals_pos = lines[1].find(‘t=’) :読み取れたファイル第2行(t=)を検索します。もし、見つからない場合、1をリターンします。