"raspberry pi", ラズパイ, vcgencmd, gnuplot, LCD, 3.5インチ, 3.5inch, fbi

08. ラズパイでフレームバッファ #2

2017/08/11 -- Posted by : bitset

<はじめに>

Raspberry Pi の 3.5インチLCDに、C言語やPythonを使わず、Shellscriptだけでどこまで出来るか試してみます。(Shellscriptもちゃんとしたプログラミング言語ですが)


IMG_20170726_123912171-640-min.jpg

当初は何かセンサーを繫いでデータを収集しグラフ表示しようと考えましたが、液晶モジュールがラズパイのピンヘッダを専有してしまっているので外部センサーはあきらめ、ラズパイ自身のCPU温度を収集し、グラフをLCDに表示しました。
 

<事前調査>

icon_checked.png  CPU温度の取得方法

ラズパイは次の2つの方法でCPU温度を取得できます。

(1) /sys/class/thermal/thermal_zone0/temp を参照

cat コマンドでファイルを直接参照します。

$ cat /sys/class/thermal/thermal_zone0/temp
44925

 

(2) vcgencmd コマンドで取得 

$ vcgencmd measure_temp
temp=44.9'C

vcgencmd コマンドは、CPU温度以外にも 周波数、メモリ使用量などいろいろな値を取得できます。 詳細は http://www.elinux.org/RPI_vcgencmd_usage で確認出来ます。

CPU温度以外をグラフ化することも考慮し、今回はvcgencmd で取得しました。 定期的にCPU温度を取得してファイルに保存します。

 

icon_checked.png  グラフの作成・表示

定番の gnuplot を使用します。 作成したグラフ画像を fbiコマンドで画面に表示します。

 

<処理の流れ>

今回作成する処理フローは以下のようになります。


flow-2.png

  1. cron で収集スクリプトを定期起動し、測定値をCSVファイルに蓄積していきます。
  2. グラフ表示スクリプトでグラフ作成・表示を一定間隔で繰り返します。

 

<作ったもの>

icon_checked.png データ収集スクリプト

CPU温度の収集側です。

#!/bin/sh
CSV=$HOME/data/cpu_temp.csv

echo `date "+%Y-%m-%dT%H:%M:%S,";vcgencmd measure_temp |sed -e 's/[^0-9.]//g'` >> $CSV

時刻と温度のペアをCSV形式で書き出しています。

これを cronで1分毎に実行します。

$ crontab -l
*/1 * * * * /home/pi/bin/collect_temp.sh

 

icon_checked.png グラフ表示スクリプト

gnuplot --> fbi の無限ループになっています。

#!/bin/bash
CSV=$HOME/data/cpu_temp.csv
PNG=$HOME/data/cpu_temp.png

while :
do
  if [ -e $CSV ]; then

    gnuplot -e "
      set terminal png size 480,320;
      set output '$PNG';
      set title 'CPU Temp.';
      set nokey;
      set xdata time;
      set timefmt '%Y-%m-%dT%H:%M:%S';
      set xtics 300;
      set format x  '%H:%M';
      set yrange[40:75];
      set xlabel 'time';
      set ylabel 'temp';
      set datafile separator ',';
      plot '< tail -n 20 $CSV' using 1:2 with linespoints;
    "
    (sleep 60; pkill -2 -f fbi) & fbi -d /dev/fb1 -a --noverbose --noedit $PNG > /dev/null 2>&1
  fi
done

(補足)

行   コード 説明
10 set terminal png size 480,320; 生成する画像サイズです。
LCDの解像度と同じ値を指定します。
11 set output '$PNG'; 生成する画像ファイル名です。
18 set yrange[40:75];  Y軸の温度の範囲です。
22 plot '< tail -n 20 $CSV' ... 収集結果の最新20件でグラフ作成します。

 

CSVファイルにデータが蓄積されてからこのスクリプトを実行すると、次のようなグラフ画像ファイルが作成されます。

cpu_temp.png

 

そして、ラズパイの画面には次のように表示されます。

IMG_20170811_184721117-640-min.jpg

 

<最後に>

表示だけならShellscriptでもこれくらいは可能です。 更に高度な表示や、タッチパネルなどのUIが必要になると厳しくなります。 そうなると、Python(Pygame)やその他のグラフィックライブラリを使って本格的なプログラミングになります。
 

Share:

Most Recent Posts

07. ラズパイでフレームバッファ #1

ラズパイの3.5インチLCDに画像表示を行います。

06. ImageMagick で帳票作成 (データ作成編)

jinja2を使って、JSONファイルをImagemagick用データに変換します。

05. ImageMagick で帳票作成 (実践編)

Imagegagick を使って、業務に耐えうるレベルのPDF帳票を作成します。