センサーから環境条件を読み取る

IoT デバイスの最も一般的なシナリオの 1 つは、環境条件の検出です。 温度、湿度、気圧などを監視するために、さまざまなセンサーを利用できます。

このトピックでは、.NET を使用してセンサーから環境条件を読み取ります。

前提条件

  • ARM ベース (ARMv7 以降) シングルボード コンピューター (SBC)
  • BME280 湿度/気圧/温度センサー ブレークアウト
  • ジャンパー ワイヤ
  • ブレッドボード (省略可能)
  • Raspberry Pi GPIO ブレークアウト基板 (省略可能)
  • .NET SDK 7 以降

注意

このチュートリアルは、ターゲット デバイスを Raspberry Pi と想定して記述されています。 ただし、このチュートリアルは、Orange Pi や ODROID など、.NET をサポートしているあらゆる Linux ベースの SBC に利用できます。

重要

BME280 ブレークアウトの製造元は多数あります。 ほとんどの設計は類似しており、製造元が異なる機能を用意することはないはずです。 このチュートリアルでは、バリエーションを考慮しようと努めています。 お使いの BME280 ブレークアウトに、Inter-Integrated Circuit (I2C) インターフェイスが含まれていることを確実にします。

BME280 ブレークアウトなどのコンポーネントは通常、はんだ付けされていないピン ヘッダー付きで販売されています。 はんだ付けが不快に感じられる場合は、はんだ付きヘッダーまたは別のコネクタを使用して BME280 ブレイクアウト ボードを探します。 必要に応じて、はんだ付けする方法を学ぶことを検討してください。 ここでは、はんだ付けするに関する初心者向けの方法をお知らせします

SBC の準備

次のサービスがサポートされるように SBC を必ず構成してください。

  • SSH
  • I2C

大抵のデバイスでは、追加の構成を必要としません。 Raspberry Pi については、raspi-config コマンドを使用します。 raspi-config の詳細については、Raspberry Pi のドキュメントを参照してください。

ハードウェアを準備する

ハードウェア コンポーネントを使用して、次の図に示すような回路を構築します。

Raspberry Pi から BME280 ブレークアウト基板への接続を示す Fritzing 図

Raspberry Pi から BME280 ブレークアウトへの接続を次に示します。 ピンのラベルは、各種 BME280 ブレークアウトによって異なる点に注意してください。

Raspberry Pi BME280 ブレークアウト Color
3.3V VIN/3V3
接地 GND black
SDA (GPIO 2) SDI/SDA blue
SCL (GPIO 3) SCK/SCL orange

必要に応じて、次のピン配列図を参照してください。

Raspberry Pi GPIO ヘッダーのピン配列を示す図。画像提供: Raspberry Pi Foundation。
画像提供: Raspberry Pi Foundation

ヒント

GPIO ヘッダーへの接続を効率化するには、ブレッドボードと組み合わせた GPIO ブレークアウト ボードを使用することをお勧めします。

アプリを作成する

お好みの開発環境で、次の手順を実行します。

  1. .NET CLI または Visual Studio を使用して、新しい .NET コンソール アプリを作成します。 「SensorTutorial」という名前を指定します。

    dotnet new console -o SensorTutorial
    cd SensorTutorial
    
  2. プロジェクトに Iot.Device.Bindings パッケージを追加します。 プロジェクト ディレクトリまたは Visual Studio から .NET CLI を使用します。

    dotnet add package Iot.Device.Bindings --version 2.2.0-*
    
  3. Program.cs の内容を次のコードで置き換えます。

    using System;
    using System.Device.I2c;
    using System.Threading;
    using Iot.Device.Bmxx80;
    using Iot.Device.Bmxx80.PowerMode;
    
    var i2cSettings = new I2cConnectionSettings(1, Bme280.DefaultI2cAddress);
    using I2cDevice i2cDevice = I2cDevice.Create(i2cSettings);
    using var bme280 = new Bme280(i2cDevice);
    
    int measurementTime = bme280.GetMeasurementDuration();
    
    while (true)
    {
        Console.Clear();
    
        bme280.SetPowerMode(Bmx280PowerMode.Forced);
        Thread.Sleep(measurementTime);
    
        bme280.TryReadTemperature(out var tempValue);
        bme280.TryReadPressure(out var preValue);
        bme280.TryReadHumidity(out var humValue);
        bme280.TryReadAltitude(out var altValue);
    
        Console.WriteLine($"Temperature: {tempValue.DegreesCelsius:0.#}\u00B0C");
        Console.WriteLine($"Pressure: {preValue.Hectopascals:#.##} hPa");
        Console.WriteLine($"Relative humidity: {humValue.Percent:#.##}%");
        Console.WriteLine($"Estimated altitude: {altValue.Meters:#} m");
    
        Thread.Sleep(1000);
    }
    

    上のコードでは以下の操作が行われます。

    • i2cSettingsI2cConnectionSettings の新しいインスタンスに設定されます。 コンストラクターによって、busId パラメーターが 1 に、deviceAddress パラメーターが Bme280.DefaultI2cAddress に設定されます。

      重要

      一部の BME280 ブレークアウト製造元では、第 2 のアドレス値が使用されます。 そのようなデバイスに対しては、Bme280.SecondaryI2cAddress を使用します。

    • using 宣言により、I2cDevice.Create を呼び出して i2cSettings を渡すことによって、I2cDevice のインスタンスが作成されます。 この I2cDevice は、I2C バスを表しています。 この using 宣言により、オブジェクトが破棄され、ハードウェア リソースが適切に解放されます。

    • 別の using 宣言によって、センサーを表す Bme280 のインスタンスが作成されます。 I2cDevice は、コンストラクターで渡されます。

    • チップがチップの現在 (既定) の設定で測定を行うために必要な時間は、GetMeasurementDuration を呼び出すことによって取得されます。

    • while ループが無期限に実行されます。 それぞれの反復処理で、以下が実行されます。

      1. コンソールをクリアします。

      2. 電源モードを Bmx280PowerMode.Forced に設定します。 これにより、チップで 1 つの測定が実行され、その結果が格納されて、スリープ状態になります。

      3. 温度、気圧、湿度、および高度の値を読み取ります。

        注意

        高度はデバイスのバインドによって計算されます。 この TryReadAltitude のオーバーロードでは、平均海面気圧を使用して推定値が生成されます。

      4. 現在の環境条件をコンソールに書き込みます。

      5. 1000 ミリ秒スリープします。

  4. アプリをビルドします。 .NET CLI を使用している場合は、dotnet build を実行します。 Visual Studio でビルドするには、Ctrl+Shift+B キーを押します。

  5. アプリを自己完結型アプリとして SBC にデプロイします。 手順については、「Raspberry Pi への .NET アプリのデプロイ」を参照してください。 chmod +x を使用して実行可能ファイルの 実行 アクセス許可を指定してください。

  6. 配置ディレクトリに切り替え、実行可能ファイルを実行することで、Raspberry Pi でアプリを実行します。

    ./SensorTutorial
    

    コンソールでセンサーの出力を観察します。

  7. Ctrl + C キーを押してプログラムを終了します。

おめでとうございます。 I2C を使用して、気温、湿度、気圧のセンサーから値を読み取ることができました。

ソース コードを入手する

このチュートリアルのソースは、GitHub から入手できます

次のステップ