ホームホーム  [日本語 / English]

パソコンの CPU 温度によって RGB LED の色を変える

はじめに

内容はタイトルの通りです。 HP のパソコンにそういう機能を持った機種があり,自作 PC でも再現したいと思いました。 調査の結果,いくつかのオープンソースソフトウェアと自作の C# アプリケーションを使って実現することができました。

緑 赤

環境

試した環境は以下の通りです。

ARGB LED

使用したマザーボード TUF GAMING B550-PLUS は通常の RGB LED とアドレッサブル RGB(ARGB)LED の接続に対応しています。 今回は以下の ARGB LED ストリップを使用しました。

アイネックス 2Way ARGB LEDストリップライト 30cm RLD-STRDM30B

システム構成

今回作成したシステムの全体像は下図の通りです。

システム構成

以下の構成要素からなります。

Hardware
監視および制御の対象となるハードウェアです。
LibreHardwareMonitorLib
ハードウェアの情報を取得するためのライブラリです。今回は CPU の温度を取得するのに使っていますが,それ以外にも様々な情報を取得することができます。 https://github.com/LibreHardwareMonitor/LibreHardwareMonitor
OpenRGB
LED を制御するためのソフトウェアです。単体で LED を制御するアプリケーションとして動作するほか,サーバー機能を持っていて,クライアントから TCP/IP で接続して使うこともできます。 https://openrgb.org/
OpenRGB.Net
上記 OpenRGB のサーバー機能に C# から接続するためのクライアントとなるライブラリです。https://github.com/diogotr7/OpenRGB.NET
Application
全体を制御する自作アプリケーションプログラムです。C# で作成しました。

準備

  1. マザーボードに ARGB LED ストリップを接続します。
  2. OpenRGB をホームページからダウンロードします。
  3. C# のプロジェクトを作成し,Nuget パッケージマネージャを使って LibreHardwareMonitorLib と,OpenRGB.Net をインストールします。

CPU 温度の取得

LibreHardwareMonitorLib を使って CPU の温度を取得するプログラムは以下のようになりました。"/amdcpu/0/temperature/2" の部分は CPU によって変える必要がありそうです。

また注意点として,このプログラムを実行するときは「管理者として実行」しないと,温度が取得できませんでした。 (参考: 常に管理者としてアプリケーションを実行させるには?

            
Computer computer = new Computer();
computer.IsCpuEnabled = true;
computer.Open();
computer.Accept(new UpdateVisitor());

double temperature = 0;
foreach (IHardware hardware in computer.Hardware)
{
    foreach (ISensor sensor in hardware.Sensors)
    {
        if (sensor.Identifier.ToString() == "/amdcpu/0/temperature/2")
        {
            temperature = sensor.Value.GetValueOrDefault();
        }
    }
}

UpdateVisitor の定義は以下のようになっています。

            
public class UpdateVisitor : IVisitor
{
    public void VisitComputer(IComputer computer)
    {
        computer.Traverse(this);
    }
    public void VisitHardware(IHardware hardware)
    {
        hardware.Update();
        foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
    }
    public void VisitSensor(ISensor sensor) { }
    public void VisitParameter(IParameter parameter) { }
}

LED の制御

OpenRGB を実行すると以下のような画面が出ます。OpenRGB 単体で LED を制御することもできます。

今回のようにクライアントアプリケーションから制御したいときは,"Mode" を "Direct" にするとよいようです。

OpenRGB

また,サーバーとして動作させるには,"SDK Server" タブを選択し "Start Server" ボタンを押します。その後,クライアントアプリケーションからサーバーに接続します。

OpenRGB Server

OpenRGB.NET を使って OpenRGB のサーバーに接続し,LED の色を設定するプログラムは以下のようになりました。変数 r, g, b に RGB 各色の輝度が入っています。

            
var openRgbClient = new OpenRGBClient(name: "My OpenRGB Client", autoconnect: true, timeout: 1000);
var devices = openRgbClient.GetAllControllerData();

for (int i = 0; i < devices.Length; i++)
{
    var leds = Enumerable.Range(0, devices[i].Colors.Length)
        .Select(_ => new OpenRGB.NET.Models.Color((byte)r, (byte)g, (byte)b))
        .ToArray();
    openRgbClient.UpdateLeds(i, leds);
}

温度から RGB への変換

実際に CPU の温度を測ってみると無負荷時で 40℃ くらい,100% 負荷時で 90℃ くらいでした。 そこで, CPU の温度が 40℃ → 65℃ → 90℃ と変化するのに対応して,LED の色を 緑 → 黄 → 赤 と変化させることにしました。

この場合の温度から RGB への変換プログラムは以下の通りです。

            
int temp = (int)temperature;    // 温度
int r, g, b;    // RGB 各色輝度

if (temp < 40)
{
    r = 0;
    g = 255;
    b = 0;
}
else if (temp < 65)
{
    r = 255 * (temp - 40) / 25;
    g = 255;
    b = 0;
}
else if (temp < 90)
{
    r = 255;
    g = 255 * (90 - temp) / 25;
    b = 0;
}
else
{
    r = 255;
    g = 0;
    b = 0;
}

実際使ってみると CPU の温度が目で見てわかるので,CPU が頑張って計算している様子が伝わってきて楽しいです。

以上