[]【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】4, 按键驱动LED

阅读量0
0
0
有一周多没有时间弄这个板子了,这段时间实在是有点忙,这周末抓紧了点时间弄了弄。资料确实有点少了,只能一点一点的摸索。弄了一个按键控制LED的程序。

核心板上有一个LED以及按键,我们查看原理图可以知道,LED连接到GPIO9,按键连接到了GPIO5.
1.png
2.png

所以只需要初始化这两个引脚作为输入输出就行了,还是比较简单的,因为是学习,所以从简单的开始入手。

初始化代码如下:
LED初始化,初始化为输出:
  1. GpioInit();
  2.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  3.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
复制代码


KEY初始化函数,初始化为输入:
  1. GpioInit();
  2.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  3.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
复制代码


如何调用呢?
看下边:
控制GPIO输出,1为输出高,0位输出低:
  1. GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
复制代码
获取GPIO输入电平:
  1. WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
  2. GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
复制代码
其中:Key_Status
就是获取的电平值,GpioGetInputVal()的返回值表示获取是否成功的标志。
我创建了两个任务:
一个任务专门控制LED,一个任务控制Key。
上电之后,LED闪烁,频率是500ms。
按下user按键之后,LED灭
再次按下user按键,LED亮
再次按下user按键,再次闪烁
以此循环。

完整代码如下:
BUILD.gn
  1. static_library("myapp") {
  2.     sources = [
  3.         "my_main.c"
  4.     ]
  5.     include_dirs = [
  6.         "//utils/native/lite/include",
  7.         "//kernel/liteos_m/components/cmsis/2.0",
  8.         "//base/iot_hardware/interfaces/kits/wifiiot_lite",
  9.         "//vender/hisi/hi3861/hi3861/include"
  10.     ]
  11. }
复制代码


my_main.c函数
  1. /*this is my first application*/
  2. /*2020/11/08*/

  3. #include <stdio.h>
  4. #include "ohos_init.h"
  5. #include "ohos_types.h"
  6. #include <stdio.h>

  7. #include <unistd.h>

  8. #include "ohos_init.h"
  9. #include "cmsis_os2.h"
  10. #include "wifiiot_gpio.h"
  11. #include "wifiiot_gpio_ex.h"
  12. #include "wifiiot_adc.h"

  13. #include <hi_types_base.h>
  14. #include <hi_i2c.h>
  15. #include <hi_early_debug.h>
  16. #include <hi_stdlib.h>



  17. #define LED_INTERVAL_TIME_US 500000    /*500ms*/
  18. #define LED_TASK_STACK_SIZE 512
  19. #define LED_TASK_PRIO 25

  20. #define KEY_INTERVAL_TIME_US 10000    /*10ms*/
  21. #define KEY_TASK_STACK_SIZE 1024
  22. #define KEY_TASK_PRIO 26

  23. static void *LedTask(const char *arg);
  24. static void *KeyTask(const char *arg);

  25. /*LED Control*/
  26. enum LedState {
  27.     LED_ON = 0,
  28.     LED_OFF,
  29.     LED_SPARK,
  30. };
  31. enum LedState g_ledState = LED_SPARK;




  32. static void *LedTask(const char *arg)
  33. {
  34.     (void)arg;
  35.    
  36.     while (1) {
  37.         switch (g_ledState) {
  38.             case LED_ON:
  39.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  40.                 usleep(LED_INTERVAL_TIME_US);
  41.                 break;
  42.             case LED_OFF:
  43.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  44.                 usleep(LED_INTERVAL_TIME_US);
  45.                 break;
  46.             case LED_SPARK:
  47.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  48.                 usleep(LED_INTERVAL_TIME_US);
  49.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  50.                 usleep(LED_INTERVAL_TIME_US);
  51.                 break;
  52.             default:
  53.                 usleep(LED_INTERVAL_TIME_US);
  54.                 break;
  55.         }
  56.     }

  57.     return NULL;
  58. }

  59. static void Led0Entry(void)
  60. {
  61.     osThreadAttr_t attr;

  62.     GpioInit();
  63.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  64.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);

  65.     attr.name = "LedTask";
  66.     attr.attr_bits = 0U;
  67.     attr.cb_mem = NULL;
  68.     attr.cb_size = 0U;
  69.     attr.stack_mem = NULL;
  70.     attr.stack_size = LED_TASK_STACK_SIZE;
  71.     attr.priority = LED_TASK_PRIO;

  72.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  73.         printf("[Led0Task] Falied to create LedTask!n");
  74.     }
  75. }
  76. SYS_RUN(Led0Entry);

  77. /*OLED board KEY Control - vased on ADC input*/
  78. static void *KeyTask(const char *arg)
  79. {
  80.     (void)arg;

  81.     WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
  82.     WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
  83.     uint8_t Key_press_cnt = 0u;

  84.     while (1) {
  85.         GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
  86. //        printf("%dn", Key_Status);

  87.         if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
  88.         {
  89. //            Key_press_cnt = (Key_press_cnt>2) ? 0:(++Key_press_cnt);
  90.             if(Key_press_cnt >= 2)
  91.             {
  92.                 Key_press_cnt = 0;
  93.             }
  94.             else
  95.             {
  96.                 Key_press_cnt ++;
  97.             }
  98.             switch(Key_press_cnt)
  99.             {
  100.                 case 0:g_ledState = LED_ON;break;
  101.                 case 1:g_ledState = LED_OFF;break;
  102.                 case 2:g_ledState = LED_SPARK;break;
  103.             }
  104.         }
  105.         else
  106.         {

  107.         }
  108.         
  109.         Last_key_Status = Key_Status;
  110.         usleep(LED_INTERVAL_TIME_US);
  111.     }

  112.     return NULL;
  113. }

  114. static void KeyEntry(void)
  115. {
  116.     osThreadAttr_t attr;

  117.     GpioInit();
  118.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  119.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
  120. //    AdcRead();

  121.     attr.name = "KeyTask";
  122.     attr.attr_bits = 0U;
  123.     attr.cb_mem = NULL;
  124.     attr.cb_size = 0U;
  125.     attr.stack_mem = NULL;
  126.     attr.stack_size = KEY_TASK_STACK_SIZE;
  127.     attr.priority = KEY_TASK_PRIO;

  128.     if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
  129.         printf("[KeyTask] Falied to create KeyTask!n");
  130.     }
  131. }
  132. SYS_RUN(KeyEntry);
复制代码

我的软件目录如下:
3.png


最后效果图见视频。



回帖

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