commit
77eee5e02e
|
@ -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"
|
||||
]
|
||||
}
|
|
@ -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时,蜂鸣。
|
||||
|
||||
|
||||
|
||||
|
|
@ -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 <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#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);
|
Loading…
Reference in New Issue