小安派Eyes-S1 LVGL控制LED

[复制链接]
查看2036 | 回复9 | 2024-5-23 22:23:22 | 显示全部楼层 |阅读模式
本帖最后由 yuyy1989 于 2024-5-23 22:26 编辑

之前在屏幕上模拟控制LED,这次来试试控制真实的LED
刚好还有3个能直接用杜邦线连接的IO
微信截图_20240523221104.png
接这个LED模块
微信截图_20240523221113.png
初始化PWM
  1. struct bflb_device_s *gpio;
  2. struct bflb_device_s *pwm;

  3. void pwm_setrgb(uint8_t r,uint8_t g,uint8_t b)
  4. {
  5.     bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH1, 0, 255 - r);
  6.     bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, 0, 255 - b);
  7.     bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH2, 0, g);
  8. }
  9. void pwm_init()
  10. {
  11.     GLB_Set_PWM1_IO_Sel(GLB_PWM1_IO_DIFF_END);
  12.     gpio = bflb_device_get_by_name("gpio");
  13.     pwm = bflb_device_get_by_name("pwm_v2_0");
  14.     bflb_gpio_init(gpio, GPIO_PIN_2, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_1); //R CH1P
  15.     bflb_gpio_init(gpio, GPIO_PIN_21, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_1); //g CH2N
  16.     bflb_gpio_init(gpio, GPIO_PIN_22, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_1); //b CH3P
  17.     struct bflb_pwm_v2_config_s cfg = {
  18.         .clk_source = BFLB_SYSTEM_XCLK,
  19.         .clk_div = 40,
  20.         .period = 255,
  21.     };
  22.     bflb_pwm_v2_init(pwm, &cfg);
  23.     bflb_pwm_v2_channel_positive_start(pwm, PWM_CH1);
  24.     bflb_pwm_v2_channel_negative_start(pwm, PWM_CH2);
  25.     bflb_pwm_v2_channel_positive_start(pwm, PWM_CH3);
  26.     bflb_pwm_v2_start(pwm);
  27.     pwm_setrgb(255,0,0);
  28. }
复制代码
修改一下UI
微信截图_20240523221329.png
去掉了亮度的滑条,增加了RGB值的指示文字,色环长按可以依次切换饱和度、亮度、颜色调节,因此不需要额外的亮度调节控件,双击可以复位当前颜色、饱和度或亮度
在custom.c中增加自定义代码
  1. void hsv2rgb(uint16_t h, uint8_t s, uint8_t v,uint8_t *r,uint8_t *g,uint8_t *b)
  2. {
  3.     h %= 360; // h -> [0,360]
  4.     uint8_t rgb_max = v * 255 / 100;
  5.     uint8_t rgb_min = rgb_max * (100 - s) / 100;

  6.     uint8_t i = h / 60;
  7.     uint8_t diff = h % 60;

  8.     // RGB adjustment amount by hue
  9.     uint8_t rgb_adj = (rgb_max - rgb_min) * diff / 60;

  10.     switch (i) {
  11.     case 0:
  12.         *r = rgb_max;
  13.         *g = rgb_min + rgb_adj;
  14.         *b = rgb_min;
  15.         break;
  16.     case 1:
  17.         *r = rgb_max - rgb_adj;
  18.         *g = rgb_max;
  19.         *b = rgb_min;
  20.         break;
  21.     case 2:
  22.         *r = rgb_min;
  23.         *g = rgb_max;
  24.         *b = rgb_min + rgb_adj;
  25.         break;
  26.     case 3:
  27.         *r = rgb_min;
  28.         *g = rgb_max - rgb_adj;
  29.         *b = rgb_max;
  30.         break;
  31.     case 4:
  32.         *r = rgb_min + rgb_adj;
  33.         *g = rgb_min;
  34.         *b = rgb_max;
  35.         break;
  36.     default:
  37.         *r = rgb_max;
  38.         *g = rgb_min;
  39.         *b = rgb_max - rgb_adj;
  40.         break;
  41.     }
  42. }

  43. void custom_ColorChanged(lv_color_hsv_t hsv)
  44. {
  45.     uint8_t r,g,b;
  46.     hsv2rgb(hsv.h,hsv.s,hsv.v,&r,&g,&b);
  47.     lv_label_set_text_fmt(guider_ui.screen_label_1,"R:%d G:%d B:%d",r,g,b);
  48.     pwm_setrgb(r,g,b);
  49. }

  50. void custom_OnOffChanged(uint8_t on)
  51. {
  52.     if(on == 0)
  53.         pwm_setrgb(0,0,0);
  54.     else
  55.         custom_ColorChanged(lv_colorwheel_get_hsv(guider_ui.screen_cpicker_1));
  56. }
复制代码
将色环和开关的valuechange事件分别更换为custom_ColorChanged和custom_OnOffChanged
  1. static void screen_cpicker_1_event_handler (lv_event_t *e)
  2. {
  3.     lv_event_code_t code = lv_event_get_code(e);

  4.     switch (code) {
  5.     case LV_EVENT_VALUE_CHANGED:
  6.     {
  7.         custom_ColorChanged(lv_colorwheel_get_hsv(guider_ui.screen_cpicker_1));
  8.         break;
  9.     }
  10.     default:
  11.         break;
  12.     }
  13. }
  14. static void screen_sw_1_event_handler (lv_event_t *e)
  15. {
  16.     lv_event_code_t code = lv_event_get_code(e);

  17.     switch (code) {
  18.     case LV_EVENT_VALUE_CHANGED:
  19.     {
  20.         if(lv_obj_has_state(guider_ui.screen_sw_1, LV_STATE_CHECKED))
  21.             custom_OnOffChanged(1);
  22.         else
  23.             custom_OnOffChanged(0);
  24.         break;
  25.     }
  26.     default:
  27.         break;
  28.     }
  29. }
复制代码
运行效果发在了B站
https://www.bilibili.com/video/BV11i421U7g5/



回复

使用道具 举报

lsrly | 2024-5-24 08:00:41 | 显示全部楼层
好好学习,努力挣钱,专心
回复

使用道具 举报

1084504793 | 2024-5-24 08:05:47 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-5-24 08:37:40 | 显示全部楼层
不错不错
选择去发光,而不是被照亮
回复

使用道具 举报

爱笑 | 2024-5-24 08:42:30 | 显示全部楼层
不错不错!
用心做好保姆工作
回复

使用道具 举报

WT_0213 | 2024-5-24 08:59:25 | 显示全部楼层
学习
回复

使用道具 举报

noonezero | 2024-7-3 08:56:40 | 显示全部楼层
不错
回复

使用道具 举报

wurong | 2024-7-3 16:58:46 | 显示全部楼层
666
回复

使用道具 举报

物联网 | 2024-7-4 16:12:41 | 显示全部楼层
支持下
回复

使用道具 举报

sansui | 2024-7-29 12:47:18 | 显示全部楼层
实力强大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则