/
OPT3001.h
82 lines (68 loc) · 3.02 KB
/
OPT3001.h
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
#include "esphome.h"
#include "ClosedCube_OPT3001.h"
using namespace esphome;
class MyOPT3001 : public PollingComponent {
public:
ClosedCube_OPT3001 myself;
Sensor *sensor_status = new Sensor();
Sensor *manufacturer_id_sensor = new Sensor();
Sensor *device_id_sensor = new Sensor();
Sensor *lux_sensor = new Sensor();
Sensor *high_limit_sensor = new Sensor();
Sensor *low_limit_sensor = new Sensor();
// Update every 5s (value in ms)
MyOPT3001() : PollingComponent(5000) { }
void setup() override {
// myself.initSHT20(); // Init SHT20 Sensor
myself.begin(0x44);
delay(100);
configureSensor();
delay(100);
// myself.checkSHT20(); // Check SHT20 Sensor
myself.readManufacturerID();
myself.readDeviceID();
}
// Most of this copied from https://github.com/closedcube/ClosedCube_OPT3001_Arduino/blob/master/examples/opt3001demo/opt3001demo.ino
// I have no real idea what I'm doing.
void configureSensor() {
OPT3001_Config newConfig;
newConfig.RangeNumber = B1100;
newConfig.ConvertionTime = B0;
newConfig.Latch = B1;
newConfig.ModeOfConversionOperation = B11;
OPT3001_ErrorCode errorConfig = myself.writeConfig(newConfig);
if (errorConfig)
ESP_LOGD("error","OPT3001 configuration %i", errorConfig);
else {
OPT3001_Config sensorConfig = myself.readConfig();
ESP_LOGD("config","OPT3001 Current Config:");
ESP_LOGD("config","------------------------------");
ESP_LOGD("config","Conversion ready (R): %i", sensorConfig.ConversionReady);
ESP_LOGD("config","Conversion time (R/W): %i", sensorConfig.ConvertionTime);
ESP_LOGD("config","Fault count field (R/W): %i", sensorConfig.FaultCount);
ESP_LOGD("config","Flag high field (R-only): %i", sensorConfig.FlagHigh);
ESP_LOGD("config","Flag low field (R-only): %i", sensorConfig.FlagLow);
ESP_LOGD("config","Latch field (R/W): %i", sensorConfig.Latch);
ESP_LOGD("config","Mask exponent field (R/W): %i", sensorConfig.MaskExponent);
ESP_LOGD("config","Mode of conversion operation (R/W): %i", sensorConfig.ModeOfConversionOperation);
ESP_LOGD("config","Polarity field (R/W): %i", sensorConfig.Polarity);
ESP_LOGD("config","Overflow flag (R-only): %i", sensorConfig.OverflowFlag);
ESP_LOGD("config","Range number (R/W): %i", sensorConfig.RangeNumber);
ESP_LOGD("config","------------------------------");
}
u_short manufacturer_id = myself.readManufacturerID();
manufacturer_id_sensor->publish_state(manufacturer_id);
u_short device_id = myself.readDeviceID();
device_id_sensor->publish_state(device_id);
u_short high_limit = myself.readHighLimit().lux;
high_limit_sensor->publish_state(high_limit);
u_short low_limit = myself.readLowLimit().lux;
low_limit_sensor->publish_state(low_limit);
u_short error_code = myself.readResult().error;
}
void update() override {
ESP_LOGD("update", "Sending update");
int lux_level = myself.readResult().lux;
lux_sensor->publish_state(lux_level);
}
};