diff --git a/applications/app/TW202_Module_traffic_light/BUILD.gn b/applications/app/TW202_Module_traffic_light/BUILD.gn new file mode 100755 index 00000000..9358c88f --- /dev/null +++ b/applications/app/TW202_Module_traffic_light/BUILD.gn @@ -0,0 +1,24 @@ +# Copyright (c) 2021 Talkweb Co.,ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +static_library("module_traffic_light_example") { + sources = [ + "traffic_light_example.c" + ] + + include_dirs = [ + "//utils/native/lite/include", + "//kernel/liteos_m/kal/cmsis", + "//base/iot_hardware/peripheral/interfaces/kits" + ] +} diff --git a/applications/app/TW202_Module_traffic_light/README.md b/applications/app/TW202_Module_traffic_light/README.md new file mode 100755 index 00000000..85a96092 --- /dev/null +++ b/applications/app/TW202_Module_traffic_light/README.md @@ -0,0 +1,75 @@ +# OpenHarmony模组开发-灯光控制和蜂鸣器使用 + +本案例使用到了四组LED灯、蜂鸣器和按键。通过按键每次按下来控制不同的灯亮以及改变蜂鸣器的状态、实现蜂鸣器的鸣叫。 + +# 目录结构: + +## src + traffic_light_example.c --灯光和蜂鸣器控制源文件 + + +# 相关API介绍 + ## traffic_light_example demo + IoTWatchDogDisable: 关闭看门狗函数 + + IoTGpioInit(unsigned int id): 初始化GPIO + 参数说明: + –id Indicates the GPIO pin number. + + IotIoSetFunc(IOT_GPIO_IO_NAME id, unsigned char val): 注册功能 + 参数说明: + -id Indicates the GPIO pin number. + -val 复用功能 + + IoTGpioSetDir(unsigned int id, IotGpioDir dir):Sets the direction for a GPIO pin. + 参数说明: + -id Indicates the GPIO pin number. + -dir IO方向 + + IotIoSetPull(IOT_GPIO_IO_NAME id, IOT_IO_PULL val):设置GPIO为上拉或下拉 + 参数说明: + -id Indicates the GPIO pin number. + -val 上拉或下拉 + + IoTGpioRegisterIsrFunc(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg): Enables the interrupt feature for a GPIO pin. + 参数说明: + -id Indicates the GPIO pin number. + -intType Indicates the interrupt type. + -intPolarity Indicates the interrupt polarity. + -func Indicates the interrupt callback function. + -arg Indicates the pointer to the argument used in the interrupt callback function. + + IoTGpioSetOutputVal(unsigned int id, IotGpioValue val):Sets the output level value for a GPIO pin. + 参数说明: + -id Indicates the GPIO pin number. + -val Indicates the output level value. + + IoTPwmInit(unsigned int port): Initializes a PWM device. + 参数说明: + -port Indicates the port number of the PWM device + + osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr):Creates an active thread. + 参数说明: + -func Indicates the entry of the thread callback function. + -argument Indicates the pointer to the argument passed to the thread. + -attr Indicates the thread attributes. + + IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq):Starts PWM signal output from a specified port based on the given output frequency and duty cycle. + 参数说明: + -port Indicates the port number of the PWM device. + -duty Indicates the duty cycle for PWM signal output. The value ranges from 1 to 99. + -freq Indicates the frequency for PWM signal output. + + IoTPwmStop(unsigned int port):Stops PWM signal output from a specified port. + 参数说明: + -port Indicates the port number of the PWM device. + + + +# 运行结果 + 先每个灯闪烁一下,亮2秒灭1秒,2遍,测试4个灯是否正常。 + 按键每按下一次,切换一次灯亮同时改变蜂鸣器状态,蜂鸣器状态为1时,蜂鸣。 + + + + diff --git a/applications/app/TW202_Module_traffic_light/traffic_light_example.c b/applications/app/TW202_Module_traffic_light/traffic_light_example.c new file mode 100755 index 00000000..a100e409 --- /dev/null +++ b/applications/app/TW202_Module_traffic_light/traffic_light_example.c @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2021 Talkweb Co.,ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include "ohos_init.h" +#include "cmsis_os2.h" +#include "iot_gpio.h" +#include "iot_watchdog.h" +#include "iot_pwm.h" +#include "hi_pwm.h" +#include "hi_io.h" + +//蜂鸣器PWM端口号 +#define HI_PWM_BEEP_PORT HI_PWM_PORT_PWM0 +//蜂鸣频率 +#define PWM_BEEP_FREQ (4 * 1000) +//蜂鸣占空比 +#define PWM_BEEP_DUTY (50) + +// 蜂鸣器开关状态 +static int gBeepState = 0; + +typedef struct +{ + IOT_GPIO_IO_NAME gpioName; //灯的GPIO + int ioFunc; //IO hi_io_func_gpio + IotGpioDir dir; //GPIO 方向 + IotGpioValue value; //灯当前值 +} TrafficLight; +//三色灯的状态数组,每个值代表某个颜色显示还是不显示 +// 当前灯序号 +static int gCurrentLightId = 0; +static TrafficLight lights[] = { + //red + {IOT_GPIO_IO_GPIO_10, + HI_IO_FUNC_GPIO_10_GPIO, + IOT_GPIO_DIR_OUT, + IOT_GPIO_VALUE0}, + //GREEN + {IOT_GPIO_IO_GPIO_11, + HI_IO_FUNC_GPIO_11_GPIO, + IOT_GPIO_DIR_OUT, + IOT_GPIO_VALUE0}, + //BLUE + {IOT_GPIO_IO_GPIO_12, + HI_IO_FUNC_GPIO_12_GPIO, + IOT_GPIO_DIR_OUT, + IOT_GPIO_VALUE0}, + //WHITE + {IOT_GPIO_IO_GPIO_5, + HI_IO_FUNC_GPIO_5_GPIO, + IOT_GPIO_DIR_OUT, + IOT_GPIO_VALUE0}}; +#define MAX_LIGHTS (sizeof(lights) / sizeof(lights[0])) + +/** + * 按键回调。每按一下,亮某个颜色,其他颜色不亮。同时控制蜂鸣器状态 + * \param arg 回调参数 + */ +static void +OnKeyPressed(char *arg) +{ + (void)arg; + + printf("key pressed c\n"); + + //只亮当前灯亮 + for (int i = 0; i < MAX_LIGHTS; i++) + { + if (i == gCurrentLightId) + { + lights[i].value = IOT_GPIO_VALUE1; + } + else + { + lights[i].value = IOT_GPIO_VALUE0; + } + } + //按一次键 切换一次当前灯 + gCurrentLightId++; + if (gCurrentLightId == MAX_LIGHTS) + { + gCurrentLightId = 0; + } + + //开关一次蜂鸣器 + gBeepState = !gBeepState; +} + +/** + * 线程入口 + * \param arg 线程参数 + * + */ +static void *LightTaskEntry(const char *arg) +{ + int i, j; + (void)arg; + + // 测试灯功能是否正常 + // 先每个灯闪烁一下,亮2秒灭1秒,2遍 + for (i = 0; i <= 1; i++) + { + for (j = 0; j < MAX_LIGHTS; j++) + { + IoTGpioSetOutputVal(lights[j].gpioName, IOT_GPIO_VALUE1); + usleep(200 * 1000); + + IoTGpioSetOutputVal(lights[j].gpioName, IOT_GPIO_VALUE0); + usleep(100 * 1000); + } + } + + //线程任务循环 + while (1) + { + // 每个灯的状态输出到GPIO + for (i = 0; i < MAX_LIGHTS; i++) + { + IoTGpioSetOutputVal(lights[i].gpioName, lights[i].value); + } + + // 根据蜂鸣器状态控制 + if (gBeepState) + { + // 第二个参数duty分频系数,第三个参数freq,160M时钟, + // freq,选择40K,占空达到一半,输出的是4K频率 + IoTPwmStart(HI_PWM_BEEP_PORT, PWM_BEEP_DUTY, PWM_BEEP_FREQ); //(WIFI_IOT_PWM_PORT_PWM0, 20*1000, 40*1000); + } + else + { + IoTPwmStop(HI_PWM_BEEP_PORT); + } + } + + return NULL; +} + +// 四色显示+蜂鸣。交通灯板,四色等对应 +//red:GPIO10 +//GREEN GPIO11 +//YELLOW GPIO12 +//WHITE GPIO13, +//蜂鸣器GPIO09/PWM0,按键中断GPIO08 +static void LightExampleEntry(void) +{ + IoTWatchDogDisable(); + //初始化灯的 GPIO 状态 + for (int i = 0; i < MAX_LIGHTS; i++) + { + TrafficLight *l = &lights[i]; + IoTGpioInit(l->gpioName); + //注册功能 + IotIoSetFunc(l->gpioName, l->ioFunc); + + //注册io方向 + IoTGpioSetDir(l->gpioName, l->dir); + } + //按键处理 + IoTGpioInit(IOT_GPIO_IO_GPIO_8); + IotIoSetFunc(IOT_GPIO_IO_GPIO_8, HI_IO_FUNC_GPIO_8_GPIO); + //上升 + IotIoSetPull(IOT_GPIO_IO_GPIO_8, IOT_IO_PULL_UP); + + IoTGpioSetDir(IOT_GPIO_IO_GPIO_8, IOT_GPIO_DIR_IN); + //注册按键回调 + IoTGpioRegisterIsrFunc(IOT_GPIO_IO_GPIO_8, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_RISE_LEVEL_HIGH, OnKeyPressed, NULL); + + //蜂鸣器GPIO09/PWM0 + IotIoSetFunc(IOT_GPIO_IO_GPIO_9, HI_IO_FUNC_GPIO_9_PWM0_OUT); + IoTGpioSetOutputVal(IOT_GPIO_IO_GPIO_9, IOT_GPIO_DIR_OUT); + // 初始化PWM设备,这里是蜂鸣器 + IoTPwmInit(HI_PWM_BEEP_PORT); + + // 设置线程属性 + osThreadAttr_t attr; + attr.name = "TrafficTask"; + attr.attr_bits = 0U; + attr.cb_mem = NULL; + attr.cb_size = 0U; + attr.stack_mem = NULL; + attr.stack_size = 1024; + attr.priority = osPriorityNormal; + + // 开启线程,执行LED任务。开启线程,避免主线程阻塞 + if (osThreadNew((osThreadFunc_t)LightTaskEntry, NULL, &attr) == NULL) + { + printf("TrafficLight thread Create failed."); + } +} + +SYS_RUN(LightExampleEntry);