ESPHome 2026.5.0b1
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
7static const char *const 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();
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();
62 return;
63 }
64 this->prev_config_ = config;
65}
67 ESP_LOGCONFIG(TAG, "ADS1115:");
68 LOG_I2C_DEVICE(this);
69 if (this->is_failed()) {
70 ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
71 }
72}
75 uint16_t config = this->prev_config_;
76 // Multiplexer
77 // 0bxBBBxxxxxxxxxxxx
78 config &= 0b1000111111111111;
79 config |= (multiplexer & 0b111) << 12;
80
81 // Gain
82 // 0bxxxxBBBxxxxxxxxx
83 config &= 0b1111000111111111;
84 config |= (gain & 0b111) << 9;
85
86 // Sample rate
87 // 0bxxxxxxxxBBBxxxxx
88 config &= 0b1111111100011111;
89 config |= (samplerate & 0b111) << 5;
90
91 if (!this->continuous_mode_) {
92 // Start conversion
93 config |= 0b1000000000000000;
94 }
95
96 if (!this->continuous_mode_ || this->prev_config_ != config) {
97 if (!this->write_byte_16(ADS1115_REGISTER_CONFIG, config)) {
98 this->status_set_warning();
99 return NAN;
100 }
101 this->prev_config_ = config;
102
103 // Delay calculated as: ceil((1000/SPS)+.5)
105 switch (samplerate) {
106 case ADS1115_8SPS:
107 delay(9);
108 break;
109 case ADS1115_16SPS:
110 delay(5);
111 break;
112 case ADS1115_32SPS:
113 delay(3);
114 break;
115 case ADS1115_64SPS:
116 case ADS1115_128SPS:
117 delay(2);
118 break;
119 default:
120 delay(1);
121 break;
122 }
123 } else {
124 switch (samplerate) {
125 case ADS1115_8SPS:
126 delay(126); // NOLINT
127 break;
128 case ADS1115_16SPS:
129 delay(63); // NOLINT
130 break;
131 case ADS1115_32SPS:
132 delay(32);
133 break;
134 case ADS1115_64SPS:
135 delay(17);
136 break;
137 case ADS1115_128SPS:
138 delay(9);
139 break;
140 case ADS1115_250SPS:
141 delay(5);
142 break;
143 case ADS1115_475SPS:
144 delay(3);
145 break;
146 case ADS1115_860SPS:
147 delay(2);
148 break;
149 }
150 }
151
152 // in continuous mode, conversion will always be running, rely on the delay
153 // to ensure conversion is taking place with the correct settings
154 // can we use the rdy pin to trigger when a conversion is done?
155 if (!this->continuous_mode_) {
156 uint32_t start = millis();
157 while (this->read_byte_16(ADS1115_REGISTER_CONFIG, &config) && (config >> 15) == 0) {
158 if (millis() - start > 100) {
159 ESP_LOGW(TAG, "Reading ADS1115 timed out");
160 this->status_set_warning();
161 return NAN;
162 }
163 yield();
164 }
165 }
166 }
167
168 uint16_t raw_conversion;
169 if (!this->read_byte_16(ADS1115_REGISTER_CONVERSION, &raw_conversion)) {
170 this->status_set_warning();
171 return NAN;
172 }
173
175 // ADS1015 returns 12-bit value left-justified in 16 bits; shift right and sign-extend
176 raw_conversion = static_cast<uint16_t>(static_cast<int16_t>(raw_conversion) >> (16 - ADS1015_12_BITS));
177 }
178
179 auto signed_conversion = static_cast<int16_t>(raw_conversion);
180
181 float millivolts;
182 float divider = (resolution == ADS1115_16_BITS) ? 32768.0f : 2048.0f;
183 switch (gain) {
185 millivolts = (signed_conversion * 6144) / divider;
186 break;
188 millivolts = (signed_conversion * 4096) / divider;
189 break;
191 millivolts = (signed_conversion * 2048) / divider;
192 break;
194 millivolts = (signed_conversion * 1024) / divider;
195 break;
197 millivolts = (signed_conversion * 512) / divider;
198 break;
200 millivolts = (signed_conversion * 256) / divider;
201 break;
202 default:
203 millivolts = NAN;
204 }
205
206 this->status_clear_warning();
207 return millivolts / 1e3f;
208}
209
210} // namespace esphome::ads1115
void mark_failed()
Mark this component as failed.
bool is_failed() const
Definition component.h:284
void status_clear_warning()
Definition component.h:306
float request_measurement(ADS1115Multiplexer multiplexer, ADS1115Gain gain, ADS1115Resolution resolution, ADS1115Samplerate samplerate)
Helper method to request a measurement from a sensor.
Definition ads1115.cpp:73
bool read_byte_16(uint8_t a_register, uint16_t *data)
Definition i2c.h:249
bool write_byte_16(uint8_t a_register, uint16_t data) const
Definition i2c.h:267
void yield(void)
AlsGain501 gain
Resolution resolution
Definition msa3xx.h:1
@ ADS1115_MULTIPLEXER_P0_N1
Definition ads1115.h:11
void HOT delay(uint32_t ms)
Definition hal.cpp:82
uint32_t IRAM_ATTR HOT millis()
Definition hal.cpp:28
static void uint32_t