6#include "hal/nrf_saadc.h"
10static const char *
const TAG =
"adc.zephyr";
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");
115 return LOG_STR(
"undefined input");
120 LOG_SENSOR(
"",
"ADC Sensor",
this);
121 LOG_PIN(
" Pin: ", this->
pin_);
122#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
129 this->
channel_->dev->name, this->channel_->channel_id, this->channel_->vref_mv, this->channel_->resolution,
130 this->channel_->oversampling);
135 " acquisition_time: %d\n"
137 LOG_STR_ARG(gain_to_str(this->
channel_->channel_cfg.gain)),
138 LOG_STR_ARG(reference_to_str(this->
channel_->channel_cfg.reference)),
139 this->channel_->channel_cfg.acquisition_time, YESNO(this->
channel_->channel_cfg.differential));
140 if (this->
channel_->channel_cfg.differential) {
144 LOG_STR_ARG(input_to_str(this->
channel_->channel_cfg.input_positive)),
145 LOG_STR_ARG(input_to_str(this->
channel_->channel_cfg.input_negative)));
147 ESP_LOGV(TAG,
" Positive: %s", LOG_STR_ARG(input_to_str(this->
channel_->channel_cfg.input_positive)));
151 LOG_UPDATE_INTERVAL(
this);
159 struct adc_sequence sequence = {
162 .buffer_size =
sizeof(buf),
166 err = adc_sequence_init_dt(this->
channel_, &sequence);
168 ESP_LOGE(TAG,
"Could sequence init %s (%d)", this->
channel_->dev->name, err);
172 err = adc_read(this->
channel_->dev, &sequence);
174 ESP_LOGE(TAG,
"Could not read %s (%d)", this->
channel_->dev->name, err);
178 val_raw = (int32_t) buf;
179 if (!this->
channel_->channel_cfg.differential) {
185 aggr.add_sample(val_raw);
188 int32_t val_mv = aggr.aggregate();
194 err = adc_raw_to_millivolts_dt(this->
channel_, &val_mv);
197 ESP_LOGE(TAG,
"Value in mV not available %s (%d)", this->
channel_->dev->name, err);
201 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_