測定
それでは、実際に測定してみましょう。
測定コマンド
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など)もリリースされています。また機会があれば、紹介したいと思います。
