置いてけぼり日記

はてな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);
    }
  }


GoogleはTwitterのランキング特別扱いしている?
http://www.sem-r.com/google09/20090430150112.html

インデックス化をしていく上でたまたま相性がよいってことなのですかね。
twitterは特定ユーザーへのリプライはリンクで結んでいくけど、会話が加熱していけば、あるコミュニティ内で網の目のようにリンクが結ばれていくわけだ。
それが同一テーマであればあるほど、内部リンクが密になればなるほど、Googleからすれば重要な内容であると判断して順位が上がっていくと……?
なんとなくだけど、そんな感じなのかな。

そういう意味では、ブログなんかも同じ環境が自然にできあがるはずなんだけど……でもほら、ブログってもうアレですし。

検索キーワードTOP20