private void CalcBarometricPressure(DateTimeOffset timestamp, byte[] data) { // this code implements the algorithm in T5400 data sheet at // http://processors.wiki.ti.com/index.php/SensorTag_User_Guide#Barometric_Pressure_Sensor if (this.c != null) { BarometerMeasurement measurement = new BarometerMeasurement(); //more info about the calculation: //http://www.epcos.com/web/generator/Web/Sections/ProductCatalog/Sensors/PressureSensors/T5400-ApplicationNote,property=Data__en.pdf;/T5400_ApplicationNote.pdf int tr = BitConverter.ToInt16(data, 0); // Temperature raw value int pr = BitConverter.ToUInt16(data, 2); // Pressure raw value from sensor // Temperature actual value in unit centi degrees celsius double t_a = (100 * (c[0] * tr / Math.Pow(2, 8) + c[1] * Math.Pow(2, 6))) / Math.Pow(2, 16); double sensitivity = c[2] + c[3] * tr / Math.Pow(2, 17) + ((c[4] * tr / Math.Pow(2, 15)) * tr) / Math.Pow(2, 19); double offset = c[5] * Math.Pow(2, 14) + c[6] * tr / Math.Pow(2, 3) + ((c[7] * tr / Math.Pow(2, 15)) * tr) / Math.Pow(2, 4); measurement.Pascals = (sensitivity * pr + offset) / Math.Pow(2, 14); OnBarometerMeasurementValueChanged(new BarometerMeasurementEventArgs(measurement, timestamp)); } }
protected override void OnCharacteristicValueChanged(GattCharacteristic sender, GattValueChangedEventArgs eventArgs) { if (sender.Uuid == BarometerCharacteristicUuid) { if (_barometerValueChanged != null) { uint dataLength = eventArgs.CharacteristicValue.Length; using (DataReader reader = DataReader.FromBuffer(eventArgs.CharacteristicValue)) { if (dataLength == 4) { // version 1 var data = new byte[dataLength]; reader.ReadBytes(data); CalcBarometricPressure(eventArgs.Timestamp, data); } else if (dataLength == 6) { // version 2 uint temp = ReadBigEndianU24bit(reader); uint pressure = ReadBigEndianU24bit(reader); BarometerMeasurement measurement = new BarometerMeasurement(); measurement.Temperature = (double)temp / 100.0; measurement.HectoPascals = (double)pressure / 100.0; OnBarometerMeasurementValueChanged(new BarometerMeasurementEventArgs(measurement, eventArgs.Timestamp)); } } } } else if (sender.Uuid == BarometerCharacteristicCalibrationUuid) { UpdateCalibrationData(eventArgs); } }
public BarometerMeasurementEventArgs(BarometerMeasurement measurement, DateTimeOffset timestamp) { Measurement = measurement; Timestamp = timestamp; }