置いてけぼり日記

はてなRSSに追加Add to GoogleMy Yahoo!に追加RSS Feed
「USB温度・湿度測定モジュール」というものを入手した。
http://www2.strawberry-linux.com/products/usbrh/

実際に組んでみた

単に室温を知りたいだけなので、別に100円ショップで買えばよしなんだが……まあ、なんとなく。
実際に使うにはプログラムを組む必要があるのだけども、使えるAPIは結構シンプル。

[DllImport("USBMeter.dll",CharSet = CharSet.Ansi)] public static extern String FindUSB(ref long index);
[DllImport("USBMeter.dll",CharSet = CharSet.Ansi)] public static extern long GetTempHumid(String dev,ref double temp,ref double humid);

ドライバは自動認識・自動インストール、供給されているUSBMeter.dllから上の2つを呼び出せば十分なわけで、

 String USBDEV = ""; // デバイスID
 long USBNUM = 0; // デバイスの数 or インデックス
 double temp = 0; // 温度(度)
 double humid = 0; // 湿度(%)

 USBDEV = FindUSB(ref USBNUM);
 GetTempHumid(USBDEV,ref temp,ref humid);

C#だとこんだけで温度が引っ張れる。
実はサンプルにはVBの場合とVCの場合しか無かったので、あえてC#で挑戦ってことで(笑)
Cサンプルを参考にアンマネージAPIの呼び出し宣言を書いていたのだけど、一部のlongパラメータがそのまま使えずに難儀した。あれこれ試していくうちにintにすればOKってことで落ち着いたが。
諦めかけたりもしたけど、メーカーサイトにあるサンプルアプリの再現はこの通り完成。

メーカーサイトには対応OSはXPと2000と書いてあるが、この通りVistaでも動かせるようになっている。.NET Framework呼び出しも少し工夫すればOKだ。

C#で書いたアプリ

ここまでできればあとは使いたいアプリに組み込むだけさーといいながら、実は温度計アプリ以上にネタはなかったりする(笑)
メーカーから提供される制御API「USBMeter.dll」の内部はブラックボックスであり、提供されているAPI自体もあとはテスト用ヒーターON/OFFとか、基板についているLEDのON/OFFとかしか機能は無い。本当にシンプルな回路なのだ。
以下にC#用に書いたラッパーを置いておくので、興味のある人はいじってみてほしい。もちろん、回路購入は必須です(笑)


  ■使い方
  public USBMeter usbMeter = new USBMeter(); // オブジェクトの初期化
  if(usbMeter.IsUSBMeter()){ // 回路が認識できるか?
    usbMeter.GetData(); // 値を取得
    textBox1.Text = usbMeter.Temp.ToString(); // 温度(℃)
    textBox2.Text = usbMeter.Humid.ToString(); // 湿度(%)
  }


  /// ----------------------------------------------------------------------
  /// <summary>
  /// USBMeter.dll呼び出しクラス
  /// </summary>
  /// ----------------------------------------------------------------------
  public class USBMeter {
    /// ------------------------------------------------------------------
    /// <summary>
    /// モジュールの検索
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern String FindUSB(ref long index);

    /// ------------------------------------------------------------------
    /// <summary>
    /// 温度・湿度の取得
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="temp"></param>
    /// <param name="humid"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long GetTempHumid(String dev,ref double temp,ref double humid);

    /// ------------------------------------------------------------------
    /// <summary>
    /// ヒーターの制御
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="val"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long SetHeater(String dev,int val);

    /// ------------------------------------------------------------------
    /// <summary>
    /// LEDの制御
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="port"></param>
    /// <param name="val"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long ControlIO(String dev,int port,int val);

    /// ------------------------------------------------------------------
    /// <summary>
    /// ファームウェアバージョンの取得
    /// </summary>
    /// <param name="dev"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern string GetVers(String dev);

    /// ------------------------------------------------------------------
    /// <summary>
    /// 温度・湿度の取得(2)
    /// </summary>
    /// <param name="dev"></param>
    /// <param name="temp"></param>
    /// <param name="humid"></param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    [DllImport("USBMeter.dll",CharSet = CharSet.Ansi)]
    public static extern long GetTempHumidTrue(String dev,ref double temp,ref double humid);

    /// <summary>
    /// デバイス名
    /// </summary>
    public String USBDEV = "";

    /// <summary>
    /// FindUSBで取得される数値
    /// </summary>
    public long USBNUM = 0;

    /// <summary>
    /// パラメータ
    /// </summary>
    public struct USBMETER_DATA{
      /// <summary>
      /// 温度
      /// </summary>
      public double temp;

      /// <summary>
      /// 湿度
      /// </summary>
      public double humid;
    }
    public USBMETER_DATA Data;

    public USBMeter() {
      Data.temp = Data.humid = 0;

      USBDEV = "";
      USBNUM = 0;
      try{
        USBDEV = FindUSB(ref USBNUM);
      }catch{
        USBNUM = 0;
        USBDEV = "";
      }
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// USBMeterが有効かどうかのチェック
    /// </summary>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public bool IsUSBMeter() {
      return USBNUM > 0 && USBDEV != "";
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 値を取得する
    /// </summary>
    /// ------------------------------------------------------------------
    public void GetData() {
      GetTempHumid(USBDEV,ref Data.temp,ref Data.humid);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 値を取得する(2)
    /// </summary>
    /// ------------------------------------------------------------------
    public void GetData2() {
      GetTempHumidTrue(USBDEV,ref Data.temp,ref Data.humid);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 温度を取得
    /// </summary>
    /// ------------------------------------------------------------------
    public double Temp {
      get {
        return Data.temp;
      }
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// 湿度を取得
    /// </summary>
    /// ------------------------------------------------------------------
    public double Humid {
      get {
        return Data.humid;
      }
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// ヒーターON/OFF
    /// </summary>
    /// <param name="b">ONならtrue</param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public void SetHeater(bool b) {
      SetHeater(USBDEV,b ? 1 : 0);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// LEDのON/OFF
    /// </summary>
    /// <param name="port">LEDポート 0-1</param>
    /// <param name="b">ONならtrue</param>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public void SetLED(int port,bool b) {
      ControlIO(USBDEV,port,b ? 1 : 0);
    }

    /// ------------------------------------------------------------------
    /// <summary>
    /// ファームウェアバージョン
    /// </summary>
    /// <returns></returns>
    /// ------------------------------------------------------------------
    public string GetVersion() {
      return GetVers(USBDEV);
    }
  }


検索キーワードTOP20