예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
 /// <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;
 }