/
uFire_SHT20.cpp
128 lines (112 loc) · 2.98 KB
/
uFire_SHT20.cpp
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
#include "uFire_SHT20.h"
bool uFire_SHT20::begin(uint8_t resolution, uint8_t address, TwoWire &wirePort)
{
_address = address;
_resolution = resolution;
_i2cPort = &wirePort;
return connected();
}
void uFire_SHT20::_reset()
{
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_RESET);
_i2cPort->endTransmission();
delay(SOFT_RESET_DELAY);
_onchip_heater = _DISABLE_ONCHIP_HEATER;
_otp_reload = _DISABLE_OTP_RELOAD;
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_READ_USER_REG);
_i2cPort->endTransmission();
_i2cPort->requestFrom(SHT20_I2C, 1);
uint8_t config = _i2cPort->read();
config = ((config & _RESERVED_BITMASK) | _resolution | _onchip_heater | _otp_reload);
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_WRITE_USER_REG);
_i2cPort->write(config);
_i2cPort->endTransmission();
}
void uFire_SHT20::measure_all()
{
// also measures temp/humidity
vpd();
dew_point();
}
float uFire_SHT20::temperature()
{
_reset();
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_TEMP);
_i2cPort->endTransmission();
delay(TEMPERATURE_DELAY);
_i2cPort->requestFrom(SHT20_I2C, 2);
uint8_t msb = _i2cPort->read();
uint8_t lsb = _i2cPort->read();
uint16_t value = msb << 8 | lsb;
tempC = value * (175.72 / 65536.0)- 46.85;
tempF = ((value * (175.72 / 65536.0)- 46.85) * 1.8) + 32;
return tempC;
}
float uFire_SHT20::temperature_f()
{
_reset();
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_TEMP);
_i2cPort->endTransmission();
delay(TEMPERATURE_DELAY);
_i2cPort->requestFrom(SHT20_I2C, 2);
uint8_t msb = _i2cPort->read();
uint8_t lsb = _i2cPort->read();
uint16_t value = msb << 8 | lsb;
tempC = value * (175.72 / 65536.0)- 46.85;
tempF = ((value * (175.72 / 65536.0)- 46.85) * 1.8) + 32;
return tempF;
}
float uFire_SHT20::humidity()
{
_reset();
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_HUMID);
_i2cPort->endTransmission();
delay(HUMIDITY_DELAY);
_i2cPort->requestFrom(SHT20_I2C, 2);
uint8_t msb = _i2cPort->read();
uint8_t lsb = _i2cPort->read();
uint16_t value = msb << 8 | lsb;
RH = value * (125.0 / 65536.0) - 6.0;
return RH;
}
float uFire_SHT20::vpd()
{
temperature();
humidity();
float es = 0.6108 * exp(17.27 * tempC / (tempC + 237.3));
float ae = RH / 100 * es;
vpd_kPa = es - ae;
return vpd_kPa;
}
float uFire_SHT20::dew_point()
{
temperature();
humidity();
float tem = -1.0 * tempC;
float esdp = 6.112 * exp(-1.0 * 17.67 * tem / (243.5 - tem));
float ed = RH / 100.0 * esdp;
float eln = log(ed / 6.112);
dew_pointC = -243.5 * eln / (eln - 17.67 );
dew_pointF = (dew_pointC * 1.8) + 32;
return dew_pointC;
}
bool uFire_SHT20::connected()
{
_i2cPort->beginTransmission(SHT20_I2C);
_i2cPort->write(SHT20_READ_USER_REG);
_i2cPort->endTransmission();
_i2cPort->requestFrom(SHT20_I2C, 1);
uint8_t config = _i2cPort->read();
if (config != 0xFF) {
return true;
}
else {
return false;
}
}