public async Task <BMP180SensorData> ReadSensorDataAsync(BMP180AccuracyMode oss) { this.CheckState(); Debug.WriteLine("BMP180@{0:X} - Read Sensor Data", this.I2cAddress); // Read the Uncompestated values from the sensor. byte[] tData = await ReadUncompestatedTemperature(); byte[] pData = await ReadUncompestatedPressure(oss); int ut = (tData[0] << 8) + tData[1]; double up = (pData[0] * 256.0) + pData[1] + (pData[2] / 256.0); // Calculate real values int b5 = calculateB5(ut); int t = (b5 + 8) >> 4; //double temperature = t / 10.0; double temperature = (double)t / 10.0; double s = temperature - 25.0; double x = (x2 * Math.Pow(s, 2)) + (x1 * s) + x0; double y = (y2 * Math.Pow(s, 2)) + (y1 * s) + y0; double z = (up - x) / y; double pressure = (p2 * Math.Pow(z, 2)) + (p1 * z) + p0; return(new BMP180SensorData(temperature, pressure, tData, pData, oss)); }
public async Task <byte[]> ReadUncompestatedPressure(BMP180AccuracyMode ossMode) { this.CheckState(); byte pressureCommand = 0; int delay = 5; switch (ossMode) { case BMP180AccuracyMode.UltraLowPower: pressureCommand = (byte)BMP180Commands.ReadPressureLowAccuracy; delay = 5; break; case BMP180AccuracyMode.Standard: pressureCommand = (byte)BMP180Commands.ReadPressureStandardAccuracy; delay = 8; break; case BMP180AccuracyMode.HighResolution: pressureCommand = (byte)BMP180Commands.ReadPressureHighAccuracy; delay = 14; break; case BMP180AccuracyMode.UltraHighResolution: pressureCommand = (byte)BMP180Commands.ReadPressureUltraHighAccuracy; delay = 26; break; } Debug.WriteLine("BMP180@{0:X} - Read Uncompensated Pressure {1:X} with mode {2:X}.", this.I2cAddress, pressureCommand, ossMode); byte[] command = { (byte)BMP180Registers.Command, pressureCommand }; this.bmp180I2c.Write(command); await Task.Delay(delay); return(WriteRead(BMP180Registers.Result, 3)); }
/// <summary> /// /// </summary> /// <param name="Temperature"></param> /// <param name="Pressure"></param> /// <param name="UncompensatedTemperature"></param> /// <param name="UncompensatedPressure"></param> public BMP180SensorData(double temperature, double pressure, byte[] uncompensatedTemperature, byte[] uncompensatedPressure, BMP180AccuracyMode mode) { // Remove 11 degrees for heat offset from RPI. // Probably more after case is installed. this.Temperature = temperature - 11.0; this.Pressure = pressure; this.UncompensatedTemperature = uncompensatedTemperature; this.UncompensatedPressure = uncompensatedPressure; this.AccuracyMode = mode; this.PressureAtSeaLevelHpa = 1013.25; }