ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
ads1115.cpp
Go to the documentation of this file.
1#include "ads1115.h"
2#include "esphome/core/hal.h"
3#include "esphome/core/log.h"
4
5namespace esphome::ads1115 {
6
7ESPHOME_LOG_TAG(TAG, "ads1115");
8static const uint8_t ADS1115_REGISTER_CONVERSION = 0x00;
9static const uint8_t ADS1115_REGISTER_CONFIG = 0x01;
10
12 uint16_t value;
13 if (!this->read_byte_16(ADS1115_REGISTER_CONVERSION, &value)) {
14 this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL));
15 return;
16 }
17
18 uint16_t config = 0;
19 // Clear single-shot bit
20 // 0b0xxxxxxxxxxxxxxx
21 config |= 0b0000000000000000;
22 // Setup multiplexer
23 // 0bx000xxxxxxxxxxxx
24 config |= ADS1115_MULTIPLEXER_P0_N1 << 12;
25
26 // Setup Gain
27 // 0bxxxx000xxxxxxxxx
28 config |= ADS1115_GAIN_6P144 << 9;
29
30 if (this->continuous_mode_) {
31 // Set continuous mode
32 // 0bxxxxxxx0xxxxxxxx
33 config |= 0b0000000000000000;
34 } else {
35 // Set singleshot mode
36 // 0bxxxxxxx1xxxxxxxx
37 config |= 0b0000000100000000;
38 }
39
40 // Set data rate - 860 samples per second
41 // 0bxxxxxxxx100xxxxx
42 config |= ADS1115_860SPS << 5;
43
44 // Set comparator mode - hysteresis
45 // 0bxxxxxxxxxxx0xxxx
46 config |= 0b0000000000000000;
47
48 // Set comparator polarity - active low
49 // 0bxxxxxxxxxxxx0xxx
50 config |= 0b0000000000000000;
51
52 // Set comparator latch enabled - false
53 // 0bxxxxxxxxxxxxx0xx
54 config |= 0b0000000000000000;
55
56 // Set comparator que mode - disabled
57 // 0bxxxxxxxxxxxxxx11
58 config |= 0b0000000000000011;
59
60 if (!this->write_byte_16(ADS1115_REGISTER_CONFIG, config)) {
61 this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL));
62 return;
63 }
64 this->prev_config_ = config;
65}
67 ESP_LOGCONFIG(TAG, "ADS1115:");
68 LOG_I2C_DEVICE(this);
69}
72 uint16_t config = this->prev_config_;
73 // Multiplexer
74 // 0bxBBBxxxxxxxxxxxx
75 config &= 0b1000111111111111;
76 config |= (multiplexer & 0b111) << 12;
77
78 // Gain
79 // 0bxxxxBBBxxxxxxxxx
80 config &= 0b1111000111111111;
81 config |= (gain & 0b111) << 9;
82
83 // Sample rate
84 // 0bxxxxxxxxBBBxxxxx
85 config &= 0b1111111100011111;
86 config |= (samplerate & 0b111) << 5;
87
88 if (!this->continuous_mode_) {
89 // Start conversion
90 config |= 0b1000000000000000;
91 }
92
93 if (!this->continuous_mode_ || this->prev_config_ != config) {
94 if (!this->write_byte_16(ADS1115_REGISTER_CONFIG, config)) {
95 this->status_set_warning();
96 return NAN;
97 }
98 this->prev_config_ = config;
99
100 // Delay calculated as: ceil((1000/SPS)+.5)
102 switch (samplerate) {
103 case ADS1115_8SPS:
104 delay(9);
105 break;
106 case ADS1115_16SPS:
107 delay(5);
108 break;
109 case ADS1115_32SPS:
110 delay(3);
111 break;
112 case ADS1115_64SPS:
113 case ADS1115_128SPS:
114 delay(2);
115 break;
116 default:
117 delay(1);
118 break;
119 }
120 } else {
121 switch (samplerate) {
122 case ADS1115_8SPS:
123 delay(126); // NOLINT
124 break;
125 case ADS1115_16SPS:
126 delay(63); // NOLINT
127 break;
128 case ADS1115_32SPS:
129 delay(32);
130 break;
131 case ADS1115_64SPS:
132 delay(17);
133 break;
134 case ADS1115_128SPS:
135 delay(9);
136 break;
137 case ADS1115_250SPS:
138 delay(5);
139 break;
140 case ADS1115_475SPS:
141 delay(3);
142 break;
143 case ADS1115_860SPS:
144 delay(2);
145 break;
146 }
147 }
148
149 // in continuous mode, conversion will always be running, rely on the delay
150 // to ensure conversion is taking place with the correct settings
151 // can we use the rdy pin to trigger when a conversion is done?
152 if (!this->continuous_mode_) {
153 uint32_t start = millis();
154 while (this->read_byte_16(ADS1115_REGISTER_CONFIG, &config) && (config >> 15) == 0) {
155 if (millis() - start > 100) {
156 ESP_LOGW(TAG, "Reading ADS1115 timed out");
157 this->status_set_warning();
158 return NAN;
159 }
160 yield();
161 }
162 }
163 }
164
165 uint16_t raw_conversion;
166 if (!this->read_byte_16(ADS1115_REGISTER_CONVERSION, &raw_conversion)) {
167 this->status_set_warning();
168 return NAN;
169 }
170
172 // ADS1015 returns 12-bit value left-justified in 16 bits; shift right and sign-extend
173 raw_conversion = static_cast<uint16_t>(static_cast<int16_t>(raw_conversion) >> (16 - ADS1015_12_BITS));
174 }
175
176 auto signed_conversion = static_cast<int16_t>(raw_conversion);
177
178 float millivolts;
179 float divider = (resolution == ADS1115_16_BITS) ? 32768.0f : 2048.0f;
180 switch (gain) {
182 millivolts = (signed_conversion * 6144) / divider;
183 break;
185 millivolts = (signed_conversion * 4096) / divider;
186 break;
188 millivolts = (signed_conversion * 2048) / divider;
189 break;
191 millivolts = (signed_conversion * 1024) / divider;
192 break;
194 millivolts = (signed_conversion * 512) / divider;
195 break;
197 millivolts = (signed_conversion * 256) / divider;
198 break;
199 default:
200 millivolts = NAN;
201 }
202
203 this->status_clear_warning();
204 return millivolts / 1e3f;
205}
206
207} // namespace esphome::ads1115
void mark_failed()
Mark this component as failed.
void status_clear_warning()
Definition component.h:296
float request_measurement(ADS1115Multiplexer multiplexer, ADS1115Gain gain, ADS1115Resolution resolution, ADS1115Samplerate samplerate)
Helper method to request a measurement from a sensor.
Definition ads1115.cpp:70
bool read_byte_16(uint8_t a_register, uint16_t *data)
Definition i2c.h:281
bool write_byte_16(uint8_t a_register, uint16_t data) const
Definition i2c.cpp:101
void yield(void)
AlsGain501 gain
Resolution resolution
Definition msa3xx.h:1
ESPHOME_LOG_TAG(TAG, "ads1115")
@ ADS1115_MULTIPLEXER_P0_N1
Definition ads1115.h:11
void HOT delay(uint32_t ms)
Definition hal.cpp:85
uint32_t IRAM_ATTR HOT millis()
Definition hal.cpp:25
static void uint32_t