Weather Station V 2.0
気温、気圧、湿度を測定する部屋。
ストーリー
このプロジェクトでは、Raspberry Pi2キットコンポーネント上のWindows10 IoTCore用のAdafruitStarter Packを使用して、センサーを使用して温度と圧力を読み取るプロジェクトを作成します、湿度、高度。
注:キットには2つのバージョンがあり、1つにはBMP280センサーが含まれ、もう1つにはBME280が含まれています。 BMP280をお持ちの場合は、Weather Stationv1プロジェクトhttps://www.hackster.io/windows-iot/weather-station
にアクセスしてください。ハードウェア
以下の「回路図」セクションのフリッツ図に従って、RaspberryPi2をブレッドボードおよびその他のコンポーネントに接続します。
ソフトウェア
コード開始プロジェクトはhttps://github.com/ms-iot/adafruitsampleからダウンロードでき、会話に必要なコードの追加についてご案内します。 Webサービスにアクセスして、ピンをマップに表示します。どの地図ですか?
「Lesson_203v2 \ StartSolution \ lesson_203v2.sln」を開き、mainpage.xaml.csファイルを開きます。
このソリューションの開始点として、いくつかのメソッドを入力しました。先に進みたい場合は、「Lesson_203v2 \ FullSolution \ lesson_203v2.sln」
ですべてのコードを完成させた解決策を見つけることができます。MainPage.xaml.cs
MainPage.xaml.csファイルを開きます。
センサー(BME280)クラスへの参照を追加します。
次に、OnNavigatedToメソッドにコードを追加して、センサー用の新しいBME280オブジェクトを作成し、オブジェクトを初期化します。
//センサーの新しいオブジェクトを作成しますclassBME280 =new BME280Sensor(); //センサーを初期化しますBME280.Initialize();
次に、次のコードを追加します。
- 温度、気圧、湿度、高度を保存する変数を作成します。それらを0に設定します。
- 海面での圧力の変数を作成します。デフォルト値は1013.25hPaです。
- 温度、気圧、湿度、高度を10回読み取り、その値をデバッグコンソールに出力します。
//それらを0に初期化します。floattemp=0; float pressure =0; float altitude =0; floatdensity =0; //海面での圧力の定数を作成します。 //これは地域の海面気圧に基づいています(単位:ヘクトパスカル)const float seaLevelPressure =1022.00f; //データのサンプルを10個読み取ります(int i =0; i <10; i ++){temp =await BME280.ReadTemperature ();圧力=待機BME280.ReadPreasure(); altitude =await BME280.ReadAltitude(seaLevelPressure);湿度=待機BME280.ReadHumidity(); //値をデバッグコンソールに書き込みますDebug.WriteLine( "Temperature:" + temp.ToString()+ "deg C"); Debug.WriteLine( "湿度:" +湿度.ToString()+ "%"); Debug.WriteLine( "Pressure:" + pressure.ToString()+ "Pa"); Debug.WriteLine( "高度:" + altitude.ToString()+ "m"); Debug.WriteLine( "");}
BME280.cs
BME280.csファイルを開きます。
コードの最初の部分は、BME280のさまざまなレジスタのアドレスのリストを作成することです。これらの値は、BMP280データシートに記載されています。
BME280クラスで、レジスタアドレスの列挙型の後に次を追加します。
// I2Cバスコンストのフレンドリ名の文字列stringI2CControllerName ="I2C1"; // I2CデバイスのプライベートI2cDevicebme280 =null; //センサーの新しいキャリブレーションデータを作成BME280_CalibrationDataCalibrationData; / /デバイスが初期化されているかどうかを確認する変数boolinit =false;
次に、Initialize関数に次のコードを追加します。
// BME280センサーを初期化するメソッドpublicasync Task Initialize(){Debug.WriteLine( "BME280 ::Initialize"); try {// BME280のデバイスアドレスを使用してI2CConnectionSettingsをインスタンス化しますI2cConnectionSettingssettings =new I2cConnectionSettings(BME280_Address); //接続のI2Cバス速度を高速モード設定に設定します。BusSpeed=I2cBusSpeed.FastMode; // I2CBusデバイスセレクターを使用して、高度なクエリ構文を作成しますstring string aqs =I2cDevice.GetDeviceSelector(I2CControllerName); // Windows.Devices.Enumeration.DeviceInformationクラスを使用して、高度なクエリ構文文字列を使用してコレクションを作成しますDeviceInformationCollection dis =await DeviceInformation.FindAllAsync(aqs); // I2CBusのデバイスIDとI2CConnectionSettingsを使用してBME280I2Cデバイスをインスタンス化しますbme280 =await I2cDevice.FromIdAsync(dis [0] .Id、settings); //デバイスが見つかったかどうかを確認if(bme280 ==null){Debug.WriteLine( "デバイスが見つかりません"); }} catch(Exception e){Debug.WriteLine( "Exception:" + e.Message + "\ n" + e.StackTrace);投げる; }}
Begin関数に次のコードを追加します。
次の2つの関数に次のコードを追加して、制御レジスタに書き込みます。
次のコードをReadUInt16_LittleEndian関数に追加して:
//レジスタから16ビット値を読み取り、リトルエンディアン形式で返すメソッドprivate UInt16 ReadUInt16_LittleEndian(byte register){UInt16 value =0; byte [] writeBuffer =new byte [] {0x00}; byte [] readBuffer =new byte [] {0x00、0x00}; writeBuffer [0] =レジスタ; bmp280.WriteRead(writeBuffer、readBuffer); int h =readBuffer [1] <<8; int l =readBuffer [0];値=(UInt16)(h + l);戻り値;}
次のコードをReadByte関数に追加して、レジスタから8ビットデータを読み取ります。
//レジスタから8ビット値を読み取るメソッドプライベートバイトReadByte(byte register){byte value =0; byte [] writeBuffer =new byte [] {0x00}; byte [] readBuffer =new byte [] {0x00}; writeBuffer [0] =レジスタ; bmp280.WriteRead(writeBuffer、readBuffer);値=readBuffer [0];戻り値;}
次の3つの機能が自動的に実行されます。これらの関数を作成するために必要な情報は、データシートに記載されています。
ReadCoefficeints:これは、すべてのキャリブレーションデータがレジスタアドレスから読み取られる関数です。
BMP280_compensate_T_double:この関数では、摂氏での温度は、BMP280データシートの補正式を使用して計算されます。
BMP280_compensate_P_Int64:この関数では、Paの圧力は、BMP280データシートの補正式を使用して計算されます。
次のコードを追加して、ReadTemperature関数を完成させます。
public async TaskReadTemperature(){//(!init)await Begin();の場合、I2Cデバイスが初期化されていることを確認します。 // BMP280レジスタからMSB、LSB、および温度のビット7:4(XLSB)を読み取りますbyte tmsb =ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_MSB);バイトtlsb =ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_LSB);バイトtxlsb =ReadByte((byte)eRegisters.BMP280_REGISTER_TEMPDATA_XLSB); //ビット7:4 //値を32ビット整数に結合しますInt32t =(tmsb <<12)+(tlsb <<4)+(txlsb>> 4); //生の値をdegCの温度に変換しますdoubletemp =BMP280_compensate_T_double(t); //温度をfloat値として返しますreturn(float)temp;}
同じ手順を繰り返して、ReadPressure関数を完了します。
public async TaskReadPreasure(){// I2Cデバイスが初期化されていることを確認しますif(!init)await Begin(); //最初に温度を読み取り、補正のためにt_fine値をロードしますif(t_fine ==Int32.MinValue){await ReadTemperature(); } // BMP280レジスタから圧力のMSB、LSB、およびビット7:4(XLSB)を読み取りますbyte tmsb =ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_MSB);バイトtlsb =ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_LSB);バイトtxlsb =ReadByte((byte)eRegisters.BMP280_REGISTER_PRESSUREDATA_XLSB); //ビット7:4 //値を32ビット整数に結合しますInt32t =(tmsb <<12)+(tlsb <<4)+(txlsb>> 4); //生の値をPaInt64の圧力に変換しますpres =BMP280_compensate_P_Int64(t); //温度をfloat値として返しますreturn((float)pres)/ 256;}
最後にReadAltitude関数を完了します:
// Hectopascals(hPa)の海面気圧をパラメーターとして取得し、現在の気圧を使用して高度を計算する方法。publicasyncTaskReadAltitude(float seaLevel){//確認してください(!init)await Begin();の場合、I2Cデバイスは初期化されます。 //最初に圧力を読み取りますfloatpressure =await ReadPreasure(); //圧力をHectopascals(hPa)圧力に変換します/ =100; //国際気圧式を使用して高度を計算して返しますreturn44330.0f *(1.0f-(float)Math.Pow((pressure / seaLevel)、0.1903f));}
これで、プロジェクトをデプロイする準備が整いました!
期待される出力
温度:24.46189℃
湿度:54.372%
圧力:99738.73 Pa
高度:205.1726 m
出典: Weather Station V 2.0
製造プロセス