[文章]【开鸿智谷NiobeU4开发板免费试用体验】按键识别

阅读量0
0
0

一、ADC按键电路
如下图所示,开发板的按键SW4和SW5采用的ADC方式判断的。接在ADC1的CH0通道,通过检测ADC1_CH0的ADC值来判断是否有按键按下,以及按下的哪个按键。
image.png

二、程序移植以及处理

官方的例程放在如下目录NiobeU4\vendor\openvalley\niobeu4\demo
参考其中的例程,复制一个新的副本,修改名称为301_user_app。修改当前目录下的Kconfig.liteos_m.applications文件,根据文件中的格式添加新的例程支持。
进入301_user_app文件夹,修改BUILD.gn和.application_config文件。注意修改BUILD.gn文件时,不要用tab来代替空格,否则编译会报如下错误:
编译错误3.png
如下为BUILD.gn修改后的内容

kernel_module(module_name){
    sources =  [
        "main.c"
    ]
    include_dirs = [
        "//drivers/hdf_core/framework/include/platform/",
        "//drivers/hdf_core/framework/include/utils/",
        "//drivers/hdf_core/framework/support/platform/include/gpio",
        "//drivers/hdf_core/adapter/khdf/liteos_m/osal/include/",
        "//drivers/hdf_core/framework/include/core/",
        "//device/soc/esp/esp32/components/esp_adc_cal/include/",
        "//device/soc/esp/esp32/components/driver/esp32/include/"
    ]
}

在main.c中添加adc代码,使用官方的adc会报错,提示没有hdf驱动,所以这里采用esp32的原生api

#define ADC_CHANNEL ADC1_CHANNEL_0

void adc_init(void)
{
    adc1_config_width(ADC_WIDTH_12Bit); //设置采样深度
    adc1_config_channel_atten(ADC_CHANNEL, ADC_ATTEN_DB_11); //设置电压采样范围

    HDF_LOGE("[adc] ADC init\n");
}

int get_adc_value(void)
{
    return adc1_get_raw(ADC_CHANNEL);
}



static void user_app(void)
{
    uint16_t key_state = 0;
    int adc_value;
    adc_init();
    while (1) 
    {
        adc_value = get_adc_value();
        HDF_LOGE("[adc] adc value:%d\r\n", adc_value);
        osDelay(SYS_DELAY_TICKS);
    }
}

static void user_app_task(void)
{
    HDF_LOGE("into user app!\n");
    osThreadAttr_t attr;
    attr.name = "user_app";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = TASK_STACK_SIZE;
    attr.priority = TASK_PRIO;
    g_taskID = osThreadNew((osThreadFunc_t)user_app, NULL, &attr);
    if (g_taskID == NULL) {
        HDF_LOGE("Failed to create user app thread!\n");
    }
}

这里实现了adc打印,可以看到按键按下和不按以及按下哪个分别打印的adc值。

操作 adc值
不按 1072
按下SW4 0
按下SW5 281

image.png

三、修改程序判断按键
以上已经得到了按键的adc值,接下来就根据该值判断哪个按键按下
修改user_app函数

static void user_app(void)
{
    uint16_t key_state = 0;
    int adc_value;
    adc_init();
    while (1) 
    {
        adc_value = get_adc_value();
        if(adc_value < 80)
        {
            HDF_LOGE("[adc] sw4 pressed adc value:%d\r\n", adc_value);
        }
        else if(adc_value < 500)
        {
            HDF_LOGE("[adc] sw5 pressed adc value:%d\r\n", adc_value);
        }

        LOS_Msleep(SYS_DELAY_TICKS);
    }
}

image.png

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友