Arduino LeonardoでPCリアルタイム監視:LCDにCPU/GPU温度を表示
必要な部品と材料
- Arduino Leonardo(またはUART搭載のAtmegaボード) ×1
- LCD 16×2(I2Cモジュール付き) ×1
- ジャンパーワイヤー
プロジェクト概要
PCのCPU温度やGPU温度をリアルタイムでLCDに表示するシステムを構築します。Arduino側はシリアル通信でデータを受信し、LCDに表示するだけのシンプルな役割。重い処理はPC側のC#アプリケーション(OpenHardwareMonitorLib使用)が担い、定期的に温度を取得してArduinoへ送信します。
ハードウェア接続
I2C接続のLCDを使用する場合、SDA/SCLをArduino Leonardoの対応ピン(SDA: D2、SCL: D3)に接続します。I2Cアドレスはスキャンスケッチで確認(一般的に0x3Fまたは0x27)。

Arduinoスケッチ
シリアルから文字を1文字ずつ読み取り、終端文字 *(1行目)または #(2行目)を検出したらLCDへ出力します。バッファクリアも忘れずに。
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
String inData;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
while (Serial.available() > 0) {
char recieved = Serial.read();
inData += recieved;
if (recieved == '*') {
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0, 0);
lcd.print("GPU Temp.: " + inData + char(223) + "C ");
inData = "";
if (inData == "DIS") { lcd.clear(); lcd.print("Disconnected!"); }
}
if (recieved == '#') {
inData.remove(inData.length() - 1, 1);
lcd.setCursor(0, 1);
lcd.print("CPU Temp.: " + inData + char(223) + "C ");
inData = "";
}
}
}
PC側 C# アプリケーション
OpenHardwareMonitorLib.dllを参照し、CPU/GPU温度を取得してシリアルポート経由でArduinoへ送信します。フォーム上でCOMポートと送信間隔を選択し、「Connect」で開始、「Disconnect」で終了。
主要コード抜粋
using System.IO.Ports;
using OpenHardwareMonitor.Hardware;
SerialPort port = new SerialPort();
Computer c = new Computer() { GPUEnabled = true, CPUEnabled = true };
float value1, value2; // GPU, CPU温度
private void Init() {
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.RtsEnable = true;
foreach (string p in SerialPort.GetPortNames()) comboBox1.Items.Add(p);
port.BaudRate = 9600;
}
private void Status() {
foreach (var hw in c.Hardware) {
if (hw.HardwareType == HardwareType.GpuNvidia) {
hw.Update();
foreach (var s in hw.Sensors)
if (s.SensorType == SensorType.Temperature) value1 = s.Value.GetValueOrDefault();
}
if (hw.HardwareType == HardwareType.CPU) {
hw.Update();
foreach (var s in hw.Sensors)
if (s.SensorType == SensorType.Temperature) value2 = s.Value.GetValueOrDefault();
}
}
try { port.Write(value1 + "*" + value2 + "#"); }
catch { timer1.Stop(); /* エラー処理 */ }
}
注意点
- C#アプリは**管理者権限**で実行する必要があります(ハードウェアアクセスのため)。
- OpenHardwareMonitorLib.dllは別途ダウンロードして参照設定してください。
- シリアル通信の終端文字(
*,#)はArduino側と合わせてください。
回路図

製造プロセス
- Arduino Nano 33 IoT製 フライトシミュレーター2020用コックピットパネル - LCD&CDI表示
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- 給湯器パイロットライト監視システム - サーモカップル電圧をArduinoとRaspberry Piで監視し異常通知
- Arduino UNOで1.17インチTFT LCDに画像を表示する方法
- Arduino Nanoで自作オシロスコープ(10Hz〜50kHz)128×64 LCD搭載
- Arduino NanoとMAX30102で心拍数モニターを自作:16x2 LCD表示対応
- Arduino Mega と IoT センサによる高機能ホームモニタリングシステム
- DHT センサで作る信頼性の高い Arduino 気象ステーション
- DS1302 RTCとArduino UNOで作る信頼性の高い目覚まし時計