发帖
1 0 0

Ai-WB2-32S-Kit评测内容1-彩色小灯

Jack_Jack
注册会员

1

主题

0

回帖

129

积分

注册会员

积分
129
Ai-WB2系列 21 1 3 小时前

1、环境搭建

环境参考
链接是这个:https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=45813&highlight=Vs%2BCode
VSCode的安装教程在CSDN有很多,插件也跟着装好。

2、点亮小灯

第一步就是编译例程里的blink,点亮一下开发板
第二步,看原理图找引脚

image.png

第三步,改例程点亮验证一下

①任务实现代码

#define GPIO_LED_BLUE 3        //pwmch3
#define GPIO_LED_RED  14       //ch4
#define GPIO_LED_GREEN 17      //ch2

void blink_test(void *param)
{

  uint8_t value = 1;
  while (1)
    {
      // bl_gpio_enable_output(GPIO_LED_BLUE, 0, 1);
      bl_gpio_enable_output(GPIO_LED_GREEN, 0, 0);
      // bl_gpio_enable_output(GPIO_LED_RED, 0, 0);
      printf("Turning the LED %s! \r\n", value == 1 ? "ON" : "OFF");
      // bl_gpio_output_set(GPIO_LED_BLUE, value);
      bl_gpio_output_set(GPIO_LED_GREEN, value);
      // bl_gpio_output_set(GPIO_LED_RED, value);
      value = !value;
      vTaskDelay(1000);
  }
}

②实现效果

cf2cafed3ab5330fc380e74c5a1480c0.jpg
这里有问题,不知道为什么蓝灯也会亮。↓

fb47a39253fbb609b8d442b745268e80.jpg

第四步,基于HSV模型实现彩虹灯,
色相(H):0-360°,控制颜色类型(红/绿/蓝等),
饱和度(S):0-100%,控制颜色纯度,
亮度(V):0-100%,控制明暗变化(呼吸效果核心参数)。

①HSV转化成RGB

typedef struct { float h, s, v; } HSV;//色相,饱和度,亮度
typedef struct { uint8_t r, g, b; } RGB;

// HSV转RGB函数
RGB hsv_to_rgb(HSV hsv)
 {
float h = fmod(hsv.h, 360.0f);
if (h < 0) h += 360.0f;float s = hsv.s;
float v = hsv.v;

float c = v * s;
float x = c * (1 - fabs(fmod(h / 60.0f, 2) - 1));
float m = v - c;

float r, g, b;

if (h >= 0 && h < 60) { r = c; g = x; b = 0; }
else if (h >= 60 && h < 120) { r = x; g = c; b = 0; }
else if (h >= 120 && h < 180) { r = 0; g = c; b = x; }
else if (h >= 180 && h < 240) { r = 0; g = x; b = c; }
else if (h >= 240 && h < 300) { r = x; g = 0; b = c; }
else { r = c; g = 0; b = x; }

r = (r + m);
g = (g + m);
b = (b + m);

return (RGB){
    .r = (uint8_t)fmin(fmax(r * 255, 0), 255),
    .g = (uint8_t)fmin(fmax(g * 255, 0), 255),
    .b = (uint8_t)fmin(fmax(b * 255, 0), 255)
  };

}

②任务函数具体实现

void test3(void *param)  
{  
      HSV hsv = {0, 1.0, 1.0};   
      float t = 0;

      bl_pwm_init(3, 3, 50000);
      bl_pwm_stop(3);
      bl_pwm_init(4, 14, 50000);
      bl_pwm_stop(4);
      bl_pwm_init(2, 17, 50000);
      bl_pwm_stop(2);

while(1) {
  
    hsv.h = fmod(t * 20, 360);
    hsv.v = 0.8 + 0.2 * sin(t * 0.5);
  
    RGB rgb = hsv_to_rgb(hsv);
  
    // 颜色校准,可有可无
    const float red_gain = 1.0;
    const float green_gain = 0.9;
    const float blue_gain = 1.3;
  
    //前面都是按照255算的颜色,调用函数的话占空比范围为0-100
    bl_pwm_set_duty(3, rgb.b * blue_gain * 100 / 255);
    bl_pwm_set_duty(4, rgb.r * red_gain * 100 / 255);
    bl_pwm_set_duty(2, rgb.g * green_gain * 100 / 255);
  
    bl_pwm_start(3);
    bl_pwm_start(4);
    bl_pwm_start(2);
  
    t += 0.05;
    vTaskDelay(pdMS_TO_TICKS(20));
    }

}

③主函数

void main(void)
{
    xTaskCreate(test3, "test3", 1024, NULL, 15, NULL);
}

④显示效果

──── 0人觉得很赞 ────

使用道具 举报

不错不错~
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28758 个
  • 话题数: 41067 篇