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