hello,有誰(shuí)還記得之前小美的視頻?當(dāng)時(shí)做了一個(gè)RGB燈,并且說(shuō)了 RGB的一些開(kāi)發(fā)過(guò)程。所以說(shuō)RGB實(shí)體很早之前就已經(jīng)開(kāi)發(fā)好了,只是一直沒(méi)有寫帖子介紹它的用法。今天就給大家介紹一下 RGB 彩燈怎么上HomeAssistant,然后控制Ai-M61開(kāi)發(fā)板的 RGB 燈的顏色,感覺(jué)這個(gè)項(xiàng)目用來(lái)控制家里的燈條就挺不錯(cuò)的。

彩燈實(shí)體創(chuàng)建
1.彩燈實(shí)體資源啟用
彩燈實(shí)體在 HomeAssistant 上描述為 Light,HomeAssistant-C 上默認(rèn)也是不開(kāi)啟的,所以需要在 homeAssistantDevConfig.h 當(dāng)中把#define CONFIG_ENTITY_ENABLE_LIGHT的值置 1:

2.Light 實(shí)體創(chuàng)建
彩燈(Light)實(shí)體的創(chuàng)建位置和其他實(shí)體一樣,就是在 MQTT 連接成功的事件里面,這里就不多說(shuō)了,需要說(shuō)明的是,彩燈實(shí)體會(huì)比其他實(shí)體多很多的控制主題,有開(kāi)關(guān)、亮度、顏色等等。HomeAssistant-C 中,默認(rèn)只給開(kāi)關(guān)功能提供默認(rèn)的主題,所以在創(chuàng)建實(shí)體的時(shí)候,除了 name、unique_id 參數(shù)之外,還需要給顏色控制燈主題賦值參數(shù),例如:
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 設(shè)備顯示

獲取 HomeAssistant 的控制指令
在 HomeAssistant-C 當(dāng)中,暫時(shí)定義好了 Light 的三個(gè)控制事件:
HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH,//light 燈的開(kāi)關(guān)事件
HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE,//light 燈的 RGB 顏色下發(fā)事件
HA_EVENT_MQTT_COMMAND_LIGHT_BRIGHTNESS,//light 燈的亮度數(shù)據(jù)下發(fā)事件
在這里只對(duì)
HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 和 HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE 這兩個(gè)事件來(lái)控制 RGB,在 HomeAssistant 事件回調(diào)函數(shù)當(dāng)中(這里的函數(shù)名為:ha_event_cb),添加以下內(nèi)容:
case HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH:
break;
case HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE:
break;

1.讀取 HA 的開(kāi)關(guān)控制命令
HomeAssistant 平臺(tái)的下發(fā)開(kāi)關(guān)控制之后,會(huì)觸發(fā) HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 事件,所以在
HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 下,打印開(kāi)關(guān)信息,實(shí)現(xiàn)有開(kāi)關(guān)下發(fā)就輸出信息,然后返回當(dāng)前開(kāi)關(guān)狀態(tài):
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;
驗(yàn)證結(jié)果

2.讀取 HA 的顏色更新命令
同樣的,HomeAssistant 平臺(tái)設(shè)置顏色時(shí),會(huì)觸發(fā)HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE事件,這時(shí)就需要在這個(gè)事件當(dāng)中獲取顏色 RGB 的顏色值,在這個(gè)事件下添加以下內(nèi)容,把顏色 R,G,B 的值打印出來(lái)并同步給 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;
驗(yàn)證結(jié)果

