1-Wire and ENS210 driver stack
ENS210_Result.cpp
Go to the documentation of this file.
1 /**
2  * @file ENS210_Result.cpp
3  * @brief ENS210 measurement-result helper implementation.
4  *
5  * @par References
6  * Vendor-provided Arduino driver:
7  * https://github.com/sciosense/ENS210_driver (2020-04-06, v3).
8  *
9  * @par Update history
10  * - 27-October-2023 Dave Nadler Initial version.
11  */
12 
13 #include "ENS210_Result.hpp"
14 
15 float ENS210_Result_T::TempKelvin() const
16 {
17  float t = rawTemperature;
18  // Return m*K. This equals m*(t/64) = (m*t)/64
19  // Note m is the multiplier, K is temperature in Kelvin, t is raw t_data value.
20  // Uses K=t/64.
21  return t/64; //IDIV(t,64);
22 }
23 float ENS210_Result_T::TempCelsius() const
24 {
25  //assert( (1<=multiplier) && (multiplier<=1024) );
26  float t= rawTemperature;
27  // Return m*C. This equals m*(K-273.15) = m*K - 27315*m/100 = m*t/64 - 27315*m/100
28  // Note m is the multiplier, C is temperature in Celsius, K is temperature in Kelvin, t is rawTemperature.
29  // Uses C=K-273.15 and K=t/64.
30  return t/64 - 273.15F; //IDIV(t,64) - IDIV(27315L,100);
31 }
32 float ENS210_Result_T::TempFahrenheit() const
33 {
34  float t= rawTemperature & 0xFFFF;
35  // Return m*F. This equals m*(1.8*(K-273.15)+32) = m*(1.8*K-273.15*1.8+32) = 1.8*m*K-459.67*m = 9*m*K/5 - 45967*m/100 = 9*m*t/320 - 45967*m/100
36  // Note m is the multiplier, F is temperature in Fahrenheit, K is temperature in Kelvin, t is rawTemperature.
37  // Uses F=1.8*(K-273.15)+32 and K=t/64.
38  return 9*t/320 - 45967/100.0F; //IDIV(9*t,320) - IDIV(45967L,100);
39  // The first multiplication stays below 32 bits (t:16, multiplier:11, 9:4)
40  // The second multiplication stays below 32 bits (multiplier:10, 45967:16)
41 }
43 {
44  float h= rawHumidity;
45  // Return m*H. This equals m*(h/512) = (m*h)/512
46  // Note m is the multiplier, H is the relative humidity in %RH, h is raw h_data value.
47  // Uses H=h/512.
48  return h/512; //IDIV(h, 512);
49 }
51 {
52  const float MOLAR_MASS_OF_WATER = 18.01534F;
53  const float UNIVERSAL_GAS_CONSTANT = 8.21447215F;
54  //taken from https://carnotcycle.wordpress.com/2012/08/04/how-to-convert-relative-humidity-to-absolute-humidity/
55  //precision is about 0.1°C in range -30 to 35°C
56  //August-Roche-Magnus 6.1094 exp(17.625 x T)/(T + 243.04)
57  //Buck (1981) 6.1121 exp(17.502 x T)/(T + 240.97)
58  //reference https://www.eas.ualberta.ca/jdwilson/EAS372_13/Vomel_CIRES_satvpformulae.html // Use Buck (1981)
59  float degreesC = TempCelsius();
60  return (6.1121F * std::pow(2.718281828F,(17.67F* degreesC)/(degreesC + 243.5F)) *
61  HumidityPercent() *MOLAR_MASS_OF_WATER)/((273.15F+ degreesC )*UNIVERSAL_GAS_CONSTANT);
62 }
63 
64 #include <stdio.h> // diagnostic printf only
65 void ENS210_Result_T::DiagPrintf() const {
66  if(status != Status_OK)
67  printf("ENS210: Bogus status =%d\n", status);
68  else
69  printf("ENS210: Temperature degreesCx10 = %d (%.0fF), Humidityx10=%d\n", TempCelsiusX10(), (double)TempFahrenheit(), HumidityPercentX10());
70 }
float AbsoluteHumidityPercent() const
Fetch relative humidity % x10, ie 395 means 39.5% relative humidity.
uint16_t rawHumidity
relative humidity in 1/512RH (ie a value of 51200 means 100% relative humidity)
float HumidityPercent() const
Fetch relative humidity 0% to 100.0%.
The value was read, the CRC matches, and data is valid.
ENS210 measurement-result types and conversion helpers.
uint16_t rawTemperature
temperature in 1/64 Kelvin, corrected for solder offset