8 static const char *
const TAG =
"ads1115";
9 static const uint8_t ADS1115_REGISTER_CONVERSION = 0x00;
10 static const uint8_t ADS1115_REGISTER_CONFIG = 0x01;
12 static const uint8_t ADS1115_DATA_RATE_860_SPS = 0b111;
15 ESP_LOGCONFIG(TAG,
"Setting up ADS1115...");
17 if (!this->
read_byte_16(ADS1115_REGISTER_CONVERSION, &value)) {
24 config |= 0b0000000000000000;
36 config |= 0b0000000000000000;
40 config |= 0b0000000100000000;
45 config |= ADS1115_DATA_RATE_860_SPS << 5;
49 config |= 0b0000000000000000;
53 config |= 0b0000000000000000;
57 config |= 0b0000000000000000;
61 config |= 0b0000000000000011;
70 ESP_LOGCONFIG(TAG,
"Setting up ADS1115...");
73 ESP_LOGE(TAG,
"Communication with ADS1115 failed!");
76 for (
auto *sensor : this->
sensors_) {
77 LOG_SENSOR(
" ",
"Sensor", sensor);
78 ESP_LOGCONFIG(TAG,
" Multiplexer: %u", sensor->get_multiplexer());
79 ESP_LOGCONFIG(TAG,
" Gain: %u", sensor->get_gain());
86 config &= 0b1000111111111111;
91 config &= 0b1111000111111111;
92 config |= (sensor->
get_gain() & 0b111) << 9;
96 config |= 0b1000000000000000;
113 uint32_t start =
millis();
114 while (this->
read_byte_16(ADS1115_REGISTER_CONFIG, &config) && (config >> 15) == 0) {
115 if (
millis() - start > 100) {
116 ESP_LOGW(TAG,
"Reading ADS1115 timed out");
125 uint16_t raw_conversion;
126 if (!this->
read_byte_16(ADS1115_REGISTER_CONVERSION, &raw_conversion)) {
130 auto signed_conversion =
static_cast<int16_t
>(raw_conversion);
135 millivolts = signed_conversion * 0.187500f;
138 millivolts = signed_conversion * 0.125000f;
141 millivolts = signed_conversion * 0.062500f;
144 millivolts = signed_conversion * 0.031250f;
147 millivolts = signed_conversion * 0.015625f;
150 millivolts = signed_conversion * 0.007813f;
157 return millivolts / 1e3f;
162 float v = this->parent_->request_measurement(
this);
163 if (!std::isnan(v)) {
164 ESP_LOGD(TAG,
"'%s': Got Voltage=%fV", this->get_name().c_str(), v);
165 this->publish_state(v);
bool read_byte_16(uint8_t a_register, uint16_t *data)
uint8_t get_multiplexer() const
float request_measurement(ADS1115Sensor *sensor)
Helper method to request a measurement from a sensor.
uint32_t IRAM_ATTR HOT millis()
Internal holder class that is in instance of Sensor so that the hub can create individual sensors...
void dump_config() override
void status_clear_warning()
void status_set_warning()
void IRAM_ATTR HOT yield()
std::vector< ADS1115Sensor * > sensors_
virtual void mark_failed()
Mark this component as failed.
void setup() override
Set up the internal sensor array.
bool write_byte_16(uint8_t a_register, uint16_t data)
void IRAM_ATTR HOT delay(uint32_t ms)