ESPHome 2026.6.0-dev
Loading...
Searching...
No Matches
ads1118.cpp
Go to the documentation of this file.
1#include "ads1118.h"
3#include "esphome/core/log.h"
4
5namespace esphome::ads1118 {
6
7static const char *const TAG = "ads1118";
8static const uint8_t ADS1118_DATA_RATE_860_SPS = 0b111;
9
11 this->spi_setup();
12
13 this->config_ = 0;
14 // Setup multiplexer
15 // 0bx000xxxxxxxxxxxx
17
18 // Setup Gain
19 // 0bxxxx000xxxxxxxxx
20 this->config_ |= ADS1118_GAIN_6P144 << 9;
21
22 // Set singleshot mode
23 // 0bxxxxxxx1xxxxxxxx
24 this->config_ |= 0b0000000100000000;
25
26 // Set data rate - 860 samples per second (we're in singleshot mode)
27 // 0bxxxxxxxx100xxxxx
28 this->config_ |= ADS1118_DATA_RATE_860_SPS << 5;
29
30 // Set temperature sensor mode - ADC
31 // 0bxxxxxxxxxxx0xxxx
32 this->config_ |= 0b0000000000000000;
33
34 // Set DOUT pull up - enable
35 // 0bxxxxxxxxxxxx0xxx
36 this->config_ |= 0b0000000000001000;
37
38 // NOP - must be 01
39 // 0bxxxxxxxxxxxxx01x
40 this->config_ |= 0b0000000000000010;
41
42 // Not used - can be 0 or 1, lets be positive
43 // 0bxxxxxxxxxxxxxxx1
44 this->config_ |= 0b0000000000000001;
45}
46
48 ESP_LOGCONFIG(TAG, "ADS1118:");
49 LOG_PIN(" CS Pin:", this->cs_);
50}
51
52float ADS1118::request_measurement(ADS1118Multiplexer multiplexer, ADS1118Gain gain, bool temperature_mode) {
53 uint16_t temp_config = this->config_;
54 // Multiplexer
55 // 0bxBBBxxxxxxxxxxxx
56 temp_config &= 0b1000111111111111;
57 temp_config |= (multiplexer & 0b111) << 12;
58
59 // Gain
60 // 0bxxxxBBBxxxxxxxxx
61 temp_config &= 0b1111000111111111;
62 temp_config |= (gain & 0b111) << 9;
63
64 if (temperature_mode) {
65 // Set temperature sensor mode
66 // 0bxxxxxxxxxxx1xxxx
67 temp_config |= 0b0000000000010000;
68 } else {
69 // Set ADC mode
70 // 0bxxxxxxxxxxx0xxxx
71 temp_config &= 0b1111111111101111;
72 }
73
74 // Start conversion
75 temp_config |= 0b1000000000000000;
76
77 this->enable();
78 this->write_byte16(temp_config);
79 this->disable();
80
81 // about 1.2 ms with 860 samples per second
82 delay(2);
83
84 this->enable();
85 uint8_t adc_first_byte = this->read_byte();
86 uint8_t adc_second_byte = this->read_byte();
87 this->disable();
88 uint16_t raw_conversion = encode_uint16(adc_first_byte, adc_second_byte);
89
90 auto signed_conversion = static_cast<int16_t>(raw_conversion);
91
92 if (temperature_mode) {
93 return (signed_conversion >> 2) * 0.03125f;
94 } else {
95 float millivolts;
96 float divider = 32768.0f;
97 switch (gain) {
99 millivolts = (signed_conversion * 6144) / divider;
100 break;
102 millivolts = (signed_conversion * 4096) / divider;
103 break;
105 millivolts = (signed_conversion * 2048) / divider;
106 break;
108 millivolts = (signed_conversion * 1024) / divider;
109 break;
111 millivolts = (signed_conversion * 512) / divider;
112 break;
114 millivolts = (signed_conversion * 256) / divider;
115 break;
116 default:
117 millivolts = NAN;
118 }
119
120 return millivolts / 1e3f;
121 }
122}
123
124} // namespace esphome::ads1118
void setup() override
Definition ads1118.cpp:10
float request_measurement(ADS1118Multiplexer multiplexer, ADS1118Gain gain, bool temperature_mode)
Helper method to request a measurement from a sensor.
Definition ads1118.cpp:52
void dump_config() override
Definition ads1118.cpp:47
AlsGain501 gain
@ ADS1118_MULTIPLEXER_P0_NG
Definition ads1118.h:14
constexpr uint16_t encode_uint16(uint8_t msb, uint8_t lsb)
Encode a 16-bit value given the most and least significant byte.
Definition helpers.h:859
void HOT delay(uint32_t ms)
Definition hal.cpp:85