hello,有誰還記得之前小美的視頻?當時做了一個RGB燈,并且說了 RGB的一些開發(fā)過程。所以說RGB實體很早之前就已經(jīng)開發(fā)好了,只是一直沒有寫帖子介紹它的用法。今天就給大家介紹一下 RGB 彩燈怎么上HomeAssistant,然后控制Ai-M61開發(fā)板的 RGB 燈的顏色,感覺這個項目用來控制家里的燈條就挺不錯的。
彩燈實體創(chuàng)建
1.彩燈實體資源啟用
彩燈實體在 HomeAssistant 上描述為 Light,HomeAssistant-C 上默認也是不開啟的,所以需要在 homeAssistantDevConfig.h 當中把#define CONFIG_ENTITY_ENABLE_LIGHT的值置 1:
2.Light 實體創(chuàng)建
彩燈(Light)實體的創(chuàng)建位置和其他實體一樣,就是在 MQTT 連接成功的事件里面,這里就不多說了,需要說明的是,彩燈實體會比其他實體多很多的控制主題,有開關(guān)、亮度、顏色等等。HomeAssistant-C 中,默認只給開關(guān)功能提供默認的主題,所以在創(chuàng)建實體的時候,除了 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 當中,暫時定義好了 Light 的三個控制事件:
HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH,//light 燈的開關(guān)事件
HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE,//light 燈的 RGB 顏色下發(fā)事件
HA_EVENT_MQTT_COMMAND_LIGHT_BRIGHTNESS,//light 燈的亮度數(shù)據(jù)下發(fā)事件
在這里只對
HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 和 HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE 這兩個事件來控制 RGB,在 HomeAssistant 事件回調(diào)函數(shù)當中(這里的函數(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 的開關(guān)控制命令
HomeAssistant 平臺的下發(fā)開關(guān)控制之后,會觸發(fā) HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 事件,所以在
HA_EVENT_MQTT_COMMAND_LIGHT_SWITCH 下,打印開關(guān)信息,實現(xiàn)有開關(guān)下發(fā)就輸出信息,然后返回當前開關(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;
驗證結(jié)果
2.讀取 HA 的顏色更新命令
同樣的,HomeAssistant 平臺設(shè)置顏色時,會觸發(fā)HA_EVENT_MQTT_COMMAND_LIGHT_RGB_UPDATE事件,這時就需要在這個事件當中獲取顏色 RGB 的顏色值,在這個事件下添加以下內(nèi)容,把顏色 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;
驗證結(jié)果
控制 RGB
開發(fā)板上的 RGB 是直接由引腳控制,想要實現(xiàn)顏色調(diào)節(jié)的話,就需要開啟 PWM 控制,通過控制紅綠藍三基色來實現(xiàn)調(diào)色。先要把控制 RGB 的引腳啟動 PWM 功能,先看一下 Ai-M61 開發(fā)板 RGB 的接線情況:
顏色GPIOPWM 通道紅燈IO12PWM0綠燈IO14PWM2藍燈IO15PWM3
1.初始化 RGB 引腳
已經(jīng)知道引腳配置之后,直接在主函數(shù)當中初始化 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ù)
因為 R,G,B 的值最高只有 255,對應(yīng) PWM 占空比 100%,所以我們在調(diào)色的時候,就需要把目標顏色的 RGB 值計算出相對性的占空比,然后賦值給 PWM 占空比控制函數(shù)。因為我們使用的 PWM 的頻率是1KHz,所以我們在計算占空比的時候,需要 乘以 1000,因為我們就能達到下面這個函數(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);
}
使用這個函數(shù)的時候,只需要把 R,G,B 三個數(shù)值按順序賦值就行了。
3.RGB 的亮滅
有了調(diào)色的函數(shù)之后,滅掉所有燈,只需要把顏色值全部設(shè)置成 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);
}
驗證結(jié)果
因為默認 PWM 為 0,所以燒錄之后,燈不會亮,需要設(shè)置一下顏色,燈才會亮。
4.設(shè)置顏色
設(shè)置顏色就更簡單了,只需要把 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;
驗證結(jié)果
總結(jié)
本帖子的內(nèi)容稍微有點跳了,這要求大家需要熟悉 HomeAssistant-C 庫RGB 實體還有一些功能需要完善,比如添加 RGB 設(shè)置的默認主題,后面再給大家介紹。
審核編輯 黃宇
-
RGB
+關(guān)注
關(guān)注
4文章
798瀏覽量
58461 -
智能家居
+關(guān)注
關(guān)注
1928文章
9553瀏覽量
184936
發(fā)布評論請先 登錄
相關(guān)推薦
評論