这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » Let'sdo2025年第2期—智能手环DIY活动过程帖

共1条 1/1 1 跳转至

Let'sdo2025年第2期—智能手环DIY活动过程帖

助工
2025-10-12 01:12:00     打赏

1、开发环境的搭建有很多论坛的朋友已经发过了,这里就不在赘述了。

2、过程贴就先实现第一个任务点亮RGB吧!不过简单的点亮并没有什么太大的意思,既然是RGB灯珠那就来个简单粗暴的渐变霓虹灯吧(没有加入成功视频,提示格式不支持

那就只展示代码和图片吧)

image.png

(每 2° 递增色相,形成 180 个彩虹过渡色,55hz的频率)

#include "mxc_device.h"
#include "mxc_delay.h"
#include "gpio.h"
#include "board.h"

#include <stdint.h>
#include <stddef.h>

static const mxc_gpio_cfg_t rgb_red_pin = {
    MXC_GPIO2, MXC_GPIO_PIN_0, MXC_GPIO_FUNC_OUT,
    MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0};

static const mxc_gpio_cfg_t rgb_green_pin = {
    MXC_GPIO2, MXC_GPIO_PIN_1, MXC_GPIO_FUNC_OUT,
    MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0};

static const mxc_gpio_cfg_t rgb_blue_pin = {
    MXC_GPIO2, MXC_GPIO_PIN_2, MXC_GPIO_FUNC_OUT,
    MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH, MXC_GPIO_DRVSTR_0};

static void rgb_apply_pwm(uint8_t r, uint8_t g, uint8_t b, uint32_t duration_ms)
{
    const uint32_t frame_us = 1000;
    uint32_t cycles = duration_ms;
    if (cycles == 0)
    {
        cycles = 1;
    }

    for (uint32_t c = 0; c < cycles; ++c)
    {
        uint32_t r_on = ((uint32_t)r * frame_us) / 255U;
        uint32_t g_on = ((uint32_t)g * frame_us) / 255U;
        uint32_t b_on = ((uint32_t)b * frame_us) / 255U;

        if (r_on)
        {
            MXC_GPIO_OutClr(rgb_red_pin.port, rgb_red_pin.mask);
            MXC_Delay(MXC_DELAY_USEC(r_on));
            MXC_GPIO_OutSet(rgb_red_pin.port, rgb_red_pin.mask);
        }

        if (g_on)
        {
            MXC_GPIO_OutClr(rgb_green_pin.port, rgb_green_pin.mask);
            MXC_Delay(MXC_DELAY_USEC(g_on));
            MXC_GPIO_OutSet(rgb_green_pin.port, rgb_green_pin.mask);
        }

        if (b_on)
        {
            MXC_GPIO_OutClr(rgb_blue_pin.port, rgb_blue_pin.mask);
            MXC_Delay(MXC_DELAY_USEC(b_on));
            MXC_GPIO_OutSet(rgb_blue_pin.port, rgb_blue_pin.mask);
        }

        uint32_t used = r_on + g_on + b_on;
        if (used < frame_us)
        {
            MXC_Delay(MXC_DELAY_USEC(frame_us - used));
        }
    }
}

static void hsv_to_rgb(uint16_t hue, uint8_t sat, uint8_t val,
                       uint8_t *r, uint8_t *g, uint8_t *b)
{
    if (sat == 0U)
    {
        *r = *g = *b = val;
        return;
    }

    hue %= 360U;
    uint16_t region = hue / 60U;
    uint16_t remainder = (hue % 60U) * 255U / 60U;

    uint32_t p = ((uint32_t)val * (255U - sat)) / 255U;
    uint32_t q = ((uint32_t)val * (255U - ((uint32_t)sat * remainder) / 255U)) / 255U;
    uint32_t t = ((uint32_t)val * (255U - ((uint32_t)sat * (255U - remainder)) / 255U)) / 255U;

    switch (region)
    {
    case 0:
        *r = val;
        *g = (uint8_t)t;
        *b = (uint8_t)p;
        break;
    case 1:
        *r = (uint8_t)q;
        *g = val;
        *b = (uint8_t)p;
        break;
    case 2:
        *r = (uint8_t)p;
        *g = val;
        *b = (uint8_t)t;
        break;
    case 3:
        *r = (uint8_t)p;
        *g = (uint8_t)q;
        *b = val;
        break;
    case 4:
        *r = (uint8_t)t;
        *g = (uint8_t)p;
        *b = val;
        break;
    default:
        *r = val;
        *g = (uint8_t)p;
        *b = (uint8_t)q;
        break;
    }
}

static void RGB_Init(void)
{
    MXC_GPIO_Config(&rgb_red_pin);
    MXC_GPIO_Config(&rgb_green_pin);
    MXC_GPIO_Config(&rgb_blue_pin);
    MXC_GPIO_OutSet(rgb_red_pin.port, rgb_red_pin.mask);
    MXC_GPIO_OutSet(rgb_green_pin.port, rgb_green_pin.mask);
    MXC_GPIO_OutSet(rgb_blue_pin.port, rgb_blue_pin.mask);
}

int main(void)
{
    if (Board_Init() != E_NO_ERROR)
    {
        return -1;
    }

    RGB_Init();

    uint16_t hue = 0;
    while (1)
    {
        uint8_t r, g, b;
        hsv_to_rgb(hue, 255U, 255U, &r, &g, &b);
        rgb_apply_pwm(r, g, b, 18U); // 55hz

        hue = (uint16_t)((hue + 2U) % 360U);
    }

    return 0;
}



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]