LoginSignup
9
5

More than 3 years have passed since last update.

PythonでラズパイのCPU温度を測定する

Last updated at Posted at 2020-07-31

Raspberry PiのCPU温度はvcgencmd measure_tempで取得できます。
モニタリング用に1秒ごと60回測定し、最後にその平均を表示するようにしました。

追記

軽量化した改良版を公開しました。
情報を取得するモジュールをsubprocessからopenに変更して負荷を軽減しています。

コード

使用言語はPython3.7です。
ラズパイではPythonと打つと標準ではPython2が出てきますが、3.7とは互換性がないのでエラーとにらめっこしないようお気を付けください。
え?そんなことするのは私だけですね。ハイ。
sudo chmod a+x temp.pyで実行権限を付与して./temp.pyとすれば動きます。

temp.py
#!/usr/bin/python3.7

import subprocess
import time
import sys
import re

num = 60
ave = 0

print(subprocess.run('lsb_release -a', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout)

try:
    while num > 0:
        temp = subprocess.run('vcgencmd measure_temp', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        freq = subprocess.run('vcgencmd measure_clock arm', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')
        volt = subprocess.run('vcgencmd measure_volts', shell=True, encoding='utf-8', stdout=subprocess.PIPE).stdout.split('=')

        temp = temp[1].replace('\n', '')
        freq = int(freq[1].replace('\n', '')) / 1000000000
        volt = volt[1].replace('\n', '')

        print('Temp: ' + temp + ', Freq: ' + f'{freq:.2f}' + 'GHz, Volt: ' + str(volt) + ' (' + str(num) + ')')

        ave += int(re.sub('\\D', '', temp))
        num -= 1
        time.sleep(1)
    print('Average: ' + f'{ave / 600:.1f}' + "'C (60s)")

except KeyboardInterrupt:
    sec = 60 - num
    print(' Aborted.\nAverage: ' + f'{ave / sec / 10:.1f}' + "'C (" + str(sec) + 's)')
    sys.exit()

工夫したところ

夏休みの自由研究かよっていう見出しですがご容赦ください。
初心者なりに色々調べて書きました。

バージョン情報

めっちゃ要らないですが、最初にLinuxのバージョン情報を表示させてます。
ループ前のprintの中にあるlsb_release -aを書き換えれば好きなコマンドの実行結果を表示できます。
完全に自己満足です。

Subprocess

調べたところpythonからコマンドを実行するにはsubprocessが良いようです。
理由はよくわかりませんが長い物には巻かれろということでsubprocessを使いました。

温度以外の値

温度だけではつまらないので(何が)、クロック周波数と動作電圧も表示するようにしました。
これが余計と思いきや見ていて結構面白いです。
私の環境では、意外と1.5GHzまでは使っていないですね。

KeyboardInterrupt

Ctrl + Cでループを抜けられますがエラーが吐き出されてしまいます。
精神衛生上よろしくないということでループ処理をtryで囲ってCtrl + Cexcept KeyboardInterruptでキャッチしています。
こうすることでエラーも吐き出されませんし、抜けるときの処理も書き込むことができます。

その他

  • 変数num60を変えれば測定する秒数を変えられます。
  • 本ファイルを/{hogehoge}に置いて、ln -s /{hogehoge}/temp.py /usr/bin/tempとすれば任意のディレクトリでtempと打つだけで本プログラムを実行できます。
  • 趣味グラマーの初投稿故にお見苦しい点が多々あるかと思いますが、ご容赦ください。
  • 「プロ」グラマーの方、何かコメントがありましたら是非ビシバシとご指摘ください。
9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5