控制 RGB
開(kāi)發(fā)板上的 RGB 是直接由引腳控制,想要實(shí)現(xiàn)顏色調(diào)節(jié)的話,就需要開(kāi)啟 PWM 控制,通過(guò)控制紅綠藍(lán)三基色來(lái)實(shí)現(xiàn)調(diào)色。先要把控制 RGB 的引腳啟動(dòng) PWM 功能,先看一下 Ai-M61 開(kāi)發(fā)板 RGB 的接線情況:
顏色GPIOPWM 通道紅燈IO12PWM0綠燈IO14PWM2藍(lán)燈IO15PWM3
1.初始化 RGB 引腳
已經(jīng)知道引腳配置之后,直接在主函數(shù)當(dāng)中初始化 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.調(diào)色函數(shù)
因?yàn)?R,G,B 的值最高只有 255,對(duì)應(yīng) PWM 占空比 100%,所以我們?cè)谡{(diào)色的時(shí)候,就需要把目標(biāo)顏色的 RGB 值計(jì)算出相對(duì)性的占空比,然后賦值給 PWM 占空比控制函數(shù)。因?yàn)槲覀兪褂玫?PWM 的頻率是1KHz,所以我們?cè)谟?jì)算占空比的時(shí)候,需要 乘以 1000,因?yàn)槲覀兙湍苓_(dá)到下面這個(gè)函數(shù):
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);
}
使用這個(gè)函數(shù)的時(shí)候,只需要把 R,G,B 三個(gè)數(shù)值按順序賦值就行了。
3.RGB 的亮滅
有了調(diào)色的函數(shù)之后,滅掉所有燈,只需要把顏色值全部設(shè)置成 0,亮的時(shí)候,就把 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);
}

驗(yàn)證結(jié)果
因?yàn)槟J(rèn) PWM 為 0,所以燒錄之后,燈不會(huì)亮,需要設(shè)置一下顏色,燈才會(huì)亮。

4.設(shè)置顏色
設(shè)置顏色就更簡(jiǎn)單了,只需要把 R,G,B 值傳
給 device_rgb_update_color 函數(shù)就行。
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;

驗(yàn)證結(jié)果

總結(jié)
本帖子的內(nèi)容稍微有點(diǎn)跳了,這要求大家需要熟悉 HomeAssistant-C 庫(kù)RGB 實(shí)體還有一些功能需要完善,比如添加 RGB 設(shè)置的默認(rèn)主題,后面再給大家介紹。
審核編輯 黃宇
-
RGB
+關(guān)注
關(guān)注
4文章
831瀏覽量
61939 -
智能家居
+關(guān)注
關(guān)注
1943文章
9995瀏覽量
197410
發(fā)布評(píng)論請(qǐng)先 登錄
Renesas FPB - RA2T1快速原型開(kāi)發(fā)板:開(kāi)啟高效設(shè)計(jì)之旅
快速上手FRDM-KE17Z512開(kāi)發(fā)板:開(kāi)啟高效MCU開(kāi)發(fā)之旅
【匠芯創(chuàng)D133CBS KunLun Pi開(kāi)發(fā)板試用體驗(yàn)】1、開(kāi)發(fā)板開(kāi)箱及介紹
如何快速開(kāi)發(fā)符合Matter標(biāo)準(zhǔn)的智能家居設(shè)備?
樹莓派 Zero 2 W 是開(kāi)啟智能家居生活的理想之選!
ESP32-C3開(kāi)發(fā)板全面支持小智AI!燒錄實(shí)戰(zhàn)指南來(lái)了!
Matter 智能家居的通用語(yǔ)言
明遠(yuǎn)智睿SSD2351開(kāi)發(fā)板:智能家居的智能核心
探秘明遠(yuǎn)智睿SSD2351開(kāi)發(fā)板在HMI領(lǐng)域的獨(dú)特魅力
Linux文件系統(tǒng)打包及鏡像制作,觸覺(jué)智能RK3562開(kāi)發(fā)板演示
智能家居Mesh組網(wǎng)方案:實(shí)現(xiàn)智能化生活的無(wú)縫連接NRF52832
明遠(yuǎn)智睿 SSD2351 開(kāi)發(fā)板:開(kāi)啟創(chuàng)新開(kāi)發(fā)之旅
重大突破?這個(gè)系統(tǒng),讓智能家居生態(tài)屏障土崩瓦解
智能家居之旅(7):HomeAssistant開(kāi)發(fā)板的RGB顏色
評(píng)論