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 的控制指令
在 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("<<<<<<<<<< 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;
驗證結果
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;
驗證結果
控制 RGB
開發板上的 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("<<<<<<<<<< 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;
驗證結果
總結
本帖子的內容稍微有點跳了,這要求大家需要熟悉 HomeAssistant-C 庫RGB 實體還有一些功能需要完善,比如添加 RGB 設置的默認主題,后面再給大家介紹。
審核編輯 黃宇
-
RGB
+關注
關注
4文章
801瀏覽量
58737 -
智能家居
+關注
關注
1930文章
9612瀏覽量
186544
發布評論請先 登錄
相關推薦
【貝啟科技BQ3568HM開源鴻蒙開發板深度試用報告】2 - 智能家居中控屏界面設計:打造便捷的家居控制體驗
瑞芯微開發板/主板Android配置APK默認開啟性能模式方法
![瑞芯微<b class='flag-5'>開發板</b>/主板Android配置APK默認開啟性能模式方法](https://file1.elecfans.com/web3/M00/06/68/wKgZO2eKBzCAdORSAAB69bgax4w744.png)
用Ai-WB2開發板做智能家居全彩LED小夜燈
![用Ai-WB2<b class='flag-5'>開發板</b>做<b class='flag-5'>智能家居</b>全彩LED小夜燈](https://file1.elecfans.com//web2/M00/0B/85/wKgZomc0QTGAGCQfAAEH9PDRG1Q850.jpg)
嵌入式linux開發板芯片的工作原理
linux開發板與樹莓派的區別
機智云ESP8266開發板RGB彩燈控件
![機智云ESP8266<b class='flag-5'>開發板</b><b class='flag-5'>RGB</b>彩燈控件](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
智能家居之旅(9):HomeAssistant 的開關實體具象化
![<b class='flag-5'>智能家居</b><b class='flag-5'>之旅</b>(9):<b class='flag-5'>HomeAssistant</b> 的開關實體具象化](https://file1.elecfans.com//web2/M00/F9/C3/wKgZomaLqD-AF7riAABK-Vqa-5o55.jpeg)
智能家居之旅(3):Ai-M61/M62 接入HomeAssistant 實現點燈
![<b class='flag-5'>智能家居</b><b class='flag-5'>之旅</b>(3):Ai-M61/M62 接入<b class='flag-5'>HomeAssistant</b> 實現點燈](https://file1.elecfans.com//web2/M00/ED/47/wKgaomZia1mANAk5AAB7Npr4BoI85.jpeg)
打卡智能家居之旅(2):設備接入HomeAssistant的方法
![打卡<b class='flag-5'>智能家居</b><b class='flag-5'>之旅</b>(2):設備接入<b class='flag-5'>HomeAssistant</b>的方法](https://file1.elecfans.com//web2/M00/ED/44/wKgaomZiZCCAAP1SAADFBOcfn1E89.jpeg)
打卡智能家居學習之旅(1):了解HomeAssistant
![打卡<b class='flag-5'>智能家居</b>學習<b class='flag-5'>之旅</b>(1):了解<b class='flag-5'>HomeAssistant</b>](https://file1.elecfans.com//web2/M00/E8/67/wKgaomZL8-mAalrCAABa1uu5v2w42.jpeg)
智能家居系統的開發-基于米爾瑞薩RZ/G2UL開發板
![<b class='flag-5'>智能家居</b>系統的<b class='flag-5'>開發</b>-基于米爾瑞薩RZ/G2UL<b class='flag-5'>開發板</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
評論