ESP32-S3+多功能分压物理按键+oneshot_read+VScode+ESPIDF框架

1、创建官方例程,详见上个文章。

2、修改oneshot_read_main.c中代码为

因为我只用的一个通道,示例中原本用了2个通道。

/*

 * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD

 *

 * SPDX-License-Identifier: Apache-2.0

 */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "soc/soc_caps.h"

#include "esp_log.h"

#include "esp_adc/adc_oneshot.h"

#include "esp_adc/adc_cali.h"

#include "esp_adc/adc_cali_scheme.h"

const static char *TAG = "EXAMPLE";

/*---------------------------------------------------------------

        ADC General Macros

---------------------------------------------------------------*/

//ADC1 Channels

#define EXAMPLE_ADC1_CHAN0          ADC_CHANNEL_3

#define EXAMPLE_ADC_ATTEN           ADC_ATTEN_DB_12//衰弱。0-3.3V决定电压的量程

static int adc_raw[2][10];

static int voltage[2][10];

static bool example_adc_calibration_init(adc_unit_t unit, adc_channel_t channel, adc_atten_t atten, adc_cali_handle_t *out_handle);

static void example_adc_calibration_deinit(adc_cali_handle_t handle);

void app_main(void)

{

    //-------------ADC1 Init---------------//

    adc_oneshot_unit_handle_t adc1_handle;

    adc_oneshot_unit_init_cfg_t init_config1 = {

        .unit_id = ADC_UNIT_1,//ADC1

    };

    ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle));

    //-------------ADC1 Config---------------//

    adc_oneshot_chan_cfg_t config = {

        .bitwidth = ADC_BITWIDTH_DEFAULT,//宽度

        .atten = EXAMPLE_ADC_ATTEN,//衰弱

    };

    ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, EXAMPLE_ADC1_CHAN0, &config));

   

    //-------------ADC1 Calibration Init---------------//

    adc_cali_handle_t adc1_cali_chan0_handle = NULL;

    bool do_calibration1_chan0 = example_adc_calibration_init(ADC_UNIT_1, EXAMPLE_ADC1_CHAN0, EXAMPLE_ADC_ATTEN, &adc1_cali_chan0_handle);

    while (1) {

        ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN0, &adc_raw[0][0]));

        //ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

        if (do_calibration1_chan0) {

            ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_chan0_handle, adc_raw[0][0], &voltage[0][0]));

            //ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }

   

        if(adc_raw[0][0]>400 && adc_raw[0][0]<500)

        {

            //vTaskDelay(10/portTICK_PERIOD_MS);

            //以上是长按代码,不需要

            ESP_LOGI(TAG, "+++++++++++1按键被按下了!+++++++++++++");

            ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

            ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }else if(adc_raw[0][0]>900 && adc_raw[0][0]<1000)

        {

            //vTaskDelay(10/portTICK_PERIOD_MS);

            ESP_LOGI(TAG, "+++++++++++2按键被按下了!+++++++++++++");

            ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

            ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }

        else if(adc_raw[0][0]>1300 && adc_raw[0][0]<1400)

        {

            //vTaskDelay(10/portTICK_PERIOD_MS);

            ESP_LOGI(TAG, "+++++++++++3按键被按下了!+++++++++++++");

            ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

            ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }

        else if(adc_raw[0][0]>2000 && adc_raw[0][0]<2100)

        {

            //vTaskDelay(10/portTICK_PERIOD_MS);

            ESP_LOGI(TAG, "+++++++++++4按键被按下了!+++++++++++++");

            ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

            ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }

        else if(adc_raw[0][0]>2400 && adc_raw[0][0]<2500)

        {

           //vTaskDelay(10/portTICK_PERIOD_MS);

            ESP_LOGI(TAG, "+++++++++++5按键被按下了!+++++++++++++");

            ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

            ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }

        else if(adc_raw[0][0]>2500 && adc_raw[0][0]<3000)

        {

            //vTaskDelay(10/portTICK_PERIOD_MS);

            ESP_LOGI(TAG, "+++++++++++6按键被按下了!+++++++++++++");

            ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);

            ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, voltage[0][0]);

        }

    //     vTaskDelay(pdMS_TO_TICKS(500));

    vTaskDelay(pdMS_TO_TICKS(1000));

    }

    //Tear Down

    ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle));

    if (do_calibration1_chan0) {

        example_adc_calibration_deinit(adc1_cali_chan0_handle);

    }

}

/*---------------------------------------------------------------

        ADC Calibration

---------------------------------------------------------------*/

static bool example_adc_calibration_init(adc_unit_t unit, adc_channel_t channel, adc_atten_t atten, adc_cali_handle_t *out_handle)

{

    adc_cali_handle_t handle = NULL;

    esp_err_t ret = ESP_FAIL;

    bool calibrated = false;

#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED

    if (!calibrated) {

        ESP_LOGI(TAG, "calibration scheme version is %s", "Curve Fitting");

        adc_cali_curve_fitting_config_t cali_config = {

            .unit_id = unit,

            .chan = channel,

            .atten = atten,

            .bitwidth = ADC_BITWIDTH_DEFAULT,

        };

        ret = adc_cali_create_scheme_curve_fitting(&cali_config, &handle);

        if (ret == ESP_OK) {

            calibrated = true;

        }

    }

#endif

#if ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED

    if (!calibrated) {

        ESP_LOGI(TAG, "calibration scheme version is %s", "Line Fitting");

        adc_cali_line_fitting_config_t cali_config = {

            .unit_id = unit,

            .atten = atten,

            .bitwidth = ADC_BITWIDTH_DEFAULT,

        };

        ret = adc_cali_create_scheme_line_fitting(&cali_config, &handle);

        if (ret == ESP_OK) {

            calibrated = true;

        }

    }

#endif

    *out_handle = handle;

    if (ret == ESP_OK) {

        ESP_LOGI(TAG, "Calibration Success");

    } else if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) {

        ESP_LOGW(TAG, "eFuse not burnt, skip software calibration");

    } else {

        ESP_LOGE(TAG, "Invalid arg or no memory");

    }

    return calibrated;

}

static void example_adc_calibration_deinit(adc_cali_handle_t handle)

{

#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED

    ESP_LOGI(TAG, "deregister %s calibration scheme", "Curve Fitting");

    ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(handle));

#elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED

    ESP_LOGI(TAG, "deregister %s calibration scheme", "Line Fitting");

    ESP_ERROR_CHECK(adc_cali_delete_scheme_line_fitting(handle));

#endif

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值