This repository has been archived by the owner on Jan 7, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 39
/
bme280_data_impl_double.hpp
145 lines (110 loc) · 3.53 KB
/
bme280_data_impl_double.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// coding: utf-8
/* Copyright (c) 2016, Roboterclub Aachen e. V.
* All Rights Reserved.
*
* The file is part of the xpcc library and is released under the 3-clause BSD
* license. See the file `LICENSE` for the full license governing this code.
*/
// ----------------------------------------------------------------------------
#include <stdio.h>
#include <cmath>
#include <xpcc/debug/logger/logger.hpp>
#ifndef XPCC_BME280_DATA_HPP
# error "Don't include this file directly, use 'bme280_data.hpp' instead!"
#endif
#undef XPCC_LOG_LEVEL
#define XPCC_LOG_LEVEL xpcc::log::DISABLED
namespace xpcc {
namespace bme280data {
// Double precision implementation
void
DataDouble::calculateCalibratedTemperature()
{
// Temperature value is expected to be received in 20 bit format,
// positive, stored in a 32 bit signed integer.
int32_t adc = (((int32_t(raw[3])) << 16) | (raw[4] << 8) | (raw[5] << 0));
adc >>= 4;
double adc_16384 = double(adc) / double(16384.0);
double adc_131072 = double(adc) / double(131072.0);
double T1_1024 = double(calibration.T1) / double(1024.0);
double T1_8192 = double(calibration.T1) / double(8192.0);
double T2 = double(calibration.T2);
double T3 = double(calibration.T3);
// double var1, var2, T;
double var1 = (adc_16384 - T1_1024) * T2;
double var2 = ((adc_131072 - T1_8192) * (adc_131072 - T1_8192)) * T3;
t_fine = var1 + var2;
calibratedTemperatureDouble = (var1 + var2) / double(5120.0);
XPCC_LOG_DEBUG.printf("T dp = %4.2f\n", calibratedTemperatureDouble);
meta |= TEMPERATURE_CALCULATED;
}
void
DataDouble::calculateCalibratedPressure()
{
// Before pressure can be calculated, temperature must be.
if (not (meta & TEMPERATURE_CALCULATED)) {
calculateCalibratedTemperature();
}
int32_t adc = (((int32_t(raw[0])) << 16) | (raw[1] << 8) | (raw[2] << 0));
adc >>= 4;
double P1 = double(calibration.P1);
double P2 = double(calibration.P2);
double P3 = double(calibration.P3);
double P4 = double(calibration.P4);
double P5 = double(calibration.P5);
double P6 = double(calibration.P6);
double P7 = double(calibration.P7);
double P8 = double(calibration.P8);
double P9 = double(calibration.P9);
double var1 = (t_fine / double(2.0)) - double(64000.0);
double var2 = var1 * var1 * P6 / double(32768.0);
var2 = var2 + var1 * P5 * double(2.0);
var2 = var2 / double(4.0) + (P4 * double(65636.0));
var1 = (P3 * var1 * var1 / double(524288.0) + P2 * var1) / double(524288.0);
var1 = (double(1.0) + var1 / double(32768.0)) * P1;
if (var1 == 0.0) {
calibratedPressureDouble = double(0.0);
return;
}
double p = double(1048576.0) - double(adc);
p = (p - (var2 / double(4096.0))) * double(6250.0) / var1;
var1 = P9 * p * p / double(2147483648.0);
var2 = p * P8 / double(32768.0);
p = p + (var1 + var2 + P7) / double(16.0);
calibratedPressureDouble = p;
meta |= PRESSURE_CALCULATED;
}
int32_t
DataDouble::getTemperature()
{
if (not (meta & TEMPERATURE_CALCULATED)) {
calculateCalibratedTemperature();
}
return lrint(calibratedTemperatureDouble * double(100.0));
}
void
DataDouble::getTemperature(float &temp)
{
if (not (meta & TEMPERATURE_CALCULATED)) {
calculateCalibratedTemperature();
}
temp = float(calibratedTemperatureDouble);
}
void
DataDouble::getTemperature(double &temp)
{
if (not (meta & TEMPERATURE_CALCULATED)) {
calculateCalibratedTemperature();
}
temp = calibratedTemperatureDouble;
}
int32_t
DataDouble::getPressure()
{
if (not (meta & PRESSURE_CALCULATED)) {
calculateCalibratedPressure();
}
return lrint(calibratedPressureDouble);
}
} // bme280 namespace
} // xpcc namespace