HarmonyOS鸿蒙Next中Hi3861炫彩灯、蜂鸣音学习练习效果展示与代码分享

HarmonyOS鸿蒙Next中Hi3861炫彩灯、蜂鸣音学习练习效果展示与代码分享 蛟龙腾飞南向设备研修日志展示,不足之处欢迎大家指正。因为文章不能插入视频,用截图展示。

使用炫彩灯板,经过 Linux 的编译,以及 HiBurn 的烧录,执行的效果炫彩灯板中的灯光会依据红绿蓝依次闪烁 3 次。

图像

代码如下:

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_pwm.h"
#include "wifiiot_adc.h"
#include "wifiiot_errno.h"

#define LED_DELAY_TIME_US 300000
#define LED_BRIGHT WIFI_IOT_GPIO_VALUE1
#define LED_DARK WIFI_IOT_GPIO_VALUE0

#define NUM_BLINKS 2

static void jltfcloudcom(void *arg)
{
    (void)arg;

    IoSetFunc(RED_LED_PIN_NAME, RED_LED_PIN_FUNCTION);
    IoSetFunc(GREEN_LED_PIN_NAME, GREEN_LED_PIN_FUNCTION);
    IoSetFunc(BLUE_LED_PIN_NAME, BLUE_LED_PIN_FUNCTION);

    GpioSetDir(RED_LED_PIN_NAME, WIFI_IOT_GPIO_DIR_OUT);
    GpioSetDir(GREEN_LED_PIN_NAME, WIFI_IOT_GPIO_DIR_OUT);
    GpioSetDir(BLUE_LED_PIN_NAME, WIFI_IOT_GPIO_DIR_OUT);

    for(int i = 0; i <= NUM_BLINKS; i++)
    {
        for(unsigned int j = 0; j < sizeof(pins)/sizeof(pins[0]); j++)
        {
            GpioSetOutputVal(pins[j], LED_BRIGHT);
            usleep(LED_DELAY_TIME_US);
            GpioSetOutputVal(pins[j], LED_DARK);
        }
    }
}

APP_FEATURE_INIT(jltfcloudcom);

这里使用炫彩灯板的三色灯演示灯光频率的大小,使用到了 PWM,控制灯光的频率,灯光颜色逐渐变亮。

这里也是红绿蓝依次闪烁 2 次:

图像

代码如下:

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_pwm.h"
#include "wifiiot_adc.h"
#include "wifiiot_errno.h"

#define LED_DELAY_TIME_US 300000
#define LED_BRIGHT WIFI_IOT_GPIO_VALUE1
#define LED_DARK WIFI_IOT_GPIO_VALUE0

#define RED_LED_PIN_NAME WIFI_IOT_IO_NAME_GPIO_10
#define RED_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_10_GPIO
#define GREEN_LED_PIN_NAME WIFI_IOT_IO_NAME_GPIO_11
#define GREEN_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_11_GPIO
#define BLUE_LED_PIN_NAME WIFI_IOT_IO_NAME_GPIO_12
#define BLUE_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_12_GPIO

#define NUM_BLINKS 2

#define PWM_FREQ_DIVITION 64000

static void jltfcloudcom(void *arg)
{
    (void)arg;

    IoSetFunc(RED_LED_PIN_NAME, WIFI_IOT_IO_FUNC_GPIO_10_PWM1_OUT);
    IoSetFunc(GREEN_LED_PIN_NAME, WIFI_IOT_IO_FUNC_GPIO_11_PWM2_OUT);
    IoSetFunc(BLUE_LED_PIN_NAME, WIFI_IOT_IO_FUNC_GPIO_12_PWM3_OUT);

    PwmInit(WIFI_IOT_PWM_PORT_PWM1);
    PwmInit(WIFI_IOT_PWM_PORT_PWM2);
    PwmInit(WIFI_IOT_PWM_PORT_PWM3);

    static const WifiIotGpioIdx pins[] = {RED_LED_PIN_NAME, GREEN_LED_PIN_NAME, BLUE_LED_PIN_NAME};

    for(int i = 1; i <= NUM_BLINKS; i++)
    {
        for(int i = 1; i <= PWM_FREQ_DIVITION; i *= 2)
        {
            PwmStart(WIFI_IOT_PWM_PORT_PWM1, i, PWM_FREQ_DIVITION);
            usleep(250000);
            PwmStop(WIFI_IOT_PWM_PORT_PWM1);
        }
    }
}
APP_FEATURE_INIT(jltfcloudcom);

接下来这里使用到了炫彩灯板的光敏电阻,控制灯光的亮暗,当光敏电阻被遮挡住,灯光变暗,不挡着灯光亮:

图像

代码如下:

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_pwm.h"
#include "wifiiot_adc.h"
#include "wifiiot_errno.h"

#define PWM_FREQ_DIVITION 64000
#define ADC_RESOLUTION 4996

