-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsht3xdis.cpp
102 lines (77 loc) · 2.46 KB
/
sht3xdis.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
// Copyright: 2021, Diez B. Roggisch, Berlin, all rights reserved
#include "deets/i2c/sht3xdis.hpp"
#include "deets/i2c.hpp"
#include <array>
namespace deets::i2c {
namespace sht3xdis {
namespace {
const auto MEASUREMENT_TIME = 20; // ms, according to datasheet, 15. I add a bit extra.
// the underscore is needed due to a name collision
const auto STATUS_ = std::array<uint8_t, 2>{0xF3, 0x2D};
const auto MEASUREMENT = std::array<uint8_t, 2>{0x24, 0x00};
const auto RESET = std::array<uint8_t, 2>{0x30, 0xA2};
const auto CLEAR = std::array<uint8_t, 2>{0x30, 0x41};
} // namespace
bool SHT3XDIS::valid_address(uint8_t address)
{
return address == 0x44 || address == 0x45;
}
SHT3XDIS::SHT3XDIS(I2C &bus, uint8_t address)
: _bus(bus)
, _address(address)
{
}
float SHT3XDIS::raw2humidity(uint16_t humidity)
{
return float(float(humidity) * 100 / 65535.0);
}
float SHT3XDIS::raw2temperature(uint16_t temperature)
{
return float(float(temperature) * 175.0 / 65535.0 - 45.0);
}
RawValues SHT3XDIS::raw_values()
{
auto lock = _bus.lock();
while(_bus.write_buffer_to_address(_address, MEASUREMENT.data(), MEASUREMENT.size()) == ESP_ERR_TIMEOUT) {}
vTaskDelay(MEASUREMENT_TIME / portTICK_PERIOD_MS);
std::array<uint8_t, 6> buffer;
while(_bus.read_from_address_into_buffer(_address, buffer.data(), buffer.size()) == ESP_ERR_TIMEOUT) {}
const auto temp = uint16_t(buffer[0] << 8 | buffer[1]);
const auto humidity = uint16_t(buffer[3] << 8 | buffer[4]);
return { humidity, temp };
}
Values SHT3XDIS::values()
{
const auto raw = raw_values();
return {
raw2humidity(raw.humidity),
raw2temperature(raw.temperature)
};
}
void SHT3XDIS::reset()
{
auto lock = _bus.lock();
while(_bus.write_buffer_to_address(_address, RESET.data(), RESET.size()) == ESP_ERR_TIMEOUT) {}
}
void SHT3XDIS::clear()
{
auto lock = _bus.lock();
while(_bus.write_buffer_to_address(_address, CLEAR.data(), CLEAR.size()) == ESP_ERR_TIMEOUT) {}
}
uint16_t SHT3XDIS::status()
{
auto lock = _bus.lock();
while(_bus.write_buffer_to_address(_address, STATUS_.data(), STATUS_.size()) == ESP_ERR_TIMEOUT) {}
std::array<uint8_t, 3> buffer;
while(_bus.read_from_address_into_buffer(_address, buffer.data(), buffer.size()) == ESP_ERR_TIMEOUT) {}
return buffer[0] << 8 | buffer[1];
}
Values Values::from_raw(const RawValues &raw)
{
return Values {
SHT3XDIS::raw2humidity(raw.humidity),
SHT3XDIS::raw2temperature(raw.temperature)
};
}
} // namespace sht3xdis
} // namespace deets::i2c