Day7

計測システムを構築_水温センサー_

Topへ

Day6へ

Day8へ

はじめに

今回は、水温センサーをraspberrypiに取り付けその設定をしていきたいと思います。
といっても今回も独力ではできないので、関連のサイトを参考にしています。今回、全体をとうして参考にしたサイトは、 ココ になります。

Step1

使用するセンサー等

image

今回使用するセンサーは、「DS18B20」というものになります。これもネット通販等で購入できると思います。(これもAmazonでは簡単に検索できます。)
当然、ジャンパーワイヤも必要になります。

image

この他に、今回新たに「4.7kΩの金属皮膜抵抗」が必要になります。こちらは単体で購入するのは難しいのではないかと思います。

Step2

水温センサーを接続

image

まず、ケーブルを付けるのですが、ケーブルの皮をむき銅線を出す必要があります。
なにも専用の道具を持っていないのでカッターで切り込みを入れ剥がしました。 (切り込みは浅めに入れておいて指で強引に引っ張り取るほうがいいみたいです。)
剥がした後の状態が画像の写真になります。

image

これを、それぞれの箇所に固定する必要があります。
おっさんの場合は、黄色のケーブル→DAT
赤色のケーブル→VCC
黒色のケーブル→GNDにそれぞれ繋ぎました。

image

残りの配線は画像の図のとおりとなります。(前回の照度センサーに追加した形にしてます。)
ここで、図でいうと青色のケーブル→DAT
赤色のケーブル→VCC
黒色のケーブル→GNDにそれぞれ接続します。

image

実際に配線した写真になります。

Step3

raspberrypi側の設定

image

raspberry piを起動します。
起動したらリモート側のパソコンの「Tera Term」を起動し、「sudo raspi-config」と入力しenterキーを押します。

image

「3」を選択します。

image

「I7」を選択します。

image

「はい」を選択します。

image

「了解」を選択します。

image

「Finish」を選択したら設定が完了になります。その後に、再起動します。

image

「Tera Term」に戻ります。
sudo nano /boot/config.txt」と入力しenterキーを押します。

image

そうそすると、nanoエディタが開きますので、一番下の[all]のところの下の箇所を、「dtoverlay=w1-gpio,pullup=on」 と書き換え、ctrlボタンとOキーを押します。これで、保存が完了します。
変更が終わったのでctrlボタンとXキーでエディタを終了します。

image

画像のとおりある場所のフォルダに移動します。
cd /sys/bus/w1/devices/」と入力しenterキーを押します。

image

ここで「ls -la」と入力しenterキーを押します。

image

28-ではじまるファルダが表示されていればO.Kみたいです。ちなみに28-からはじまるファルダ名は後程使いますので記録しておいてください。

image

「Visual Studio Code」を開き、「新しいテキストファイル」を選択します。(メモ帳等でも問題ありません。)

image

以下のコードを入力します。
import sys
import subprocess

SENSOR_ID = "28-3c01a816bbf9"
SENSOR_W1_SLAVE = "/sys/bus/w1/devices/" + SENSOR_ID + "/w1_slave"
ERR_VAL = 85000
res = str(subprocess.check_output(["cat", SENSOR_W1_SLAVE]))
temp_val = res.split("=")
temp_val=temp_val[-1].replace("\\n'","")
temp_val = round(float(temp_val) / 1000, 1)
print(temp_val)
コードの内容は最後に書くことにします。
ここで、一つだけ注意点としては、4行目の28で始まる値は、「Tera Term」で表示された値になります。

image

どこでもいいのでこのコードを書いたファイルを「w_temp.py」として保存します。

image

「WinSCP」を開き、保存した「w_temp.py」をraspberrypiの「python_apps」フォルダ直下にコピーします。

image

「Tera Term」に戻り、まずは「w_temp.py」を保存している「python_apps」フォルダに移動します。 「cd python_apps」と入力しenterキーを押します。

image

python3 w_temp.py」と入力します。
画像が実行結果になります。
表示は、14.2と出ています。これが水温になり単位は℃になります。

image

ここからは、今回のコードについてわかる範囲で書いていこうと思います。
まずは「import」文になります。今回は、「sys」と「subprocess」のライブラリを使用することになっています。
このうち、「sys」は、「インタプリタや実行環境に関する情報を扱うためのライブラリ」ということで、何のことかわかりません。
次に、「subprocess」ですが、「Pythonからコマンドを実行するためのライブラリ」ということのようです。なんとなくですが、 「Tera Term」上で指示するコマンド(例えば、cd python_apps)が扱えるようにするためのものではないだろうかと思います。

image

多分、水温センサーのアドレスを設定しているものと思われます。

image

次の行ですが、早速「subprocess」が使われています。なので、その後の「check_output」が関数であることがわかります。
「check_output」は、正常にコマンドが実行された場合は、バイト文字列で出力を返すようです。
よって、["cat", SENSOR_W1_SLAVE]を実行し、その結果を返していることになります。
ただし、バイト文字列になっており、このままだと以降エラーが出たので、str関数で普通の文字列に変更しています。

image

ここで["cat", SENSOR_W1_SLAVE]の結果がわからないので、res変数に格納されている文字列を確認しようと思います。
画像のとおりコードを少し変更し、いきなりres変数を出力してみることにします。

image

画像が実行結果になります。
なにやら良くわからない文字が並んでいますが、赤線部分が温度の値を表しているようです。
なので、この後の作業としてはこの赤線部分だけを抽出することになります。

image

この行では、先程の文字列をsplit関数を用いて分ける作業をしています。
分け方は、「=」ごとに分けるように指示しています。

image

実際に分けた後の状態を見てみたいと思います。
画像のとおり、分けた直後の変数を出力してみることにします。

image

画像が出力結果になります。
よく見るとわかるのですが、全体の形が[○○,△△,□□]になっています。つまり、配列形式になっています。
なので、変数temp_valは配列の変数であることがわかります。pythonは変数の宣言をしなくてよいので便利だと感じる反面 こういうときはわかりにくいです。
この中で欲しい値は、最後の「14375\\n'」という文字列になります。

image

この行では、文字列「14375\\n'」の「\\n'」がいらないので、replace関数で除外しています。
ただし、この時点の変数temp_valは3つの文字列が格納されているので、一番最後の文字列に絞る必要があります。
その指定方法が、temp_val[-1]であり、マイナス1とすることで最後から一番目だけを取り出していることになります。

image

最後になります。まず「float」関数で、文字列型を小数型に変換しています。数値化したことで1000で割ることができます。
さらに、「round」関数で小数点以下を調整しています。
これで、水温を表す数字のみを表示できることになります。
以上になります。お疲れ様でした。ありがとうございました。