📽

lwZkjy">

  1. 🎊

      🈳
      ❓🐘
      🏁
      🤓
    • 🚎
    • 📹🛴
      🍒
      💎
      📿
      🙁🌆
      🍞
    • 🥝

      智能家居之旅(7):HomeAssistant开发板的RGB颜色

      发布时间:2024-07-02 16:23:00  浏览量:12

      hello,有谁还记得之前小美的视频?当时做了一个RGB灯,并且说了 RGB的一些开发过程。所以说RGB实体很早之前就已经开发好了,只是一直没有写帖子介绍它的用法。今天就给大家介绍一下 RGB 彩灯怎么上HomeAssistant,然后控制Ai-M61开发板的 RGB 灯的颜色,感觉这个项目用来控制家里的灯条就挺不错的。

      1.彩灯实体资源启用

      彩灯实体在 HomeAssistant 上描述为 Light,HomeAssistant-C 上默认也是不开启的,所以需要在 homeAssistantDevConfig.h 当中把 #define CONFIG_ENTITY_ENABLE_LIGHT 的值置 1:

      2.Light 实体创建

      彩灯(Light)实体的创建位置和其他实体一样,就是在 MQTT 连接成功的事件里面,这里就不多说了,需要说明的是,彩灯实体会比其他实体多很多的控制主题,有开关、亮度、颜色等等。HomeAssistant-C 中,默认只给开关功能提供默认的主题,所以在创建实体的时候,除了 name、unique_id 参数之外,还需要给颜色控制灯主题赋值参数,例如:

      static ha_lh_entity_t rgb_light = {

      .name = "彩灯",

      .unique_id = "light_rgb01",

      .rgb.rgb_command_topic = "light_rgb01/set",

      .rgb.rgb_state_topic = "light_rgb01/state",

      };

      homeAssistant_device_add_entity(CONFIG_HA_ENTITY_LIGHT, &rgb_light);

      HA 设备显示

      在 HomeAssistant-C 当中,暂时定义好了 Light 的三个控制事件:

      HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH,//light 灯的开关事件

      HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE,//light 灯的 RGB 颜色下发事件

      HA_EVENT_MQTT_COMMAND_LIGHT_BRIGHTNESS,//light 灯的亮度数据下发事件

      在这里只对

      HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 和 HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE 这两个事件来控制 RGB,在 HomeAssistant 事件回调函数当中(这里的函数名为:ha_event_cb),添加以下内容:

      case HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH:

      break;

      case HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE:

      break;

      1.读取 HA 的开关控制命令

      HomeAssistant 平台的下发开关控制之后,会触发 HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 事件,所以在

      HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 下,打印开关信息,实现有开关下发就输出信息,然后返回当前开关状态:

      case HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH:

      LOG_I("entity_light->command_light->light_state?"ON":"OFF");

      homeAssistant_device_send_entity_state(CONFIG_HA_ENTITY_LIGHT, ha_dev->entity_light->command_light, ha_dev->entity_light->command_light->light_state);

      break;

      验证结果

      2.读取 HA 的颜色更新命令

      同样的,HomeAssistant 平台设置颜色时,会触发 HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE 事件,这时就需要在这个事件当中获取颜色 RGB 的颜色值,在这个事件下添加以下内容,把颜色 R,G,B 的值打印出来并同步给 HA:

      case HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE:

      LOG_I("entity_light->command_light->rgb.red, ha_dev->entity_light->command_light->rgb.green, ha_dev->entity_light->command_light->rgb.blue);

      // device_rgb_update_color(ha_dev->entity_light->command_light->rgb.red, ha_dev->entity_light->command_light->rgb.green, ha_dev->entity_light->command_light->rgb.blue);

      homeAssistant_device_send_entity_state(CONFIG_HA_ENTITY_LIGHT, ha_dev->entity_light->command_light, ha_dev->entity_light->command_light->light_state);

      break;

      验证结果

      开发板上的 RGB 是直接由引脚控制,想要实现颜色调节的话,就需要开启 PWM 控制,通过控制红绿蓝三基色来实现调色。先要把控制 RGB 的引脚启动 PWM 功能,先看一下 Ai-M61 开发板 RGB 的接线情况:

      颜色GPIOPWM 通道红灯IO12PWM0绿灯IO14PWM2蓝灯IO15PWM3

      1.初始化 RGB 引脚

      已经知道引脚配置之后,直接在主函数当中初始化 RGB 引脚,在初始化阶段添加以下代码

      struct bflb_device_s* gpio;

      gpio = bflb_device_get_by_name("gpio");

      bflb_gpio_init(gpio, 12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

      bflb_gpio_init(gpio, 14, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

      bflb_gpio_init(gpio, 15, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

      pwm = bflb_device_get_by_name("pwm_v2_0");

      //100Hz

      struct bflb_pwm_v2_config_s cfg = {

      .clk_source = BFLB_SYSTEM_XCLK ,

      .clk_div = 40,

      .period = 1000,

      };

      bflb_pwm_v2_init(pwm, &cfg);

      bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0);

      bflb_pwm_v2_channel_positive_start(pwm, PWM_CH2);

      bflb_pwm_v2_channel_positive_start(pwm, PWM_CH3);

      bflb_pwm_v2_start(pwm);

      2.调色函数

      因为 R,G,B 的值最高只有 255,对应 PWM 占空比 100%,所以我们在调色的时候,就需要把目标颜色的 RGB 值计算出相对性的占空比,然后赋值给 PWM 占空比控制函数。因为我们使用的 PWM 的频率是 1KHz,所以我们在计算占空比的时候,需要 乘以 1000,因为我们就能达到下面这个函数:

      void device_rgb_update_color(uint8_t red, uint8_t green, uint8_t blue)

      {

      uint16_t color_red_period = 1000*red/255;

      uint16_t color_green_period = 1000*green/255;

      uint16_t color_blue_period = 1000*blue/255;

      bflb_pwm_v2_stop(pwm);

      bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, 0, color_red_period);

      bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH2, 0, color_green_period);

      bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, 0, color_blue_period);

      bflb_pwm_v2_start(pwm);

      }

      使用这个函数的时候,只需要把 R,G,B 三个数值按顺序赋值就行了。

      3.RGB 的亮灭

      有了调色的函数之后,灭掉所有灯,只需要把颜色值全部设置成 0,亮的时候,就把 R,G,B 重新赋值就行了:

      //控制RGB

      if (!ha_dev->entity_light->command_light->light_state) {

      device_rgb_update_color(0, 0, 0);

      }

      else {

      if (ha_dev->entity_light->command_light!=NULL)

      device_rgb_update_color(ha_dev->entity_light->command_light->rgb.red, ha_dev->entity_light->command_light->rgb.green, ha_dev->entity_light->command_light->rgb.blue);

      }

      验证结果

      因为默认 PWM 为 0,所以烧录之后,灯不会亮,需要设置一下颜色,灯才会亮。

      4.设置颜色

      设置颜色就更简单了,只需要把 R,G,B 值传

      给 device_rgb_update_color 函数就行。


      case HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE:

      LOG_I("entity_light->command_light->rgb.red, ha_dev->entity_light->command_light->rgb.green, ha_dev->entity_light->command_light->rgb.blue);

      // device_rgb_update_color(ha_dev->entity_light->command_light->rgb.red, ha_dev->entity_light->command_light->rgb.green, ha_dev->entity_light->command_light->rgb.blue);

      homeAssistant_device_send_entity_state(CONFIG_HA_ENTITY_LIGHT, ha_dev->entity_light->command_light, ha_dev->entity_light->command_light->light_state);

      device_rgb_update_color(ha_dev->entity_light->command_light->rgb.red, ha_dev->entity_light->command_light->rgb.green, ha_dev->entity_light->command_light->rgb.blue);

      break;

      验证结果

      本帖子的内容稍微有点跳了,这要求大家需要熟悉 HomeAssistant-C 库RGB 实体还有一些功能需要完善,比如添加 RGB 设置的默认主题,后面再给大家介绍。

      关键词: homeassistant rgb 开发板

      🈲🥛

      🏌🤵

      ⛴🦎

      FFi6gc">

      👑🍘
      🥧
        ✍🧣
        1. 🐐😩
        • 💆
          🔶
        • 🛁🚥
        • 🥕
          🎍
        • 🚅
          首页| 家具品牌| 家居品牌| 关于我们| 友情链接| 网站地图| 设为首页| 加入收藏| 联系我们