【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】7.RGB操作

描述

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


`尝试了开发板的RGB功能。
RGB其实就是三个端口进行控制的,分别为10,11,和12.原理图如下:
HiSpark

我使用按键按下分别控制三个LED亮灭,程序实现上比较简单,如果扩展功能的话可以通过PWM控制这三个引脚实现亮度调节。

代码如下:
  1. /*this is my first application*/
  2. /*2020/11/08*/
  3.  
  4. #include
  5. #include "ohos_init.h"
  6. #include "ohos_types.h"
  7. #include
  8.  
  9. #include
  10.  
  11. #include "ohos_init.h"
  12. #include "cmsis_os2.h"
  13. #include "wifiiot_gpio.h"
  14. #include "wifiiot_gpio_ex.h"
  15. #include "wifiiot_adc.h"
  16.  
  17. #include
  18. #include
  19. #include
  20. #include
  21.  
  22. #include
  23.  
  24.  
  25.  
  26. #define LED_INTERVAL_TIME_US 500000    /*500ms*/
  27. #define LED_TASK_STACK_SIZE 512
  28. #define LED_TASK_PRIO 25
  29.  
  30. #define KEY_INTERVAL_TIME_US 10000    /*10ms*/
  31. #define KEY_TASK_STACK_SIZE 1024
  32. #define KEY_TASK_PRIO 24
  33.  
  34. #define RGB_INTERVAL_TIME_US 10000    /*10ms*/
  35. #define RGB_TASK_STACK_SIZE 1024
  36. #define RGB_TASK_PRIO 23
  37.  
  38. static void *LedTask(const char *arg);
  39. static void *KeyTask(const char *arg);
  40. static void *RGBTask(const char *arg);
  41.  
  42. /*LED Control*/
  43. enum LedState {
  44.     LED_ON = 0,
  45.     LED_OFF,
  46.     LED_SPARK,
  47. };
  48.  
  49. uint8_t RGB_ctrl = 0;
  50.  
  51.  
  52. static void *LedTask(const char *arg)
  53. {
  54.     (void)arg;
  55.     enum LedState g_ledState = LED_SPARK;
  56.     g_ledState = LED_SPARK;
  57.    
  58.     while (1) {
  59.         switch (g_ledState) {
  60.             case LED_ON:
  61.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  62.                 usleep(LED_INTERVAL_TIME_US);
  63.                 break;
  64.             case LED_OFF:
  65.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  66.                 usleep(LED_INTERVAL_TIME_US);
  67.                 break;
  68.             case LED_SPARK:
  69.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  70.                 usleep(LED_INTERVAL_TIME_US);
  71.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  72.                 usleep(LED_INTERVAL_TIME_US);
  73.                 break;
  74.             default:
  75.                 usleep(LED_INTERVAL_TIME_US);
  76.                 break;
  77.         }
  78.     }
  79.  
  80.     return NULL;
  81. }
  82.  
  83. static void Led0Entry(void)
  84. {
  85.     osThreadAttr_t attr;
  86.  
  87.     GpioInit();
  88.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
  89.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
  90.  
  91.     attr.name = "LedTask";
  92.     attr.attr_bits = 0U;
  93.     attr.cb_mem = NULL;
  94.     attr.cb_size = 0U;
  95.     attr.stack_mem = NULL;
  96.     attr.stack_size = LED_TASK_STACK_SIZE;
  97.     attr.priority = LED_TASK_PRIO;
  98.  
  99.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  100.         printf("[Led0Task] Falied to create LedTask!
  101. ");
  102.     }
  103. }
  104. SYS_RUN(Led0Entry);
  105.  
  106. /*OLED board KEY Control - vased on ADC input*/
  107. static void *KeyTask(const char *arg)
  108. {
  109.     (void)arg;
  110.  
  111.     WifiIotGpioValue Key_Status = WIFI_IOT_GPIO_VALUE1;
  112.     WifiIotGpioValue Last_key_Status = WIFI_IOT_GPIO_VALUE1;
  113.     // hi_u16 Key_adc_value = 0u;
  114.     // hi_u32 ret = 0;
  115.  
  116.     while (1) {
  117.         GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
  118. //        printf("%d
  119. ", Key_Status);
  120.  
  121.         if((Key_Status == WIFI_IOT_GPIO_VALUE0) && (Last_key_Status != Key_Status))
  122.         {
  123.             RGB_ctrl ++;
  124.             printf("Key pressed, RGB_ctrl = %d
  125. ", RGB_ctrl);
  126.         }
  127.         else
  128.         {
  129.  
  130.         }
  131.  
  132. //         ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_2, &Key_adc_value,
  133. //                     HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0);
  134. //         if (ret != HI_ERR_SUCCESS) {
  135. //             printf("ADC Read Fail
  136. ");
  137. //         }
  138. //         else
  139. //         {
  140. // //            printf("ADC value = %d", Key_adc_value);
  141. //         }
  142. //         /*User 按键ADC值读出来大概为116*/
  143. //         /*S1 按键ADC读出来大概为320*/
  144. //         /*S2 按键ADC读出来大概为548*/
  145. //         if(Key_adc_value <= 200)
  146. //         {
  147. //             printf("User key pressed
  148. ");
  149. //         }
  150. //         else if(Key_adc_value <= 400)
  151. //         {
  152. //             printf("User S1 pressed
  153. ");
  154. //         }   
  155. //         else if(Key_adc_value <= 600)
  156. //         {
  157. //             printf("User S2 pressed
  158. ");
  159. //         }
  160. //         else
  161. //         {
  162.  
  163. //         }
  164.  
  165.         Last_key_Status = Key_Status;
  166.         usleep(KEY_INTERVAL_TIME_US);
  167.     }
  168.  
  169.     return NULL;
  170. }
  171.  
  172. static void KeyEntry(void)
  173. {
  174.     osThreadAttr_t attr;
  175.  
  176.     GpioInit();
  177.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
  178.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_GPIO_DIR_IN);
  179. //    AdcRead();
  180.  
  181.     attr.name = "KeyTask";
  182.     attr.attr_bits = 0U;
  183.     attr.cb_mem = NULL;
  184.     attr.cb_size = 0U;
  185.     attr.stack_mem = NULL;
  186.     attr.stack_size = KEY_TASK_STACK_SIZE;
  187.     attr.priority = KEY_TASK_PRIO;
  188.  
  189.     if (osThreadNew((osThreadFunc_t)KeyTask, NULL, &attr) == NULL) {
  190.         printf("[KeyTask] Falied to create KeyTask!
  191. ");
  192.     }
  193. }
  194. SYS_RUN(KeyEntry);
  195.  
  196.  
  197. static void *RGBTask(const char *arg)
  198. {
  199.     (void)arg;
  200.  
  201.     while (1) {
  202. //        GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5, &Key_Status);
  203.         switch(RGB_ctrl)
  204.         {
  205.             case 0:
  206.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
  207.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  208.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  209.                 usleep(RGB_INTERVAL_TIME_US);
  210.                 break;
  211.             case 1:
  212.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  213.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
  214.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  215.                 usleep(RGB_INTERVAL_TIME_US);
  216.                 break;
  217.             case 2:
  218.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  219.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  220.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  221.                 usleep(RGB_INTERVAL_TIME_US);
  222.                 break;
  223.             case 3:
  224.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 1);
  225.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 1);
  226.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 1);
  227.                 usleep(RGB_INTERVAL_TIME_US);
  228.                 break;
  229.             case 4:
  230.                 RGB_ctrl = 0;
  231.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, 0);
  232.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, 0);
  233.                 GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, 0);
  234.                 usleep(RGB_INTERVAL_TIME_US);
  235.                 break;
  236.         }
  237.         
  238.     }
  239.  
  240.     return NULL;
  241. }
  242.  
  243. static void RGBEntry(void)
  244. {
  245.     osThreadAttr_t attr;
  246.  
  247.     GpioInit();
  248.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
  249.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);
  250.  
  251.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
  252.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);
  253.  
  254.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
  255.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
  256. //    AdcRead();
  257.  
  258.     attr.name = "RGBTask";
  259.     attr.attr_bits = 0U;
  260.     attr.cb_mem = NULL;
  261.     attr.cb_size = 0U;
  262.     attr.stack_mem = NULL;
  263.     attr.stack_size = RGB_TASK_STACK_SIZE;
  264.     attr.priority = RGB_TASK_PRIO;
  265.  
  266.     if (osThreadNew((osThreadFunc_t)RGBTask, NULL, &attr) == NULL) {
  267.         printf("[KeyTask] Falied to create KeyTask!
  268. ");
  269.     }
  270. }
  271. SYS_RUN(RGBEntry);
  272.  
复制代码


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

全部0条评论

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

×
20
完善资料,
赚取积分