エントリー

温度管理

サーバーを見に行かなくて良くなったんで、もう一つやりたかった事をやろうかと。

約10年以上前なんですが、猛暑の夏を乗り切れなかったPCが1台、月曜日に出勤すると、ブルースクリーンが出ていて、色々調べているとメモリーが熱でやられていました。

次の年から、サーバー機に入れ替えたおかげで、その後の猛暑も乗り越えてきたんですが、朝出勤するとファンが全開でとっても五月蠅い。

さらに、部屋が排熱でとっても熱い・・・

今年は猛暑だと言う噂もあるし、サーバーが増えたことと、常時電源が入っている、PCもあるので何とかしなければ。

KURO-RSは持っているんですが、エアコンの赤外線リモコンは、情報量が多いため、未対応。

って事で、トラ技やCQなんかとタイアップしている、ビット・トレード・ワンの赤外線リモコンキットを購入してみました。(AD00020)

このキット、フリスクサイズの基盤なんで、老眼の私には半田付けが辛い・・・

何とか完成して、HPからソフトをダウンロードして、テスト、無事動作の確認が出来ました。

ハード面は何とかなりそうなので、ソフトにかかります。

まず、温度の取得です。

USB温度計を購入しようかとも思ったんですが、PC内部には色々と温度センサーがあるんで、使えるものを探してみます。

CPUやGPUは負荷状態でかなり変動するので使えない、マザーボードの温度かHDDの温度が良さそう。

室温を色々と変えて、関係性をモニタリングしてみると、HDD温度が室温+10℃ぐらいでで推移していて、これが使えそうです。

当然、正確に+10℃ではなくバイアスがかかっているんですが、筐体の中の温度と言うことで、これを使おうと思います。(うちのマザーボードの温度は、良くわからない動きをするので・・・)

って分けで、HDDのS.M.A.R.Tから温度情報を取得します。(C#)

                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSStorageDriver_ATAPISmartData");
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    byte[] arrVendorSpecific = (byte[])queryObj.GetPropertyValue("VendorSpecific");
                    int tempIndex = Array.IndexOf(arrVendorSpecific, (byte)194);
                    hddchk[0] = arrVendorSpecific[tempIndex + 5].ToString() ;
                }

さて、この情報を元に赤外線リモコンでエアコンを入れれば・・・・

提供されているDLLって、32ビットなんだよ~、アプリは64ビット

リモコンアプリのソースも公開されているんで、USBデバイスを直接操作って手もあるんですが、何か方法を考えてみます。

BtoIrRemoconってプロンプトアプリがあるんですが、うちの環境では何故かうまく動作しないんで、作ってみました。

[C# x86]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.Win32.SafeHandles;
using USB_IR_Library;

namespace IRCommand
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            int i_ret;
            SafeFileHandle handle_usb_device = null;    // USB DEVICEハンドル
            string[] cmds = System.Environment.GetCommandLineArgs();
            byte[] data = new byte[103];
            byte[] code = new byte[100];
            if (cmds.Length > 1)
            {
                for (int i = 0; cmds[1].Length / 2 > i; i++)
                {
                    data[i] = Convert.ToByte(cmds[1].Substring(i * 2, 2), 16);
                }
                int mode = (int)data[0];
                int ilen1 = (int)data[1];
                int ilen2 = (int)data[2];

                for (int i = 0; i < 100; i++)
                {
                    code[i] = data[i + 3];
                }

                try
                {
                    // USB DEVICEオープン
                    handle_usb_device = USBIR.openUSBIR(this.Handle);
                    if (handle_usb_device != null)
                    {
                        // USB DEVICEへ送信 パラメータ[USB DEVICEハンドル、フォーマットタイプ、送信赤外線コード、赤外線コードのビット長]
                        switch (mode)
                        {
                            case 1:
                                i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.AEHA, code, ilen1, ilen2);
                                break;
                            case 2:
                                i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.NEC, code, ilen1, ilen2);
                                break;
                            case 3:
                                i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.SONY, code, ilen1, ilen2);
                                break;
                            case 4:
                                i_ret = USBIR.writeUSBIRex(handle_usb_device, USBIR.IR_FORMAT.MITSUBISHI, code, ilen1, ilen2);
                                break;
                        }
                    }

                }
                catch
                {
                }
                finally
                {
                    if (handle_usb_device != null)
                    {
                        // USB DEVICEクローズ
                        i_ret = USBIR.closeUSBIR(handle_usb_device);
                    }
                }
            }
            Application.Exit();
        }
    }
}

フォームには何も入れない空です。
フォームアプリにしたのは、この先何か追加するかもしてないからです。
これに、赤外線リモコンのアプリで取得したコードを引数で与えると、動作しました。
あとは、アプリからプロセス起動させれば、温度によって、エアコンを入れたり、消したり出来るようになりました。
あと一つ問題は、設置場所です。

ネット上では、赤外線の出力が弱いという噂がありましたが、近づけても動作しない時がありました。

通常砲弾型のLEDの場合、先端から直進する部分が一番出力が強く、角度が付くと、減衰していくんです。

このキットに含まれているLEDは、50% Power Angle が15degなんで、ほぼ直進するはずなんdすけど、離して変な角度のほうが認識率が高い(反射かな)

猛暑が来るまで色々と探ってみます。

ページ移動

コメント

  • コメントはまだありません。

コメント登録

  • コメントを入力してください。
登録フォーム
名前
メールアドレス
URL
コメント
閲覧制限

ユーティリティ

新着コメント

Re:2017ふれまにっ杯募集
2017/01/30 from tatsuru3284
Re:ついに
2016/03/18 from redinpules.stt.TV
Re:ついに
2016/03/17 from Tatsuru
Re:ついに
2016/03/17 from redinpules.stt.TV
Re:県オープンの余韻
2016/02/18 from Tatsuru

過去ログ

Feed