19
19
#define BH1750_ONE_TIME_LOW_RES_MODE 0x23 // Start measurement at 1lx resolution. Measurement time is approx 120ms.
20
20
// Device is automatically set to Power Down after measurement.
21
21
22
- class BH1750Sensor : public I2CSensor <> {
22
+ static constexpr bool bh1750_is_mode2 (unsigned char mode) {
23
+ return (mode == BH1750_CONTINUOUS_HIGH_RES_MODE_2) || (mode == BH1750_ONE_TIME_HIGH_RES_MODE_2);
24
+ }
23
25
26
+ class BH1750Sensor : public I2CSensor <> {
24
27
public:
25
28
26
29
void setMode (unsigned char mode) {
@@ -48,7 +51,9 @@ class BH1750Sensor : public I2CSensor<> {
48
51
// Initialization method, must be idempotent
49
52
void begin () override {
50
53
51
- if (!_dirty) return ;
54
+ if (!_dirty) {
55
+ return ;
56
+ }
52
57
53
58
// I2C auto-discover
54
59
static constexpr uint8_t addresses[] {0x23 , 0x5C };
@@ -90,10 +95,18 @@ class BH1750Sensor : public I2CSensor<> {
90
95
return 0 ;
91
96
}
92
97
98
+ // Number of decimals for a unit (or -1 for default)
99
+ signed char decimals (espurna::sensor::Unit unit) const {
100
+ if (bh1750_is_mode2 (_mode)) {
101
+ return 2 ;
102
+ }
103
+
104
+ return 1 ;
105
+ }
106
+
93
107
protected:
94
108
95
109
double _read (uint8_t address) {
96
-
97
110
// For one-shot modes reconfigure sensor & wait for conversion
98
111
if (_run_configure) {
99
112
@@ -108,7 +121,7 @@ class BH1750Sensor : public I2CSensor<> {
108
121
espurna::duration::Milliseconds { (_mode & 0x02 ) ? 24 : 180 });
109
122
110
123
// Keep on running configure each time if one-shot mode
111
- _run_configure = _mode & 0x20 ;
124
+ _run_configure = ( _mode & 0x20 ) > 0 ;
112
125
113
126
}
114
127
@@ -119,12 +132,16 @@ class BH1750Sensor : public I2CSensor<> {
119
132
return 0 ;
120
133
}
121
134
122
- return ((double ) level) / 1.2 ;
135
+ // When using HIGH Mode2, value is halved
136
+ const auto multiplier = bh1750_is_mode2 (_mode) ? 0.5 : 1.0 ;
123
137
138
+ // TODO also * MTreg?
139
+ return ((double )level / 1.2 ) * multiplier;
124
140
}
125
141
126
142
unsigned char _mode;
127
143
bool _run_configure = false ;
144
+
128
145
double _lux = 0 ;
129
146
130
147
};
0 commit comments