SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

C#ではじめるラズパイIoTプログラミング

C#でラズパイに接続した温湿度センサーで計測しよう

C#ではじめるラズパイIoTプログラミング 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

測定

 それでは、実際に測定してみましょう。

測定コマンド

 Sht31クラスの単発測定コマンドを使う場合は、次のようなコードになります。ここでは、気温は小数点第一位まで、湿度は、少数点以下を四捨五入して表示します。

int fd2 = WiringPi.I2CSetup(0x44); // 温湿度センサー用I2C通信の初期化
var sht31 = new Sht31(fd2);
sht31.OneshotCmd();                // 温湿度の測定
Console.WriteLine($"気温:{sht31.Temp:F1} ℃ 湿度:{sht31.Rhum:F0} %");
// 出力例:気温:16.8 ℃ 湿度:57 %

 連続測定モードの場合は、連続測定が開始されると自動的に測定され続けるので、(プログラムの)最後に測定停止コマンドを送信するようにします。例えば、Ctrl+Cキーが押されるまで連続して測定する場合なら、Console.CancelKeyPressイベントを使って、Ctrl+Cが押されたときにループを終了させ、測定を停止するようにします。

static bool Running = true;            // ループ判定フラグ
static void Main(string[] args)
{
    // ctrl+cキーが押されたときに実行される
    Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e) {
        Running = false;
    };
    int fd2 = WiringPi.I2CSetup(0x44); // 温湿度センサー用I2C通信の初期化
    var sht31 = new Sht31(fd2);

    sht31.StartCmd();                  // 温湿度連続測定開始
    while (Running)
    {
        sht31.ReadCmd();               // 温湿度の読み出し
        Console.WriteLine($"気温:{sht31.Temp:F1} ℃ 湿度:{sht31.Rhum:F0} %");
    }
    sht31.StopCmd();                   // 温湿度連続測定停止

ディスプレイモジュールに表示

 前回までに作成したOledSsd1306クラスのSetTextメソッドを使えば、ディスプレイモジュールに温湿度を表示するのは簡単です。例えば、現在時刻と、温湿度、そして温湿度から求められる不快指数を表示するコードは、次のようになります。

[リスト6]Program.csの一部
sht31.StartCmd();             // 温湿度連続測定開始
while (Running)
{
    oled.SetAll();            // 描画データクリア

    var dt = DateTime.Now;    // 現在時刻
    oled.SetText(bf, 0, 0, $"{dt:yyyy年M月d日HH時mm分ss秒}");

    sht31.ReadCmd();          // 温湿度の読み出し
    oled.SetText(bf, 0, 14, $"気温:{sht31.Temp:F1} ℃ 湿度:{sht31.Rhum:F0} %");

    // 不快指数の算出
    var thi = 0.81 * sht31.Temp + 0.01 * sht31.Rhum * (0.99 * sht31.Temp - 14.3) + 46.3;
    oled.SetText(bf, 0, 28, $"不快指数:{thi:F0}");

    oled.SendBuffer();        // 描画データ送信
    Thread.Sleep(20);
}
sht31.StopCmd();              // 温湿度連続測定停止
実行結果
実行結果

最後に

 今回は、温湿度センサーを使って、OLEDディスプレイに測定値を表示してみました。この連載では、GPIOの操作やI2C通信に、WiringPiを使用しましたが、.NET Core用のGPIOライブラリ(System.Device.Gpioなど)もリリースされています。また機会があれば、紹介したいと思います。

参考文献URL

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
C#ではじめるラズパイIoTプログラミング連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11995 2020/02/28 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング