6 #ifdef USE_ADC_SENSOR_VCC 15 #ifdef CYW43_USES_VSYS_PIN 16 #include "pico/cyw43_arch.h" 18 #include <hardware/adc.h> 24 static const char *
const TAG =
"adc";
28 static const adc_bits_width_t ADC_WIDTH_MAX_SOC_BITS =
static_cast<adc_bits_width_t
>(ADC_WIDTH_MAX - 1);
30 #ifndef SOC_ADC_RTC_MAX_BITWIDTH 31 #if USE_ESP32_VARIANT_ESP32S2 32 static const int32_t SOC_ADC_RTC_MAX_BITWIDTH = 13;
34 static const int32_t SOC_ADC_RTC_MAX_BITWIDTH = 12;
38 static const int ADC_MAX = (1 << SOC_ADC_RTC_MAX_BITWIDTH) - 1;
39 static const int ADC_HALF = (1 << SOC_ADC_RTC_MAX_BITWIDTH) >> 1;
47 ESP_LOGCONFIG(TAG,
"Setting up ADC '%s'...", this->
get_name().c_str());
48 #if !defined(USE_ADC_SENSOR_VCC) && !defined(USE_RP2040) 54 adc1_config_width(ADC_WIDTH_MAX_SOC_BITS);
58 }
else if (
channel2_ != ADC2_CHANNEL_MAX) {
65 for (int32_t i = 0; i <= ADC_ATTEN_DB_11; i++) {
66 auto adc_unit =
channel1_ != ADC1_CHANNEL_MAX ? ADC_UNIT_1 : ADC_UNIT_2;
67 auto cal_value = esp_adc_cal_characterize(adc_unit, (adc_atten_t) i, ADC_WIDTH_MAX_SOC_BITS,
71 case ESP_ADC_CAL_VAL_EFUSE_VREF:
72 ESP_LOGV(TAG,
"Using eFuse Vref for calibration");
74 case ESP_ADC_CAL_VAL_EFUSE_TP:
75 ESP_LOGV(TAG,
"Using two-point eFuse Vref for calibration");
77 case ESP_ADC_CAL_VAL_DEFAULT_VREF:
86 static bool initialized =
false;
93 ESP_LOGCONFIG(TAG,
"ADC '%s' setup finished!", this->
get_name().c_str());
97 LOG_SENSOR(
"",
"ADC Sensor",
this);
98 #if defined(USE_ESP8266) || defined(USE_LIBRETINY) 99 #ifdef USE_ADC_SENSOR_VCC 100 ESP_LOGCONFIG(TAG,
" Pin: VCC");
102 LOG_PIN(
" Pin: ",
pin_);
104 #endif // USE_ESP8266 || USE_LIBRETINY 107 LOG_PIN(
" Pin: ",
pin_);
109 ESP_LOGCONFIG(TAG,
" Attenuation: auto");
113 ESP_LOGCONFIG(TAG,
" Attenuation: 0db");
115 case ADC_ATTEN_DB_2_5:
116 ESP_LOGCONFIG(TAG,
" Attenuation: 2.5db");
119 ESP_LOGCONFIG(TAG,
" Attenuation: 6db");
121 case ADC_ATTEN_DB_11:
122 ESP_LOGCONFIG(TAG,
" Attenuation: 11db");
132 ESP_LOGCONFIG(TAG,
" Pin: Temperature");
134 #ifdef USE_ADC_SENSOR_VCC 135 ESP_LOGCONFIG(TAG,
" Pin: VCC");
137 LOG_PIN(
" Pin: ",
pin_);
138 #endif // USE_ADC_SENSOR_VCC 142 LOG_UPDATE_INTERVAL(
this);
147 float value_v = this->
sample();
148 ESP_LOGV(TAG,
"'%s': Got voltage=%.4fV", this->
get_name().c_str(), value_v);
154 #ifdef USE_ADC_SENSOR_VCC 155 int32_t
raw = ESP.getVcc();
162 return raw / 1024.0f;
172 }
else if (
channel2_ != ADC2_CHANNEL_MAX) {
173 adc2_get_raw(
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw);
186 int raw11 = ADC_MAX, raw6 = ADC_MAX, raw2 = ADC_MAX, raw0 = ADC_MAX;
189 adc1_config_channel_atten(
channel1_, ADC_ATTEN_DB_11);
191 if (raw11 < ADC_MAX) {
192 adc1_config_channel_atten(
channel1_, ADC_ATTEN_DB_6);
194 if (raw6 < ADC_MAX) {
195 adc1_config_channel_atten(
channel1_, ADC_ATTEN_DB_2_5);
197 if (raw2 < ADC_MAX) {
198 adc1_config_channel_atten(
channel1_, ADC_ATTEN_DB_0);
203 }
else if (
channel2_ != ADC2_CHANNEL_MAX) {
204 adc2_config_channel_atten(
channel2_, ADC_ATTEN_DB_11);
205 adc2_get_raw(
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw11);
206 if (raw11 < ADC_MAX) {
207 adc2_config_channel_atten(
channel2_, ADC_ATTEN_DB_6);
208 adc2_get_raw(
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw6);
209 if (raw6 < ADC_MAX) {
210 adc2_config_channel_atten(
channel2_, ADC_ATTEN_DB_2_5);
211 adc2_get_raw(
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw2);
212 if (raw2 < ADC_MAX) {
213 adc2_config_channel_atten(
channel2_, ADC_ATTEN_DB_0);
214 adc2_get_raw(
channel2_, ADC_WIDTH_MAX_SOC_BITS, &raw0);
220 if (raw0 == -1 || raw2 == -1 || raw6 == -1 || raw11 == -1) {
224 uint32_t mv11 = esp_adc_cal_raw_to_voltage(raw11, &
cal_characteristics_[(int32_t) ADC_ATTEN_DB_11]);
225 uint32_t mv6 = esp_adc_cal_raw_to_voltage(raw6, &
cal_characteristics_[(int32_t) ADC_ATTEN_DB_6]);
226 uint32_t mv2 = esp_adc_cal_raw_to_voltage(raw2, &
cal_characteristics_[(int32_t) ADC_ATTEN_DB_2_5]);
227 uint32_t mv0 = esp_adc_cal_raw_to_voltage(raw0, &
cal_characteristics_[(int32_t) ADC_ATTEN_DB_0]);
230 uint32_t c11 = std::min(raw11, ADC_HALF);
231 uint32_t c6 = ADC_HALF - std::abs(raw6 - ADC_HALF);
232 uint32_t c2 = ADC_HALF - std::abs(raw2 - ADC_HALF);
233 uint32_t c0 = std::min(ADC_MAX - raw0, ADC_HALF);
235 uint32_t csum = c11 + c6 + c2 + c0;
238 uint32_t mv_scaled = (mv11 * c11) + (mv6 * c6) + (mv2 * c2) + (mv0 * c0);
239 return mv_scaled / (float) (csum * 1000U);
246 adc_set_temp_sensor_enabled(
true);
250 int32_t
raw = adc_read();
251 adc_set_temp_sensor_enabled(
false);
255 return raw * 3.3f / 4096.0f;
258 #ifdef CYW43_USES_VSYS_PIN 259 if (pin == PICO_VSYS_PIN) {
264 cyw43_thread_enter();
266 #endif // CYW43_USES_VSYS_PIN 269 adc_select_input(pin - 26);
271 int32_t
raw = adc_read();
273 #ifdef CYW43_USES_VSYS_PIN 274 if (pin == PICO_VSYS_PIN) {
277 #endif // CYW43_USES_VSYS_PIN 282 float coeff = pin == PICO_VSYS_PIN ? 3.0 : 1.0;
283 return raw * 3.3f / 4096.0f * coeff;
293 return analogReadVoltage(this->
pin_->
get_pin()) / 1000.0f;
295 #endif // USE_LIBRETINY
const float DATA
For components that import data from directly connected sensors like DHT.
ADC_MODE(ADC_VCC) namespace esphome
void setup() override
Setup ADC.
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
esp_adc_cal_characteristics_t cal_characteristics_[SOC_ADC_ATTEN_NUM]
void update() override
Update ADC values.
This is a workaround until we can figure out a way to get the tflite-micro idf component code availab...
float get_setup_priority() const override
HARDWARE_LATE setup priority
void dump_config() override
const StringRef & get_name() const
void IRAM_ATTR HOT delay(uint32_t ms)