6 #ifdef USE_ADC_SENSOR_VCC 15 #include <hardware/adc.h> 21 static const char *
const TAG =
"adc";
25 static const adc_bits_width_t ADC_WIDTH_MAX_SOC_BITS =
static_cast<adc_bits_width_t
>(ADC_WIDTH_MAX - 1);
27 #ifndef SOC_ADC_RTC_MAX_BITWIDTH 28 #if USE_ESP32_VARIANT_ESP32S2 29 static const int SOC_ADC_RTC_MAX_BITWIDTH = 13;
31 static const int SOC_ADC_RTC_MAX_BITWIDTH = 12;
35 static const int ADC_MAX = (1 << SOC_ADC_RTC_MAX_BITWIDTH) - 1;
36 static const int ADC_HALF = (1 << SOC_ADC_RTC_MAX_BITWIDTH) >> 1;
44 ESP_LOGCONFIG(TAG,
"Setting up ADC '%s'...", this->
get_name().c_str());
45 #if !defined(USE_ADC_SENSOR_VCC) && !defined(USE_RP2040) 50 adc1_config_width(ADC_WIDTH_MAX_SOC_BITS);
56 for (
int i = 0; i < (int) ADC_ATTEN_MAX; i++) {
57 auto cal_value = esp_adc_cal_characterize(ADC_UNIT_1, (adc_atten_t) i, ADC_WIDTH_MAX_SOC_BITS,
61 case ESP_ADC_CAL_VAL_EFUSE_VREF:
62 ESP_LOGV(TAG,
"Using eFuse Vref for calibration");
64 case ESP_ADC_CAL_VAL_EFUSE_TP:
65 ESP_LOGV(TAG,
"Using two-point eFuse Vref for calibration");
67 case ESP_ADC_CAL_VAL_DEFAULT_VREF:
76 static bool initialized =
false;
83 ESP_LOGCONFIG(TAG,
"ADC '%s' setup finished!", this->
get_name().c_str());
87 LOG_SENSOR(
"",
"ADC Sensor",
this);
89 #ifdef USE_ADC_SENSOR_VCC 90 ESP_LOGCONFIG(TAG,
" Pin: VCC");
92 LOG_PIN(
" Pin: ",
pin_);
97 LOG_PIN(
" Pin: ",
pin_);
99 ESP_LOGCONFIG(TAG,
" Attenuation: auto");
103 ESP_LOGCONFIG(TAG,
" Attenuation: 0db");
105 case ADC_ATTEN_DB_2_5:
106 ESP_LOGCONFIG(TAG,
" Attenuation: 2.5db");
109 ESP_LOGCONFIG(TAG,
" Attenuation: 6db");
111 case ADC_ATTEN_DB_11:
112 ESP_LOGCONFIG(TAG,
" Attenuation: 11db");
121 ESP_LOGCONFIG(TAG,
" Pin: Temperature");
123 LOG_PIN(
" Pin: ",
pin_);
126 LOG_UPDATE_INTERVAL(
this);
131 float value_v = this->
sample();
132 ESP_LOGV(TAG,
"'%s': Got voltage=%.4fV", this->
get_name().c_str(), value_v);
138 #ifdef USE_ADC_SENSOR_VCC 139 int raw = ESP.getVcc();
146 return raw / 1024.0f;
164 int raw11, raw6 = ADC_MAX, raw2 = ADC_MAX, raw0 = ADC_MAX;
165 adc1_config_channel_atten(
channel_, ADC_ATTEN_DB_11);
167 if (raw11 < ADC_MAX) {
168 adc1_config_channel_atten(
channel_, ADC_ATTEN_DB_6);
170 if (raw6 < ADC_MAX) {
171 adc1_config_channel_atten(
channel_, ADC_ATTEN_DB_2_5);
173 if (raw2 < ADC_MAX) {
174 adc1_config_channel_atten(
channel_, ADC_ATTEN_DB_0);
180 if (raw0 == -1 || raw2 == -1 || raw6 == -1 || raw11 == -1) {
184 uint32_t mv11 = esp_adc_cal_raw_to_voltage(raw11, &
cal_characteristics_[(
int) ADC_ATTEN_DB_11]);
190 uint32_t c11 = std::min(raw11, ADC_HALF);
191 uint32_t c6 = ADC_HALF - std::abs(raw6 - ADC_HALF);
192 uint32_t c2 = ADC_HALF - std::abs(raw2 - ADC_HALF);
193 uint32_t c0 = std::min(ADC_MAX - raw0, ADC_HALF);
195 uint32_t csum = c11 + c6 + c2 + c0;
198 uint32_t mv_scaled = (mv11 * c11) + (mv6 * c6) + (mv2 * c2) + (mv0 * c0);
199 return mv_scaled / (float) (csum * 1000U);
206 adc_set_temp_sensor_enabled(
true);
212 adc_select_input(pin - 26);
215 int raw = adc_read();
217 adc_set_temp_sensor_enabled(
false);
222 return raw * 3.3f / 4096.0f;
const float DATA
For components that import data from directly connected sensors like DHT.
const std::string & get_name() const
ADC_MODE(ADC_VCC) namespace esphome
void setup() override
Setup ADc.
esp_adc_cal_characteristics_t cal_characteristics_[(int) ADC_ATTEN_MAX]
virtual uint8_t get_pin() const =0
std::string get_mac_address()
Get the device MAC address as a string, in lowercase hex notation.
void publish_state(float state)
Publish a new state to the front-end.
std::string unique_id() override
void update() override
Update adc values.
float get_setup_priority() const override
HARDWARE_LATE setup priority.
void dump_config() override
void IRAM_ATTR HOT delay(uint32_t ms)