【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】5.OLED板模拟开关按键操作

描述

本文来源电子发烧友社区,作者:hehung, 帖子地址:https://bbs.elecfans.com/jishu_2013902_1_1.html

玩玩OLED板子上面的两个模拟开关S1与S2。
首先查看原理图:
这两个按键是连接在GPIO5上面的,我在上一个帖子上面使用的User按键也是连接在这个端口的,GPIO是一个模拟端口使用了ADC2,通过这个模拟端口我们可以一次性读取三个按钮的值了。
从原理图可以看出,S1按钮的值就为参考电压*(1/(4.7+1)),S2按钮的值就为参考电压*((1+1)/(4.7+1+1)),具体数值可以写一个程序用串口读取读出的ADC数字来查看。
HiSpark HiSpark HiSpark


我最开始写了一个程序用来读取按下按键之后的ADC的电压。
按下User按键之后电压值为160,而且按下User+S2+S2都是这个值,因为User按钮没有接电阻,按下之后相当于电流没有从S1和S2流过。
单独按下S1的值大概为320。同时按下S1和S2的话,值也是S1的值320.因为电流也只会从S1流过,感觉这个模拟开关设计不是很好,应该多加两个电阻,让S1和S2同时按下的时候有不同的值,这样相当于多了一种按键情况。
单独按下S2的值为548.

我在写程序的时候发现ADC并不需要初始化,可以直接读取就行了。
所以设计程序如下:
创建任务
  1. static void KeyEntry(void)
  2. {
  3.     osThreadAttr_t attr;
  4.  
  5. //    GpioInit();
  6.     // IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  7.     // GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
  8. //    AdcRead();
  9.  
  10.     attr.name = "KeyTask";
  11.     attr.attr_bits = 0U;
  12.     attr.cb_mem = NULL;
  13.     attr.cb_size = 0U;
  14.     attr.stack_mem = NULL;
  15.     attr.stack_size = KEY_TASK_STACK_SIZE;
  16.     attr.priority = KEY_TASK_PRIO;
  17.  
  18.     if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
  19.         printf("[KeyTask] Falied to create KeyTask!n");
  20.     }
  21. }
  22. SYS_RUN(KeyEntry);
复制代码


模拟开关值读取:
  1.  
  2. static void *KeyTask(const char *arg)
    {
        (void)arg;
     
  3.  
    hi_u16 Key_adc_value = 0u;
    hi_u32 ret = 0;

  •     while (1) {
            ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &Key_adc_value,
                        HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);
            if (ret != HI_ERR_SUCCESS) {
                printf("ADC Read Failn");
            }
            else
            {
    //            printf("ADC value = %d", Key_adc_value);
            }
  •         /*User 按键ADC值读出来大概为116*/
            /*S1 按键ADC读出来大概为320*/
            /*S2 按键ADC读出来大概为548*/
            if(Key_adc_value <= 200)
            {
                printf("User key pressedn");
            }
            else if(Key_adc_value <= 400)
            {
                printf("User S1 pressedn");
            }   
            else if(Key_adc_value <= 600)
            {
                printf("User S2 pressedn");
            }
            else
            {
                
            }
            
            usleep(KEY_INTERVAL_TIME_US);
        }
  •     return NULL;
    }
复制代码

测试效果如下:
HiSpark
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分