温度センサーDS18B20を防水型に

温度センサーDS 18B20の防水型を購入しました。目的は、液体の温度を測定するためです。センサー部分がステンレスで覆われているので、液体に浸すのに適しているのかなと考えました。いま使っているセンサーを加工しようかとも考えたのですが、防水型のセンサーが比較的安価に販売されていたので、購入することにしました。Amazonの広告にはArduino用と記載されていますが、たぶんラズパイでも使える筈です。

見えにくいのですが、センサーはステンレスで覆われ、ケーブルは、赤:3.3V DC 黒:GND 黄色:DATA(GPIO4に接続)です。

Raspberry Pi ZERO WHにユニバーサル基板を重ねて、温度センサー用のコネクタをつけました。

2つのセンサーから読み取った温度を、指定した時間間隔ごとに表示して、CSVファイルに保存するプログラムです。
 -*- coding: utf-8 -*-
import os
import glob
import time
import datetime
import subprocess

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_folder = glob.glob(base_dir + '28*')       #センサーが正しく接続されるとできるフォルダの名称をすべて取得(リスト)
ch_length = len(device_folder)                    #接続されている温度センサーの数を取得
temp= [0.00]*ch_length                            #

def read_temp_raw(ch):
    device_file = device_folder[ch] + '/w1_slave'
    catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out,err = catdata.communicate()
    out_decode = out.decode('utf-8')
    lines = out_decode.split('\n')
    return lines

def read_temp(ch):
    lines = read_temp_raw(ch)
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw(ch)
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c
    
def file_save(time_str,temp):
    dir_path = '/home/pi/DS18B20_data'
    today = datetime.datetime.now()
    data_str=""
    for ch in range(ch_length):
        data_str = data_str + "," + "{:.3f}".format(temp[ch])
    data_str = data_str + "\n"
    filename = today.strftime('%Y%m%d')
    if not os.path.exists('/home/pi/DS18B20_data'):
        os.makedirs('/home/pi/DS18B20_data')
    f = open('/home/pi/DS18B20_data/'+filename+'.csv','a')
    f.write(time_str + data_str)
    f.close()
    
try:
    time_span = input("測定間隔を秒単位で入力してください(3秒以上の整数値):")
    
    while True:
        for ch in range(ch_length):
            temp[ch] = read_temp(ch)
        time_str = datetime.datetime.today().strftime("%Y/%m/%d %H:%M:%S")
        print('日付時刻:{0:}   センサー0: {1:.3f}℃   センサー1: {2:.3f}℃'.format(time_str,temp[0],temp[1]))
        file_save(time_str,temp)
        time.sleep(int(time_span)-2)
except KeyboardInterrupt:
    pass

実行画面です。5秒ごとに表示しています。これを使って、ちょっと実験したいと考えています。

  • X