HarmonyOS 鸿蒙Next Hi3861:自家开发版上实现三色灯的变化

HarmonyOS 鸿蒙Next Hi3861:自家开发版上实现三色灯的变化

这里使用的是hi3861的三色灯板块,实现的是三色灯的变换,可以设置三色灯变换的次数,灯光变换的频率。

#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);
        }
    }

    for (int i = 1; i <= PWM_FREQ_DIVITION; i *= 2) {
        PwmStart(WIFI_IOT_PWM_PORT_PWM2, i, PWM_FREQ_DIVITION);
        usleep(250000);
        PwmStop(WIFI_IOT_PWM_PORT_PWM2);
    }

    for (int i = 1; i <= PWM_FREQ_DIVITION; i *= 2) {
        PwmStart(WIFI_IOT_PWM_PORT_PWM3, i, PWM_FREQ_DIVITION);
        usleep(250000);
        PwmStop(WIFI_IOT_PWM_PORT_PWM3);
    }

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

static void jltfcloudcn(void)
{
    osThreadAttr_t attr;

    GpioInit();
    attr.name = "jltfcloudcom";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 4096;
    attr.priority = osPriorityNormal;

    if (osThreadNew(jltfcloudcom, NULL, &attr) == NULL) {
        printf("[jltfcloudcn] Failed to create jltfcloudcom!\n");
    }
}

APP_FEATURE_INIT(jltfcloudcn);

以上功能实现,参考了网络上部分的公开代码。


更多关于HarmonyOS 鸿蒙Next Hi3861:自家开发版上实现三色灯的变化的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

HarmonyOS鸿蒙Next Hi3861开发板上实现三色灯的变化,可以通过鸿蒙系统的轻量级设备开发框架来实现。Hi3861是一款支持Wi-Fi的芯片,适用于智能家居等场景。三色灯通常由红、绿、蓝三个LED组成,通过控制这三个LED的亮灭和亮度,可以实现不同颜色的变化。

在鸿蒙系统中,可以使用PWM(脉宽调制)来控制LED的亮度。首先,需要在device.h文件中定义三个GPIO引脚,分别对应红、绿、蓝三个LED。然后,在main.c文件中初始化这些GPIO引脚,并配置为PWM输出模式。

接下来,可以通过调整PWM的占空比来控制每个LED的亮度。占空比越高,LED的亮度越强;占空比越低,LED的亮度越弱。通过组合不同LED的亮度,可以生成各种颜色。例如,红色LED全亮,绿色和蓝色LED关闭,显示红色;红色和绿色LED全亮,蓝色LED关闭,显示黄色。

在代码中,可以使用hi_pwm_init函数初始化PWM,使用hi_pwm_start函数启动PWM输出,并通过hi_pwm_set_duty函数设置占空比。通过循环调整三个LED的占空比,可以实现三色灯的渐变效果。

例如,以下代码片段展示了如何设置红色LED的亮度:

hi_pwm_init(HI_PWM_PORT_PWM0); // 初始化PWM0
hi_pwm_set_clock(PWM_CLK_160M); // 设置PWM时钟
hi_pwm_start(HI_PWM_PORT_PWM0, 1000, 500); // 启动PWM0,周期1000,占空比500

通过类似的方式,可以控制绿色和蓝色LED的亮度,从而实现三色灯的变化。

更多关于HarmonyOS 鸿蒙Next Hi3861:自家开发版上实现三色灯的变化的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next的Hi3861开发板上实现三色灯的变化,可以通过控制GPIO引脚来驱动RGB LED。首先,确保RGB LED的三个引脚分别连接到Hi3861的GPIO引脚。然后,使用HarmonyOS的GPIO API(如GpioSetDirGpioWrite)来控制每个引脚的高低电平,从而改变LED的颜色。通过调整红、绿、蓝三个引脚的输出组合,可以实现不同颜色的变化。还可以使用PWM调节亮度,实现更丰富的色彩效果。

回到顶部