static void jltfcloudcom(void *arg)
{
    (void)arg;

    IoSetFunc(RED_LED_PIN_NAME, WIFI_IOT_IO_FUNC_GPIO_10_PWM1_OUT);
    IoSetFunc(GREEN_LED_PIN_NAME, WIFI_IOT_IO_FUNC_GPIO_11_PWM2_OUT);
    IoSetFunc(BLUE_LED_PIN_NAME, WIFI_IOT_IO_FUNC_GPIO_12_PWM3_OUT);

    PwmInit(WIFI_IOT_PWM_PORT_PWM1);
    PwmInit(WIFI_IOT_PWM_PORT_PWM2);
    PwmInit(WIFI_IOT_PWM_PORT_PWM3);

    while(1)
    {
        unsigned short data = 0;
        unsigned short duty = 0;

        if(AdcRead(HUMAN_SENSOR_CHAN_NAME, &data, WIFI_IOT_ADC_EQU_MODEL_4, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 0) == WIFI_IOT_SUCCESS)
        {
            printf("data:%d", data);
            duty = PWM_FREQ_DIVITION * (1948 - (unsigned int)data) / ADC_RESOLUTION;
        }

        PwmStart(WIFI_IOT_PWM_PORT_PWM2, duty, PWM_FREQ_DIVITION);
        usleep(100000);
        PwmStop(WIFI_IOT_PWM_PORT_PWM2);
    }
}
APP_FEATURE_INIT(jltfcloudcom);

这里还用到了三色灯板上面的红外感应器的功能,当人体靠近,红外感应感受到了,灯光变亮,未感受到变暗:

图像

还用到了三色灯板的蜂鸣器,演唱两只老虎的旋律:

图像

图像

12 回复

要的就是这个,很棒

更多关于HarmonyOS鸿蒙Next中Hi3861炫彩灯、蜂鸣音学习练习效果展示与代码分享的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


是C写的吗,好喜欢,C51单板机下载比较麻烦,这个麻烦不

膜拜呀,请接受我的膝盖

这才是我需要的,谢谢你的分享

看上去不错

果然有说道呀

不错,还是相当高明的

如何吃透,交个方法吧

挺不错的内容

在HarmonyOS鸿蒙Next中,Hi3861炫彩灯和蜂鸣音的学习练习效果展示与代码分享主要涉及鸿蒙系统的设备控制和驱动开发。Hi3861是一款基于ARM Cortex-M4的Wi-Fi SoC,广泛应用于物联网设备中。

炫彩灯的控制通常通过PWM(脉宽调制)实现,Hi3861支持多路PWM输出,可以控制RGB LED的颜色和亮度。在鸿蒙系统中,可以通过hi_pwm.h头文件中的API进行PWM配置和控制。例如,使用hi_pwm_init初始化PWM通道,hi_pwm_start启动PWM输出,hi_pwm_set_duty设置占空比以调整亮度。

蜂鸣音的控制则通过GPIO或PWM实现。Hi3861支持GPIO输出,可以通过hi_gpio.h头文件中的API控制蜂鸣器的开关。例如,使用hi_gpio_init初始化GPIO引脚,hi_gpio_set_output设置引脚输出高低电平以控制蜂鸣器的发声。如果需要更复杂的音调控制,可以使用PWM输出不同频率的方波。

代码示例可能包括以下部分:

  1. 初始化PWM和GPIO。
  2. 配置PWM通道和占空比以控制炫彩灯颜色。
  3. 配置GPIO引脚以控制蜂鸣器发声。
  4. 主循环中实现灯效和音效的变化。

这些代码可以在鸿蒙开发环境中编译和烧录到Hi3861开发板上,实现炫彩灯和蜂鸣音的效果展示。

在HarmonyOS鸿蒙Next中,使用Hi3861开发板实现炫彩灯和蜂鸣音效果,可以通过PWM(脉宽调制)控制LED灯的颜色变化,以及GPIO控制蜂鸣器的发声。以下是一个简单的代码示例:

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_pwm.h"

#define LED_PIN 9  // LED控制引脚
#define BUZZER_PIN 10  // 蜂鸣器控制引脚

void led_task(void) {
    while (1) {
        // 控制LED颜色变化
        IoTGpioSetOutputVal(LED_PIN, 1);  // 点亮LED
        osDelay(500);
        IoTGpioSetOutputVal(LED_PIN, 0);  // 熄灭LED
        osDelay(500);
    }
}

void buzzer_task(void) {
    while (1) {
        // 控制蜂鸣器发声
        IoTGpioSetOutputVal(BUZZER_PIN, 1);  // 打开蜂鸣器
        osDelay(200);
        IoTGpioSetOutputVal(BUZZER_PIN, 0);  // 关闭蜂鸣器
        osDelay(200);
    }
}

void app_main(void) {
    // 初始化GPIO
    IoTGpioInit(LED_PIN);
    IoTGpioInit(BUZZER_PIN);
    IoTGpioSetDir(LED_PIN, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BUZZER_PIN, IOT_GPIO_DIR_OUT);

    // 创建任务
    osThreadNew(led_task, NULL, NULL);
    osThreadNew(buzzer_task, NULL, NULL);
}

SYS_RUN(app_main);

此代码通过两个任务分别控制LED灯和蜂鸣器,LED灯以500ms的间隔闪烁,蜂鸣器以200ms的间隔发声。通过调整延时参数,可以实现不同的效果。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!