6#include "hal/nrf_saadc.h"
13 if (!adc_is_ready_dt(this->
channel_)) {
14 ESP_LOGE(TAG,
"ADC controller device %s not ready", this->
channel_->dev->name);
18 auto err = adc_channel_setup_dt(this->
channel_);
20 ESP_LOGE(TAG,
"Could not setup channel %s (%d)", this->
channel_->dev->name, err);
25#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
26static const LogString *gain_to_str(
enum adc_gain
gain) {
29 return LOG_STR(
"1/6");
31 return LOG_STR(
"1/5");
33 return LOG_STR(
"1/4");
35 return LOG_STR(
"1/3");
37 return LOG_STR(
"2/5");
39 return LOG_STR(
"1/2");
41 return LOG_STR(
"2/3");
43 return LOG_STR(
"4/5");
67 return LOG_STR(
"128");
69 return LOG_STR(
"undefined gain");
72static const LogString *reference_to_str(
enum adc_reference reference) {
75 return LOG_STR(
"VDD");
77 return LOG_STR(
"VDD/2");
79 return LOG_STR(
"VDD/3");
81 return LOG_STR(
"VDD/4");
82 case ADC_REF_INTERNAL:
83 return LOG_STR(
"INTERNAL");
84 case ADC_REF_EXTERNAL0:
85 return LOG_STR(
"External, input 0");
86 case ADC_REF_EXTERNAL1:
87 return LOG_STR(
"External, input 1");
89 return LOG_STR(
"undefined reference");
92static const LogString *input_to_str(uint8_t input) {
94 case NRF_SAADC_INPUT_AIN0:
95 return LOG_STR(
"AIN0");
96 case NRF_SAADC_INPUT_AIN1:
97 return LOG_STR(
"AIN1");
98 case NRF_SAADC_INPUT_AIN2:
99 return LOG_STR(
"AIN2");
100 case NRF_SAADC_INPUT_AIN3:
101 return LOG_STR(
"AIN3");
102 case NRF_SAADC_INPUT_AIN4:
103 return LOG_STR(
"AIN4");
104 case NRF_SAADC_INPUT_AIN5:
105 return LOG_STR(
"AIN5");
106 case NRF_SAADC_INPUT_AIN6:
107 return LOG_STR(
"AIN6");
108 case NRF_SAADC_INPUT_AIN7:
109 return LOG_STR(
"AIN7");
110 case NRF_SAADC_INPUT_VDD:
111 return LOG_STR(
"VDD");
112 case NRF_SAADC_INPUT_VDDHDIV5:
113 return LOG_STR(
"VDDHDIV5");
117 return LOG_STR(
"undefined input");
122 LOG_SENSOR(
"",
"ADC Sensor",
this);
123 LOG_PIN(
" Pin: ", this->
pin_);
124#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
131 this->
channel_->dev->name, this->channel_->channel_id, this->channel_->vref_mv, this->channel_->resolution,
132 this->channel_->oversampling);
137 " acquisition_time: %d\n"
139 LOG_STR_ARG(gain_to_str(this->
channel_->channel_cfg.gain)),
140 LOG_STR_ARG(reference_to_str(this->
channel_->channel_cfg.reference)),
141 this->channel_->channel_cfg.acquisition_time, YESNO(this->
channel_->channel_cfg.differential));
142 if (this->
channel_->channel_cfg.differential) {
146 LOG_STR_ARG(input_to_str(this->
channel_->channel_cfg.input_positive)),
147 LOG_STR_ARG(input_to_str(this->
channel_->channel_cfg.input_negative)));
149 ESP_LOGV(TAG,
" Positive: %s", LOG_STR_ARG(input_to_str(this->
channel_->channel_cfg.input_positive)));
153 LOG_UPDATE_INTERVAL(
this);
161 struct adc_sequence sequence = {
164 .buffer_size =
sizeof(buf),
168 err = adc_sequence_init_dt(this->
channel_, &sequence);
170 ESP_LOGE(TAG,
"Could sequence init %s (%d)", this->
channel_->dev->name, err);
174 err = adc_read(this->
channel_->dev, &sequence);
176 ESP_LOGE(TAG,
"Could not read %s (%d)", this->
channel_->dev->name, err);
180 val_raw = (int32_t) buf;
181 if (!this->
channel_->channel_cfg.differential) {
187 aggr.add_sample(val_raw);
190 int32_t val_mv = aggr.aggregate();
196 err = adc_raw_to_millivolts_dt(this->
channel_, &val_mv);
199 ESP_LOGE(TAG,
"Value in mV not available %s (%d)", this->
channel_->dev->name, err);
203 return val_mv / 1000.0f;
float sample() override
Perform a single ADC sampling operation and return the measured value.
void setup() override
Set up the ADC sensor by initializing hardware and calibration parameters.
void dump_config() override
Output the configuration details of the ADC sensor for debugging purposes.
SamplingMode sampling_mode_
ESPHOME_LOG_TAG(TAG, "adc")