10#ifndef M5_UNIT_ENV_UNIT_BMP280_DATA_HPP
11#define M5_UNIT_ENV_UNIT_BMP280_DATA_HPP
26 uint8_t value[12 * 2]{};
43 } __attribute__((packed));
48constexpr uint32_t NOT_MEASURED{0x800000};
53 inline float temperature(
const int32_t adc_P,
const int32_t adc_T,
const Trimming* t)
55 return t ? compensate_temperature_f(adc_T, *t) : std::numeric_limits<float>::quiet_NaN();
57 inline float pressure(
const int32_t adc_P,
const int32_t adc_T,
const Trimming* t)
60 return std::numeric_limits<float>::quiet_NaN();
63 (void)compensate_temperature_f(adc_T, *t);
65 return compensate_pressure_f(adc_P, *t);
71 int32_t var1{}, var2{};
72 var1 = ((((adc_T >> 3) - ((int32_t)trim.dig_T1 << 1))) * ((int32_t)trim.dig_T2)) >> 11;
73 var2 = (((((adc_T >> 4) - ((int32_t)trim.dig_T1)) * ((adc_T >> 4) - ((int32_t)trim.dig_T1))) >> 12) *
74 ((int32_t)trim.dig_T3)) >>
77 float T =
static_cast<float>((t_fine * 5 + 128) >> 8);
83 int64_t var1{}, var2{}, p{};
84 var1 = ((int64_t)t_fine) - 128000;
85 var2 = var1 * var1 * (int64_t)trim.dig_P6;
86 var2 = var2 + ((var1 * (int64_t)trim.dig_P5) << 17);
87 var2 = var2 + (((int64_t)trim.dig_P4) << 35);
88 var1 = ((var1 * var1 * (int64_t)trim.dig_P3) >> 8) + ((var1 * (int64_t)trim.dig_P2) << 12);
89 var1 = (((((int64_t)1) << 47) + var1)) * ((int64_t)trim.dig_P1) >> 33;
92 p = (((p << 31) - var2) * 3125) / var1;
93 var1 = (((int64_t)trim.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
94 var2 = (((int64_t)trim.dig_P8) * p) >> 19;
95 p = ((p + var1 + var2) >> 8) + (((int64_t)trim.dig_P7) << 4);
101 float compensate_temperature_f(
const int32_t adc_T,
const Trimming& trim)
103 float var1{}, var2{}, T{};
104 var1 = (((float)adc_T) / 16384.0f - ((float)trim.dig_T1) / 1024.0f) * ((
float)trim.dig_T2);
105 var2 = ((((float)adc_T) / 131072.0f - ((float)trim.dig_T1) / 8192.0f) *
106 (((
float)adc_T) / 131072.0f - ((
float)trim.dig_T1) / 8192.0f)) *
107 ((
float)trim.dig_T3);
108 t_fine = (int32_t)(var1 + var2);
109 T = (var1 + var2) / 5120.0f;
113 float compensate_pressure_f(
const int32_t adc_P,
const Trimming& trim)
115 float var1{}, var2{}, P{};
116 var1 = ((float)t_fine / 2.0f) - 64000.0f;
117 var2 = var1 * var1 * ((float)trim.dig_P6) / 32768.0f;
118 var2 = var2 + var1 * ((float)trim.dig_P5) * 2.0f;
119 var2 = (var2 / 4.0f) + (((
float)trim.dig_P4) * 65536.0f);
120 var1 = (((float)trim.dig_P3) * var1 * var1 / 524288.0f + ((float)trim.dig_P2) * var1) / 524288.0f;
121 var1 = (1.0f + var1 / 32768.0f) * ((
float)trim.dig_P1);
125 P = 1048576.0f - (float)adc_P;
126 P = (P - (var2 / 4096.0f)) * 6250.0f / var1;
127 var1 = ((float)trim.dig_P9) * P * P / 2147483648.0f;
128 var2 = P * ((float)trim.dig_P8) / 32768.0f;
129 P = P + (var1 + var2 + ((float)trim.dig_P7)) / 16.0f;
144 std::array<uint8_t, 6>
raw{};
159 int32_t adc_P = (int32_t)(((uint32_t)
raw[0] << 16) | ((uint32_t)
raw[1] << 8) | ((uint32_t)
raw[2]));
160 int32_t adc_T = (int32_t)(((uint32_t)
raw[3] << 16) | ((uint32_t)
raw[4] << 8) | ((uint32_t)
raw[5]));
164 return (adc_T != NOT_MEASURED) ? c.temperature(adc_P >> 4, adc_T >> 4,
trimming)
165 : std::numeric_limits<float>::quiet_NaN();
170 return celsius() * 9.0f / 5.0f + 32.f;
175 int32_t adc_P = (int32_t)(((uint32_t)
raw[0] << 16) | ((uint32_t)
raw[1] << 8) | ((uint32_t)
raw[2]));
176 int32_t adc_T = (int32_t)(((uint32_t)
raw[3] << 16) | ((uint32_t)
raw[4] << 8) | ((uint32_t)
raw[5]));
180 return (adc_T != NOT_MEASURED && adc_P != NOT_MEASURED) ? c.pressure(adc_P >> 4, adc_T >> 4,
trimming)
181 : std::numeric_limits<float>::quiet_NaN();
Top level namespace of M5Stack.
Measurement data group.
Definition unit_BMP280_data.hpp:143
const Trimming * trimming
Points to the owning unit's calibration for compensation.
Definition unit_BMP280_data.hpp:149
float temperature() const
temperature (Celsius)
Definition unit_BMP280_data.hpp:152
float pressure() const
pressure (Pa)
Definition unit_BMP280_data.hpp:173
float fahrenheit() const
temperature (Fahrenheit)
Definition unit_BMP280_data.hpp:168
std::array< uint8_t, 6 > raw
Definition unit_BMP280_data.hpp:144
float celsius() const
temperature (Celsius)
Definition unit_BMP280_data.hpp:157
Trimming parameter.
Definition unit_BMP280_data.hpp:25
float compensate_pressure(const int32_t psr_raw, const int32_t tmp_raw, const coeffs_t &c, const float kp, const float kt)
Compensated pressure (Pa) from raw PSR/TMP readings and scales kP/kT (datasheet 4....
Definition unit_SPA06_data.hpp:164
float compensate_temperature(const int32_t tmp_raw, const coeffs_t &c, const float kt)
Compensated temperature (degC) from a raw TMP reading and scale kT.
Definition unit_SPA06_data.hpp:157