#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_adc/adc_oneshot.h"
// Выбираем АЦП
#define ADC_UNIT ADC_UNIT_1
#define ADC_CHANNEL ADC_CHANNEL_4
#define ADC_ATTENUATION ADC_ATTEN_DB_11 // <-- изменено!
// Константы для перевода RAW в напряжение
#define ADC_MAX_RAW_VALUE 4095 // 12-bit ADC
#define ADC_MAX_VOLTAGE 3.3f // <-- теперь 3.3 В
void app_main(void)
{
static int adc_raw;
static float voltage;
// Инициализация АЦП
adc_oneshot_unit_handle_t adc_handle;
adc_oneshot_unit_init_cfg_t init_config = {
.unit_id = ADC_UNIT,
};
ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config, &adc_handle));
// Настройка канала
adc_oneshot_chan_cfg_t config = {
.bitwidth = ADC_BITWIDTH_DEFAULT, // обычно 12 бит
.atten = ADC_ATTENUATION, // теперь DB_11
};
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc_handle, ADC_CHANNEL, &config));
while (1)
{
// Чтение "сырых" данных
ESP_ERROR_CHECK(adc_oneshot_read(adc_handle, ADC_CHANNEL, &adc_raw));
// Перевод в напряжение
voltage = (float)adc_raw / ADC_MAX_RAW_VALUE * ADC_MAX_VOLTAGE;
// Вывод результата
printf("ADC%d Channel[%d] Raw: %d | Voltage: %.3f V\n",
ADC_UNIT + 1, ADC_CHANNEL, adc_raw, voltage);
vTaskDelay(pdMS_TO_TICKS(1000));
}
// Теоретическая очистка (не достигается)
ESP_ERROR_CHECK(adc_oneshot_del_unit(adc_handle));
}