自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

鴻蒙4.WiFi IoT智能家居套件 - LED燈、按鍵、蜂鳴器的實(shí)現(xiàn)

系統(tǒng)
本次在3.helloworld的基礎(chǔ)上,新增點(diǎn)亮LED燈、按鍵操作、蜂鳴器功能。本次需要用到紅黃綠燈擴(kuò)展板。 添加這三個(gè)功能,主要是因?yàn)檫@幾個(gè)功能都是比較簡單的功能,而且,這三個(gè)功能配合起來,可以實(shí)現(xiàn)比較有意思的功能,

[[352070]]

想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com/#zz

 本次在3.helloworld的基礎(chǔ)上,新增點(diǎn)亮LED燈、按鍵操作、蜂鳴器功能。本次需要用到紅黃綠燈擴(kuò)展板。

添加這三個(gè)功能,主要是因?yàn)檫@幾個(gè)功能都是比較簡單的功能,而且,這三個(gè)功能配合起來,可以實(shí)現(xiàn)比較有意思的功能,。

實(shí)現(xiàn)功能:按下擴(kuò)展板上的按鍵,蜂鳴器發(fā)聲,并且紅黃綠燈會(huì)按照紅、黃、綠、全滅的順序進(jìn)行發(fā)光,按鍵抬起,蜂鳴器停止發(fā)聲。

本代碼借鑒了唐佐林老師的教程:實(shí)現(xiàn)按鍵“按下事件”和“釋放事件”的通用框架(V0.0.1)

1、點(diǎn)亮LED燈,使用了GPIO的輸出功能,高電平點(diǎn)亮,低電平熄滅。

主要調(diào)用wifiiot_gpio.c中的函數(shù)以下函數(shù),實(shí)現(xiàn)GPIO初始化為輸出功能,且控制該IO輸出高、低電平

  1. unsigned int IoSetFunc(WifiIotIoName id, unsigned char val)  //選擇IO的功能(GPIO、I2C、SPI、PWM等等) 
  2. unsigned int GpioSetDir(WifiIotGpioIdx id, WifiIotGpioDir dir) //設(shè)置為輸出或輸入 
  3. unsigned int GpioSetOutputVal(WifiIotGpioIdx id, WifiIotGpioValue val) //設(shè)置輸出值 
  4.  
  5. 示例: 
  6. IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, 0 WIFI_IOT_IO_FUNC_GPIO_10_GPIO);//IO10設(shè)置為GPIO 
  7. GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);//IO10設(shè)置為輸出 
  8. GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_GPIO_VALUE1);//IO10輸出高電平 
  9. GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_GPIO_VALUE0);//IO10輸出低電平 

 2、按鍵響應(yīng),使用的GPIO的輸入中斷功能,并且識(shí)別了按鍵按下(下降沿)和按鍵抬起(上升沿)

對中斷不熟悉的朋友,請參考唐佐林老師的教程:實(shí)現(xiàn)按鍵“按下事件”和“釋放事件”的通用框架(V0.0.1) 此處僅將用到幾個(gè)函數(shù)列出 

  1. IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);//IO復(fù)用為GPIO功能 
  2.  GpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_GPIO_DIR_IN);//設(shè)置為輸入 
  3.  IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);//輸入帶上拉 
  4.  GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, 
  5.                      WIFI_IOT_INT_TYPE_EDGE,  
  6.                      WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, 
  7.                      OnButtonPressed_isr, NULL);//注冊中斷服務(wù)函數(shù),邊沿觸發(fā),下降沿觸發(fā),按鍵按下后,會(huì)調(diào)用中斷服務(wù)函數(shù) OnButtonPressed_isr 

 3、蜂鳴器,主要使用了PWM功能,也就是脈沖寬度調(diào)制,通過調(diào)節(jié)占空比,可以控制輸出的電平,使得蜂鳴器發(fā)出不同的響聲,PWM還用于電機(jī)的控制。

注意,為了能使用PWM功能,需要使能PWM功能:將vendor\hisi\hi3861\hi3861\build\config\usr_config.mk文件中的CONFIG_PWM_SUPPORT行:# CONFIG_PWM_SUPPORT is not set修改為CONFIG_PWM_SUPPORT=y , 否則會(huì)編譯失敗

  1. IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//IO復(fù)用為PWM功能 
  2.   GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);//設(shè)置為輸出 
  3.   PwmInit(WIFI_IOT_PWM_PORT_PWM0);//初始化PWM 
  4.   PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 40 * 1000);//啟動(dòng)PWM功能,此處不做詳細(xì)解釋,會(huì)單獨(dú)開一個(gè)帖子講解參數(shù)的含義 
  5.   PwmStop(WIFI_IOT_PWM_PORT_PWM0);//停止PWM 

 4.代碼 hello_world.c

路徑:code\applications\sample\wifi-iot\app\hello_world\hello_world.c

  1. /* 
  2. 2020年11月8日  
  3. 作者:hcl0317 
  4. 鏈接: 
  5. 實(shí)現(xiàn)功能: 
  6. 使用紅綠燈擴(kuò)展板,按一下按鍵,點(diǎn)亮一個(gè)燈,按鍵按下時(shí),蜂鳴器發(fā)聲,按鍵抬起,蜂鳴器停止 
  7. 主要功能點(diǎn): 
  8. 1. GPIO 輸出 -> LED燈 
  9. 2. GPIO 輸入 中斷 -> 按鍵 
  10. 3. PWM功能 -> 蜂鳴器 
  11. */ 
  12.  
  13. //紅黃綠燈擴(kuò)展板上,對應(yīng)的GPIO10,11,12,高電平點(diǎn)燈,低電平滅燈 
  14. static WifiIotIoName LightGPIO[] =  
  15.     WIFI_IOT_IO_NAME_GPIO_10,//紅燈 
  16.     WIFI_IOT_IO_NAME_GPIO_12,//黃燈 
  17.     WIFI_IOT_IO_NAME_GPIO_11//綠燈 
  18. }; 
  19.  
  20.  
  21. //紅黃綠燈擴(kuò)展板上的按鍵 
  22. static int volatile BtnPressed = 0;//1表示按下,0表示抬起 
  23. static int volatile BtnPressed_idx = 0;// 
  24. static void OnButtonPressed_isr(char* arg);//按鍵按下中斷處理函數(shù) 
  25. static void OnButtonReleased_isr(char* arg);//按鍵抬起中斷處理函數(shù) 
  26.  
  27. /*此處借鑒唐佐林老師的代碼 
  28. 有兩個(gè)中斷服務(wù)程序是因?yàn)樵邙櫭煽蚣苤校琁O中斷只能注冊為上升沿觸發(fā)或者下降沿觸發(fā),不能注冊為任意邊沿觸發(fā) 
  29. 我們?yōu)榱俗R(shí)別按鍵按下和抬起,在按鍵按下的中斷服務(wù)程序中,注冊上升沿中斷服務(wù)程序,以檢測按鍵抬起 
  30. 在按鍵抬起的中斷服務(wù)程序中,注冊下降沿中斷服務(wù)程序,以檢測按鍵按下,如此就可以實(shí)現(xiàn)及檢測按鍵的抬起和按下 
  31. */ 
  32. static void OnButtonPressed_isr(char* arg) 
  33.     (void)arg; 
  34.  
  35.     printf("[HelloWorld] OnButtonPressed()\n"); 
  36.  
  37.     BtnPressed = 1; 
  38.     BtnPressed_idx++; 
  39.     BtnPressed_idx %= 4; 
  40.  
  41.     GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, 
  42.                         WIFI_IOT_INT_TYPE_EDGE,  
  43.                         WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH, 
  44.                         OnButtonReleased_isr, NULL); 
  45.                          
  46.  
  47. static void OnButtonReleased_isr(char* arg) 
  48.     (void)arg; 
  49.  
  50.     printf("[HelloWorld] OnButtonReleased()\n"); 
  51.  
  52.     BtnPressed = 0; 
  53.  
  54.     GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, 
  55.                         WIFI_IOT_INT_TYPE_EDGE,  
  56.                         WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, 
  57.                         OnButtonPressed_isr, NULL); 
  58.  
  59.  
  60. //1.任務(wù)處理函數(shù) 
  61. static void* HelloWorld_Task(const char* arg) 
  62.     int i = 0; 
  63.     (void)arg; 
  64.     printf("[HelloWorld] HelloWorld_Task()\n"); 
  65.  
  66.     GpioInit();//使用GPIO,都需要調(diào)用該接口 
  67.  
  68.     //紅黃綠燈擴(kuò)展板上,對應(yīng)的LED GPIO10,11,12初始化 
  69.     printf("LED GPIO init...\r\n"); 
  70.     for(i=0; i<3; i++) 
  71.     { 
  72.         //復(fù)用引腳為 GPIO 
  73.         IoSetFunc(LightGPIO[i], 0); 
  74.         //設(shè)置為輸出 
  75.         GpioSetDir(LightGPIO[i], WIFI_IOT_GPIO_DIR_OUT); 
  76.     } 
  77.  
  78.     //紅黃綠燈擴(kuò)展板上,對應(yīng)的按鍵 GPIO8 初始化為GPIO,輸入 
  79.     printf("KEY GPIO init...\r\n"); 
  80.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);//GPIO 
  81.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_GPIO_DIR_IN);//設(shè)置為輸入 
  82.     IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP); 
  83.     GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, 
  84.                         WIFI_IOT_INT_TYPE_EDGE,  
  85.                         WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, 
  86.                         OnButtonPressed_isr, NULL); 
  87.  
  88.     //紅黃綠燈擴(kuò)展板上,對應(yīng)的蜂鳴器 GPIO9 初始化為PWM功能 
  89.     printf("PWM GPIO init...\r\n"); 
  90.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//PWM 
  91.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);//設(shè)置為輸出 
  92.     PwmInit(WIFI_IOT_PWM_PORT_PWM0);//初始化PWM 
  93.  
  94.     while(1) 
  95.     { 
  96.         //logic code for task 
  97.  
  98.         //按一次按鍵,順序點(diǎn)亮一個(gè)燈       
  99.         int j = 0; 
  100.         for(j = 0; j < 3; j++) 
  101.         { 
  102.             if(BtnPressed_idx == j) 
  103.             { 
  104.                 GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE1);//高電平,點(diǎn)亮燈 
  105.             } 
  106.             else 
  107.             { 
  108.                  GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE0);//關(guān)閉燈 
  109.             } 
  110.         } 
  111.  
  112. #if 0 
  113.         //流水燈點(diǎn)亮 
  114.         for(j = 0; j< 3; j++) 
  115.         { 
  116.              GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE0);//關(guān)閉所有燈 
  117.         } 
  118.  
  119.         i = (i + 1) % 3; 
  120.         GpioSetOutputVal(LightGPIO[i], WIFI_IOT_GPIO_VALUE1);//高電平,點(diǎn)亮燈 
  121.         sleep(1);//延時(shí)1秒 
  122. #endif 
  123.  
  124.         //按鍵觸發(fā)的處理 
  125.         if(BtnPressed) 
  126.         { 
  127.             PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 40 * 1000);//按鍵按下,蜂鳴器發(fā)聲 
  128.         }else
  129.             PwmStop(WIFI_IOT_PWM_PORT_PWM0);//按鍵抬起,蜂鳴器停止 
  130.         } 
  131.  
  132.         //usleep(500000); 
  133.         usleep(100000); 
  134.     } 
  135.   
  136.     return NULL
  137.  
  138. //2.任務(wù)入口函數(shù) 
  139. static void HelloWorld_Entry(void) 
  140.     osThreadAttr_t attr = {0}; 
  141.  
  142.     printf("[HelloWorld] HelloWorld_Entry()\n"); 
  143.  
  144.     attr.name = "HelloWorld_Task"
  145.     attr.attr_bits = 0U; 
  146.     attr.cb_mem = NULL
  147.     attr.cb_size = 0U; 
  148.     attr.stack_mem = NULL
  149.     attr.stack_size = 1024;//堆棧大小 
  150.     attr.priority = osPriorityNormal;//優(yōu)先級 
  151.  
  152.     if (osThreadNew((osThreadFunc_t)HelloWorld_Task, NULL, &attr) == NULL
  153.     { 
  154.         printf("[HelloWorld] Falied to create LedTask!\n"); 
  155.     } 
  156.  
  157. //3.注冊模塊 
  158. SYS_RUN(HelloWorld_Entry); 

 5.業(yè)務(wù)代碼的編譯腳本 BUILD.gn

路徑:code\applications\sample\wifi-iot\app\hello_world\BUILD.gn

  1. static_library("hello_world_app") { 
  2.     sources = [ 
  3.         "hello_world.c" 
  4.     ] 
  5.  
  6.     include_dirs = [ 
  7.         "//utils/native/lite/include"
  8.         "//kernel/liteos_m/components/cmsis/2.0"
  9.         "//base/iot_hardware/interfaces/kits/wifiiot_lite"
  10.     ] 

 6.模塊的編譯腳本BUILD.gn

路徑:code\applications\sample\wifi-iot\app\BUILD.gn

  1. import("//build/lite/config/component/lite_component.gni"
  2.  
  3. lite_component("app") { 
  4.     features = [ 
  5.         "startup"
  6.         "hello_world:hello_world_app"
  7.     ] 

 想了解更多內(nèi)容,請?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū) 

https://harmonyos.51cto.com/#zz

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2020-11-10 12:08:25

開發(fā)框架

2020-11-23 13:09:42

HI3861

2020-12-21 09:57:52

OLED溫濕度計(jì)hi3861

2015-08-26 10:14:28

2021-03-09 09:56:42

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT

2021-01-15 15:36:32

人工智能智能家居機(jī)器人

2020-11-24 10:05:54

人工智能

2019-12-24 19:31:27

智能家居物聯(lián)網(wǎng)技術(shù)

2015-09-28 09:37:49

2015-10-15 10:32:48

WiFi物聯(lián)網(wǎng)智能家居

2020-10-26 10:21:39

Wi-Fi IoT智能家居套件

2014-07-15 09:50:08

WiFi聯(lián)網(wǎng)  

2020-12-18 11:54:43

物聯(lián)網(wǎng)安全智能家居IOT

2020-12-30 11:02:34

鴻蒙HarmonyOS智能家居

2021-12-13 22:50:16

物聯(lián)網(wǎng)智能家居數(shù)據(jù)

2023-05-16 09:53:18

ChatGPT人工智能

2019-04-24 12:22:05

2018-12-25 13:45:54

Fedora IoT樹莓派Linux

2018-09-19 16:20:17

智能系統(tǒng)開源

2020-11-04 13:20:14

HiSpark
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號