Harmonyos4.WiFiIoT智能家居套件——LED灯、按钮、蜂鸣器的实现/#zz这次在3.helloworld的基础上,增加了点亮LED灯、按钮操作、蜂鸣器的功能。这个时候就需要用到红黄绿灯扩展板了。添加这三个函数的主要原因是这些函数都是比较简单的函数,将这三个函数组合起来可以实现更有趣的功能。实现功能:按下扩展板上的按键,蜂鸣器响起,红黄绿灯按红黄绿全灭的顺序点亮,按键抬起,同时蜂鸣器停止鸣响。本代码借鉴了唐作霖老师的教程:实现按键“按下事件”和“释放事件”的总体框架(V0.0.1)1.点亮LED灯,利用GPIO的输出功能,高电平点亮,低电平关断。主要调用wifiiot_gpio.c中的以下函数实现GPIO初始化作为输出函数,控制IO输出高低电平unsignedintIoSetFunc(WifiIotIoNameid,unsignedcharval)//选择IO的功能(GPIO、I2C、SPI、PWM等).)unsignedintGpioSetDir(WifiIotGpioIdxid,WifiIotGpioDirdir)//设置为输出或输入unsignedintGpioSetOutputVal(WifiIotGpioIdxid,WifiIotGpioValueval)//设置输出值示例:IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10,0WIFI_IOT_IO_FUNC_GPIO_10_GPIO);//IO10设置为GPIOGpioSetDir(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_GPIO_DIR_OUT);//IO10设置为输出GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_GPIO_VALUE1);//IO10输出高电平GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10,WIFI_IOT_GPIO_VALUE0);//IO10输出低电平下降沿)和keyup(上升沿)对中断不熟悉的朋友请参考唐作霖老师教程:实现按键“按下事件”和“释放事件”的通用框架(V0.0.1)这里只介绍到几个函数列IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_IO_FUNC_GPIO_8_GPIO);//IO复用为GPIO功能GpioSetDir(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_GPIO_DIR_IN);//设置为输入IoSetPull(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_IO_PULL_UP);//输入带上拉GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,OnButtonPressed_isr,NULL);//注册中断服务函数,边沿触发,下降沿触发,按键按下后,中断服务函数OnButtonPressed_isr3,蜂鸣器,主要用到PWM功能,即脉宽调制,通过调整占空比,可以控制输出电平,使蜂鸣器发出不同的声音,PWM也用于电机控制注意,要使用PWM功能,需要开启PWM功能:修改vendor\hisi\hi3861\hi3861\build\config\usr_config.mk文件中CONFIG_PWM_SUPPORT这一行:#CONFIG_PWM_SUPPORTisnotsettoCONFIG_PWM_SUPPORT=y,otherwiseitwillcompile失败IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//IO复用为PWM功能GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_GPIO_DIR_OUT);//设置为输出PwmInit(WIFI_IOT_PWM_PORT_PWM0);//初始化PWMPwmStart(WIFI_IOT_PWM_PORT_PWM0,5*1000,40*1000);//启动PWM功能,这里不做详细解释,会单独开个帖子解释参数的含义PwmStop(WIFI_IOT_PWM_PORT_PWM0);//停止PWM4.代码hello_world.c路径:code\applications\sample\wifi-iot\app\hello_world\hello_world.c/*November8,2020作者:hcl0317链接:实现功能:使用红绿灯扩展板,按下按钮点亮a灯,按下按钮时,蜂鸣器发出声音,当按钮抬起时,蜂鸣器发出声音设备主要功能点停止:1.GPIO输出->LED灯2.GPIO输入中断->按键3.PWM功能->蜂鸣器*///扩展板上的红黄绿灯,对应GPIO10、11、12,高电平亮,低电平灭staticWifiIotIoNameLightGPIO[]={WIFI_IOT_IO_NAME_GPIO_10,//红灯WIFI_IOT_IO_NAME_GPIO_12,//黄灯WIFI_IOT_IO_NAME_GPIO_11//绿灯};//扩展板按键红黄绿灯staticintvolatileBtnPressed=0;//1表示按下,0表示抬起staticintvolatileBtnPressed_idx=0;//staticvoidOnButtonPressed_isr(char*arg);//按键按下中断处理函数staticvoidOnButtonReleased_isr(char*arg);//按键释放中断处理函数/*这里有两个中断服务例程是基于唐作霖老师的代码,因为在鸿蒙框架中以上,IO中断只能注册为上升沿触发或下降沿触发,不能注册为任何边沿触发。检测按键抬起在按键抬起中断服务程序中,注册下降沿中断服务程序检测按键按下,从而实现并检测按键的抬起和按下*/staticvoidOnButtonPressed_isr(char*arg){(void)arg;printf("[HelloWorld]OnButtonPressed()\n");BtnPressed=1;BtnPressed_idx++;BtnPressed_idx%=4;GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH,OnButtonReleased_isr,NULL);}staticvoidOnButtonReleased_isr(char*arg){(void)arg;printf([HelloWorld]OnButtonReleased()\n");BtnPressed=0;GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,OnButtonPressed_isr,NULL);处理函数}/stat/stat/task=arg){inti;(void)arg;printf([HelloWorld]HelloWorld_Task()\n");GpioInit();//使用GPIO时,需要调用此接口//扩展板上的红黄绿灯,对应LEDGPIO10,11,12初始化打印函数("LEDGPIOinit...\r\n");for(i=0;i<3;i++){//MultiplexpinisGPIOIoSetFunc(LightGPIO[i],0);//SetasoutputGpioSetDir(LightGPIO[i],WIFI_IOT_GPIO_DIR_OUT);}//Red,yellowandgreenlightexpansionboard,thecorrespondingkeyGPIO8isinitializedasGPIO,inputprintf("KEYGPIOinit...\r\n");IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_IO_FUNC_GPIO_8_GPIO);//GPIOGpioSetDir(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_GPIO_DIR_IN);//设置为输入IoSetPull(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_IO_PULL_UP);GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW,OnButtonPressed_isr,NULL);//红黄绿灯扩展板上,对应的蜂鸣器GPIO9初始化为PWM功能printf("PWMGPIOinit...\r\n");IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);//PWMGpioSetDir(WIFI_IOT_IO_NAME_GPIO_9,WIFI_IOT_GPIO_DIR_OUT);//设置为输出PwmInit(WIFI_IOT_PWM_PORT_PWM0);//初始化PWMwhile(1){//logiccodefortask//Pressabuttontoturnonalightintj=0;for(j=0;j<3;j++){if(BtnPressed_idx==j){GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE1);//Highlevel,turnonthelight}else{GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE0);//关灯}}#if0//开水灯for(j=0;j<3;j++){GpioSetOutputVal(LightGPIO[j],WIFI_IOT_GPIO_VALUE0);//开水灯offalllights}i=(i+1)%3;GpioSetOutputVal(LightGPIO[i],WIFI_IOT_GPIO_VALUE1);//高电平,开灯sleep(1);//延时1秒#endif//的处理按键触发if(BtnPressed){PwmStart(WIFI_IOT_PWM_PORT_PWM0,5*1000,40*1000);//按键按下,蜂鸣器响}else{PwmStop(WIFI_IOT_PWM_PORT_PWM0);//按键抬起,蜂鸣器停止}//usleep(500000);usleep(100000);}returnNULL;}//2.任务入口函数staticvoidHelloWorld_Entry(void){osThreadAttr_tattr={0};printf("[HelloWorld]HelloWorld_Entry()\n");attr.name="HelloWorld_Task";attr.attr_bits=0U;attr.cb_mem=NULL;attr.cb_size=0U;attr.stack_mem=NULL;attr.stack_size=1024;//堆栈大小attr.priority=osPriorityNormal;//优先级if(osThreadNew((osThreadFunc_t)HelloWorld_Task,NULL,&attr)==NULL){printf("[HelloWorld]FaliedtocreateLedTask!\n");}}//3.注册模块SYS_RUN(HelloWorld_Entry);5.业务代码编译脚本BUILD.gn路径:code\applications\sample\wifi-iot\app\hello_world\BUILD.gnstatic_library("hello_world_app"){sources=["hello_world.c"]include_dirs=["//utils/native/lite/include","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/interfaces/kits/wifiiot_lite",]}6.模块编译脚本BUILD.gn路径:code\applications\sample\wifi-iot\app\BUILD.gnimport("//build/lite/config/component/lite_component.gni")lite_component("app"){features=["startup","hello_world:hello_world_app",]}更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com/#zz
