ESP-IDF中ADC_ATTEN_DB_11已弃用,如何迁移至新ADC驱动?
解决ESP-IDF中旧版ADC驱动弃用警告问题
问题背景
在基于PlatformIO的ESP-IDF项目中,使用旧版ADC初始化API时出现两类弃用警告:
ADC_ATTEN_DB_11已被弃用,替换为ADC_ATTEN_DB_12后仍有警告- 提示需迁移至oneshot模式(
esp_adc/adc_oneshot.h)或连续模式(esp_adc/adc_continuous.h)驱动
原有初始化及读取代码如下:
// main function void app_main() { esp_event_loop_create_default(); connect_wifi_params_t cbs = { .on_connected = handle_wifi_connect, .on_failed = handle_wifi_failed }; // configure ADC for 12-bit width, 3.3V source // Photoresistor needs to be connected from 3.3V to pin 34. adc1_config_width(ADC_WIDTH_BIT_12); adc1_config_channel_atten(adc_channel, ADC_ATTEN_DB_11); // connect wifi appwifi_connect(cbs); }
// transmit reading to server. Photoresistor is read here. static void publish_reading(int temp, int hum) { char buffer[5]; if (client != NULL && enabled) { esp_mqtt_client_publish(client, TEMP_TOPIC, itoa(temp, buffer, 10), 0, 1, 0); esp_mqtt_client_publish(client, HUM_TOPIC, itoa(hum, buffer, 10), 0, 1, 0); // average ADC value over 32 samples and send it int adc_val = 0; for (unsigned char i = 0; i < SAMPLE_CNT; i++) adc_val += adc1_get_raw(adc_channel); adc_val /= SAMPLE_CNT; esp_mqtt_client_publish(client, PHOTO_TOPIC, itoa(adc_val, buffer, 10), 0, 1, 0); } }
解决方案:迁移至OneShot模式驱动
你的场景是单次采样多次取平均,适合使用oneshot模式,具体修改步骤如下:
1. 替换头文件
移除旧的ADC头文件,引入oneshot模式的头文件:
#include "esp_adc/adc_oneshot.h"
2. 定义全局句柄
在全局区域或合适的位置定义ADC1的句柄:
adc_oneshot_unit_handle_t adc1_handle;
3. 修改ADC初始化逻辑
在app_main()中替换旧的初始化代码,使用oneshot模式API:
void app_main() { esp_event_loop_create_default(); connect_wifi_params_t cbs = { .on_connected = handle_wifi_connect, .on_failed = handle_wifi_failed }; // 初始化ADC1的oneshot单元 adc_oneshot_unit_init_cfg_t init_cfg = { .unit_id = ADC_UNIT_1, .ulp_mode = ADC_ULP_MODE_DISABLE, // 禁用ULP模式,无需低功耗采样 }; ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_cfg, &adc1_handle)); // 配置目标通道的衰减和精度 adc_oneshot_chan_cfg_t chan_cfg = { .atten = ADC_ATTEN_DB_12, // 替代ADC_ATTEN_DB_11的新标准衰减值 .bitwidth = ADC_BITWIDTH_12, // 保持12位采样精度 }; ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, adc_channel, &chan_cfg)); // connect wifi appwifi_connect(cbs); }
4. 修改ADC读取代码
替换旧的adc1_get_raw()为oneshot模式的读取API:
static void publish_reading(int temp, int hum) { char buffer[5]; if (client != NULL && enabled) { esp_mqtt_client_publish(client, TEMP_TOPIC, itoa(temp, buffer, 10), 0, 1, 0); esp_mqtt_client_publish(client, HUM_TOPIC, itoa(hum, buffer, 10), 0, 1, 0); // average ADC value over 32 samples and send it int adc_val = 0; int raw_reading; for (unsigned char i = 0; i < SAMPLE_CNT; i++) { ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, adc_channel, &raw_reading)); adc_val += raw_reading; } adc_val /= SAMPLE_CNT; esp_mqtt_client_publish(client, PHOTO_TOPIC, itoa(adc_val, buffer, 10), 0, 1, 0); } }
5. 可选:资源清理(低功耗场景)
如果项目需要关闭ADC单元以节省功耗,可在退出逻辑中调用:
ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle));
关键说明
ADC_ATTEN_DB_12是ADC_ATTEN_DB_11的官方替代值,对应最大输入电压约3.9V,完全适配你的3.3V电源场景- OneShot模式专为单次采样场景设计,API逻辑清晰,符合你多次采样取平均的需求
- 使用
ESP_ERROR_CHECK包裹API调用,可及时捕获初始化或采样过程中的错误,提升代码健壮性
内容的提问来源于stack exchange,提问作者StarSword
相关产品推荐
相关产品推荐

