RaspberryPi・シェルスクリプトで複数のDS18B20センサから同時に値を取得する
概要
Raspberry Piに接続した、複数の温度センサDS18B20からできるだけ高速に温度値を取得する方法を示します。
DS18B20は、1-Wire接続でRaspberry Piに接続しますが、1個のセンサで値を取得するのに1秒ほどかかります。
1個ずつ値の取得をしていると(逐次実行すると)、n個のセンサでn秒かかってしまいます。
シェルスクリプトを使ってサブプロセスにて値を並列で取得したところ、2個のセンサの値を1秒ほどで取得できました。
方法
シェルスクリプトは、コマンドの終わりに&
をつけると、コマンドの実行が終わる前に次の行の処理を開始することができます。つまり、1個の処理が完了する前に次の処理を開始することができます。
DS18B20の値を並列に取得するシェルスクリプトを以下に示します。
#!/bin/bash
# 定数設定
dev_path="/sys/bus/w1/devices"
# 温度センサのデバイス名をdev_listに格納
dev_list=($(find ${dev_path} -maxdepth 1 -name "28*" -type l | xargs -I{} basename {}))
# 温度センサの値を一気に取得
result="$(for dev in ${dev_list[@]}
do
echo ${dev}, $(cat ${dev_path}/${dev}/temperature) &
done
wait)"
echo "${result}"
配列dev_list
には/sys/bus/w1/devices/
にある、28-
で始まるシンボリックリンクのリンク名が格納されます。これをforで1件ずつ処理します。
ポイントは以下の行です。
echo ${dev}=$(cat ${dev_path}/${dev}/temperature) &
catで${dev_path}/${dev}/temperature
の値を読み取りますが、echoコマンドの末尾に&
があるので、読み取りが終わる前にforのループが次に進みます。
よって次のセンサの値の読み取りが開始されます。
温度センサの読み取りが完了すると、各センサごとの結果がresult
に格納されていきます。
28-3c01a816d9f0=28312
wait
コマンドは、実行中のサブプロセスの完了を待つコマンドです。すべての温度センサの読み取りが完了するまでここで待ちます。
実行時間比較
順番にセンサの値を読み取る以下のプログラムと、timeコマンドで実行時間を比較してみます。
#!/bin/bash
dev_path="/sys/bus/w1/devices"
dev_list=($(find ${dev_path} -maxdepth 1 -name "28*" -type l | xargs -I{} basen$
for dev in ${dev_list[@]}
do
echo ${dev}, $(cat ${dev_path}/${dev}/temperature)
done
exit 0
$ time bash previous.sh
28-3c01a816d9f0, 28250
28-3c01a8169133, 27937
real 0m1.831s
user 0m0.044s
sys 0m0.099s
1.8秒ほどかかりました。
次に並列実行の場合。
$ time bash proposed.sh
28-3c01a816d9f0=28250
28-3c01a8169133=27937
real 0m1.075s
user 0m0.084s
sys 0m0.087s
1秒とちょっとで取得完了しました。
まとめ
シェルスクリプトで、温度センサ(DS18B20)から値を並列実行し、高速に温度を取得する方法を示しました。
シェルスクリプトは複数の機能や高度なアプリケーションを記述するのには向いていませんが、シェルスクリプトでは、他の言語と比べ簡単に並列処理を記述することができます。
Author And Source
この問題について(RaspberryPi・シェルスクリプトで複数のDS18B20センサから同時に値を取得する), 我々は、より多くの情報をここで見つけました https://qiita.com/yamato225/items/a97b3f81656c608bf88c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .