センサーから環境条件を読み取る
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 ブレークアウトへの接続を次に示します。 ピンのラベルは、各種 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 Foundation。
ヒント
GPIO ヘッダーへの接続を効率化するには、ブレッドボードと組み合わせた GPIO ブレークアウト ボードを使用することをお勧めします。
アプリを作成する
お好みの開発環境で、次の手順を実行します。
.NET CLI または Visual Studio を使用して、新しい .NET コンソール アプリを作成します。 「SensorTutorial」という名前を指定します。
dotnet new console -o SensorTutorial cd SensorTutorial
プロジェクトに Iot.Device.Bindings パッケージを追加します。 プロジェクト ディレクトリまたは Visual Studio から .NET CLI を使用します。
dotnet add package Iot.Device.Bindings --version 2.2.0-*
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); }
上のコードでは以下の操作が行われます。
i2cSettings
がI2cConnectionSettings
の新しいインスタンスに設定されます。 コンストラクターによって、busId
パラメーターが 1 に、deviceAddress
パラメーターがBme280.DefaultI2cAddress
に設定されます。重要
一部の BME280 ブレークアウト製造元では、第 2 のアドレス値が使用されます。 そのようなデバイスに対しては、
Bme280.SecondaryI2cAddress
を使用します。using 宣言により、
I2cDevice.Create
を呼び出してi2cSettings
を渡すことによって、I2cDevice
のインスタンスが作成されます。 このI2cDevice
は、I2C バスを表しています。 このusing
宣言により、オブジェクトが破棄され、ハードウェア リソースが適切に解放されます。別の
using
宣言によって、センサーを表すBme280
のインスタンスが作成されます。I2cDevice
は、コンストラクターで渡されます。チップがチップの現在 (既定) の設定で測定を行うために必要な時間は、
GetMeasurementDuration
を呼び出すことによって取得されます。while
ループが無期限に実行されます。 それぞれの反復処理で、以下が実行されます。コンソールをクリアします。
電源モードを
Bmx280PowerMode.Forced
に設定します。 これにより、チップで 1 つの測定が実行され、その結果が格納されて、スリープ状態になります。温度、気圧、湿度、および高度の値を読み取ります。
注意
高度はデバイスのバインドによって計算されます。 この
TryReadAltitude
のオーバーロードでは、平均海面気圧を使用して推定値が生成されます。現在の環境条件をコンソールに書き込みます。
1000 ミリ秒スリープします。
アプリをビルドします。 .NET CLI を使用している場合は、
dotnet build
を実行します。 Visual Studio でビルドするには、Ctrl+Shift+B キーを押します。アプリを自己完結型アプリとして SBC にデプロイします。 手順については、「Raspberry Pi への .NET アプリのデプロイ」を参照してください。
chmod +x
を使用して実行可能ファイルの 実行 アクセス許可を指定してください。配置ディレクトリに切り替え、実行可能ファイルを実行することで、Raspberry Pi でアプリを実行します。
./SensorTutorial
コンソールでセンサーの出力を観察します。
Ctrl + C キーを押してプログラムを終了します。
おめでとうございます。 I2C を使用して、気温、湿度、気圧のセンサーから値を読み取ることができました。
ソース コードを入手する
このチュートリアルのソースは、GitHub から入手できます。
次のステップ
.NET