測定
それでは、実際に測定してみましょう。
測定コマンド
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メソッドを使えば、ディスプレイモジュールに温湿度を表示するのは簡単です。例えば、現在時刻と、温湿度、そして温湿度から求められる不快指数を表示するコードは、次のようになります。
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など)もリリースされています。また機会があれば、紹介したいと思います。