#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_adc/adc_oneshot.h"
#define CONFIG_LOG_MAXIMUM_LEVEL 5
static const char *TAG = "ADC_APP";
void app_main() {
esp_log_level_set(TAG, ESP_LOG_VERBOSE);
// 初始化ADC單元
adc_oneshot_unit_handle_t adc_handle;
adc_oneshot_unit_init_cfg_t unit_cfg = {
.unit_id = ADC_UNIT_1
};
ESP_ERROR_CHECK(adc_oneshot_new_unit(&unit_cfg, &adc_handle));
// 初始化ADC通道
adc_oneshot_chan_cfg_t chan_cfg = {
.bitwidth = ADC_BITWIDTH_DEFAULT, // 預設 12-bit (0-4095)
.atten = ADC_ATTEN_DB_12 // 設定衰減,使其能量測 0~3.3V 範圍
};
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc_handle, ADC_CHANNEL_6, &chan_cfg));
int adc_val = 0;
int last_val = -1; // 記錄上一次的百分比
ESP_LOGI(TAG, "ADC就緒!");
while (1) {
// 讀取原始數值
ESP_ERROR_CHECK(adc_oneshot_read(adc_handle, ADC_CHANNEL_6, &adc_val));
// 僅在數值變動時輸出
if (abs(adc_val - last_val) >= 10) {
// 轉換為百分比 (0-4095 -> 0-100)
// 使用浮點數計算確保精度,再轉回整數
int percent_val = (int)((adc_val / 4095.0) * 100.0);
ESP_LOGI(TAG, "ADC值: %d%% (原始值: %d)", percent_val, adc_val);
last_val = adc_val;
}
// 延遲一段時間,避免過度占用 CPU
vTaskDelay(pdMS_TO_TICKS(100));
}
}