ニキシー管を使ったガジェットのためにCPU温度など情報をarduinoにシリアル通信で送る方法です。
PCのハードウェアの情報を送る流れは、
1. LibreHardwareMonitorというソフトで情報をローカルネットワークにJSON形式で出力
2. JSON形式のデータから必要な情報を読み取ってシリアル通信でarduinoに送信するPythonコードを実行
となっています。
関連記事はこちら
・ニキシー管について
・ニキシー管でいろいろなものを表示するものを作った【ハードウェア編】
・ニキシー管でいろいろなものを表示するものを作った【ソフトウェア編】
Libre Hardware Monitorの実行
Libre Haedware Monitorはハードウェアの情報をモニタリングすることができるソフトです。
Git Hubページからダウンロードできます。
Libre Hardware Monitor
https://github.com/LibreHardwareMonitor/LibreHardwareMonitor
導入方法などはこちらのページに詳しく書いてありました。
しぐにゃもブログ「LibreHardwareMonitorでPC情報をJSON出力する方法」
https://signyamo.blog/lhm_json/

「here」の部分からダウンロードできます。
ダウンロードしたファイルの「LibreHardwareMonitor.exe」を実行します。

Options→Remote Web Server→Run
のところにチェックを入れます。

同じところにある「Interface/Port」のところを確認します。


赤く囲われた部分のURLを控えておきます。隠していますが「http://192.・・・」のような感じです。
Arduinoポートの確認
使いたいArduinoのポートを確認します。
ArduinoIDEを起動します。

認識しているボードのポート名 COM3 (環境によって数字は変わる)を控えておきます。
データの読み取り・送信のPythonコードを実行
メインであるPythonコードを実行します。
import requests
import time
import serial
# Arduino の COM ポート
ser = serial.Serial("COM**", 115200, timeout=1)
url = "http://192.***.*.*:8085/data.json"
response = requests.get(url) # サーバにアクセス
response.raise_for_status() # エラーがあれば例外を出す
data = response.json() # JSONをPythonのdictとして取得
def find_value(node, target):
"""
JSONツリーを再帰的に探索して、Text が target の Value を返す
"""
if isinstance(node, dict):
if node.get("Text") == target:
return node.get("Value")
for child in node.get("Children", []):
result = find_value(child, target)
if result is not None:
return result
elif isinstance(node, list):
for item in node:
result = find_value(item, target)
if result is not None:
return result
return None
# 欲しい値を取得
cpu_temp = find_value(data, "Core Average")
cpu_usage = find_value(data, "CPU Total")
mem_usage = find_value(data, "Memory")
print("CPU温度:", cpu_temp)
print("CPU使用率:", cpu_usage)
print("メモリ使用率:", mem_usage)
while True:
try:
# サーバからJSONを取得
response = requests.get(url, timeout=5)
response.raise_for_status()
data = response.json()
# 必要な値を抽出
cpu_temp = find_value(data, "Core Average")
cpu_usage = find_value(data, "CPU Total")
mem_usage = find_value(data, "Memory")
print("CPU温度:", cpu_temp, " CPU使用率:", cpu_usage, " メモリ使用率:", mem_usage)
# 単位記号を削除
def clean(val):
if val is None:
return ""
return val.replace("°C", "").replace("%", "").replace(" ", "")
cpu_temp = clean(cpu_temp)
cpu_usage = clean(cpu_usage)
mem_usage = clean(mem_usage)
# CSV形式で出力 (例: 37.0,23.2,57.4)
line = f"{cpu_temp},{cpu_usage},{mem_usage}"
print(line) # ← この出力をシリアルでArduinoに送れる
ser.write((line + "\n").encode("utf-8"))
except Exception as e:
print("エラー:", e)
time.sleep(1) # 1秒ごとに更新
コードの中を環境に応じたものに書き換えます。
# Arduino の COM ポート
ser = serial.Serial("COM**", 115200, timeout=1)
url = "http://192.***.*.*:8085/data.json"
この部分に先ほど控えたポートとURLを書き込みます。
# 必要な値を抽出
cpu_temp = find_value(data, "Core Average")
cpu_usage = find_value(data, "CPU Total")
mem_usage = find_value(data, "Memory")
この部分でほしいデータを読み込んでいます。
変えたい場合はLibre HardwareMonitorの欲しいデータの名前に変更します。

書き換えたコードをメモ帳などで「send_pc_status.py」などの名前で保存します。名前は何でもいいです。
このコードをPython環境で実行します。私の場合はAnacondaを使っています。
このページにAnacondaの導入方法が解説してあります・
maasは瞑想中「Anacondaのインストールと基本設定 – 初心者でも簡単にできるデータサイエンス環境構築」
https://maahsachi.com/2025/03/08/ca46c1b9/
スタートメニューにある「Anaconda Prompt」でコードを実行します。

Anaconda Promptでコードを保存したディレクトリに移動して
「python send_pc_status.py」(先ほど保存したコードの名前)
と打ち込んで実行します。
ライブラリがインストールされていない場合、インストールしてください。
Anacondaの場合「conda install pyserial」と打ち込めばインストールされます。

コードを実行すると数値がシリアル通信で送られます。
コードを使うときは変数名などを適宜変更してください。
関連記事はこちら
・ニキシー管について
・ニキシー管でいろいろなものを表示するものを作った【ハードウェア編】
・ニキシー管でいろいろなものを表示するものを作った【ソフトウェア編】
