智能家居之旅,第七站:HomeAssistant开发板的RGB颜色

[复制链接]
查看1733 | 回复13 | 2024-5-22 17:44:41 | 显示全部楼层 |阅读模式

提前要说的话

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

1.gif

彩灯实体创建

1.彩灯实体资源启用

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

image.png

2.Light实体创建

彩灯(Light)实体的创建位置和其他实体一样,就是在MQTT连接成功的事件里面,这里就不多说了,需要说明的是,彩灯实体会比其他实体多很多的控制主题,有开关、亮度、颜色等等。HomeAssistant-C中,默认只给开关功能提供默认的主题,所以在创建实体的时候,除了nameunique_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设备显示

image.png

获取HomeAssistant的控制指令

在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_SWITCHHA_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;

image.png

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

HomeAssistant平台的下发开关控制之后,会触发HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH事件,所以在HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH下,打印开关信息,实现有开关下发就输出信息,然后返回当前开关状态:

case HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH:

LOG_I("<<<<<<<<<<   HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH %s", ha_dev->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;

验证结果

image.png

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("<<<<<<<<<<   HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE,RGB=%d,%d,%d", ha_dev->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;

验证结果

image.png

控制RGB

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

颜色 GPIO PWM通道
红灯 IO12 PWM0
绿灯 IO14 PWM2
蓝灯 IO15 PWM3

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

image.png

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

image.png

验证结果

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

2.gif

4.设置颜色

设置颜色就更简单了,只需要把R,G,B值传给device_rgb_update_color函数就行。

case HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE:
            LOG_I("<<<<<<<<<<   HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE,RGB=%d,%d,%d", ha_dev->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;

image.png

验证结果

3.gif

总结

本帖子的内容稍微有点跳了,这要求大家需要熟悉HomeAssistant-C 库,因为已经到了第七章节,不打算讲得很细! RGB实体还有一些功能需要完善,比如添加RGB设置的默认主题之类的,后面一点点弄吧。一个人开发时间还是有点长的。

本帖被以下淘专辑推荐:

回复

使用道具 举报

WT_0213 | 2024-5-22 17:48:20 | 显示全部楼层
漂亮
回复

使用道具 举报

爱笑 | 2024-5-22 17:56:00 | 显示全部楼层
铁粉来了
用心做好保姆工作
回复

使用道具 举报

lazy | 2024-5-22 22:21:33 | 显示全部楼层
铁粉来了
回复

使用道具 举报

hrqwe | 2024-5-22 22:24:57 | 显示全部楼层
铁粉来了
日拱一卒,功不唐捐
回复

使用道具 举报

业余菜狗 | 2024-5-23 07:35:19 来自手机 | 显示全部楼层
莫工666啊
回复

使用道具 举报

1084504793 | 2024-5-23 08:00:03 | 显示全部楼层
回复

使用道具 举报

jkernet | 2024-5-23 09:45:55 | 显示全部楼层
学习了
回复

使用道具 举报

望风阁 | 2024-5-23 10:16:39 来自手机 | 显示全部楼层
学习了
回复

使用道具 举报

iiv | 2024-5-23 12:02:33 | 显示全部楼层
铁粉来啦
回复

使用道具 举报

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

本版积分规则