以下作品由安信可社區(qū)用戶
業(yè)余菜狗制作
前言
自從接觸智能家居之后,筆者就變得很依賴智能家居(絕對不是懶!)
比如臥室燈,就在進門的地方,進門開燈很方便,但是晚上睡覺關(guān)燈就很不方便。
之前是買了一款Wi-Fi燈,是用手機APP操作,剛開始用的時候感覺很方便,后面用久了,覺得每次都要開APP操作也很煩,所以就在網(wǎng)上查了一下,有那種無線開關(guān),按一下就能開關(guān)燈,把按鈕貼在床頭,需要開關(guān)燈就點一下,比點APP更方便!
但是!!!網(wǎng)上賣的無線按鈕開關(guān)可不便宜,眾所周知筆者的時薪是14.4所以這種方案我是拒絕的。那?就沒有便宜的方案了嗎???
還真讓我找到了——433射頻開關(guān),淘寶或多多上(用券之后)才3塊多一個,但是筆者用的Home Assistant系統(tǒng)是不能直接接入433開關(guān)的,所以就用安信可Ai-WB2模組DIY了一個433網(wǎng)關(guān),將433遙控信號轉(zhuǎn)發(fā)給Home Assistant.
成品如下圖,已經(jīng)測試幾個月了,還是比較穩(wěn)的
1、DIY思路
數(shù)據(jù)處理流程:433按鈕-->433接收模塊-->WB2-->HA-->燈
433按鈕:當(dāng)按下433按鈕時發(fā)送鍵值
433接收模塊:接收到433鍵值后用uart發(fā)送給WB2
WB2:uart收到鍵值之后,將鍵值用mqtt發(fā)送給HA
HA:收到WB2的mqtt信息之后,根據(jù)用戶設(shè)定控制燈(或其它設(shè)備)
燈:HA讓我亮,那我就亮,讓我滅,我就滅
2、準(zhǔn)備工作
●一個433按鈕開關(guān)
●Ai-WB2-12F模組及開發(fā)環(huán)境
●一個433接收模塊(筆者用的是蜂鳥無線的R1A模塊)
●一個3D打印的外殼
3、編程開發(fā)
因為433按鈕是現(xiàn)成的,所以不需要開發(fā),只有WB2和HA部分需要編程,HA部分還好,主要是WB2需要大量的代碼。
WB2射頻網(wǎng)關(guān)代碼思路
整體思路是這樣的,wb2啟動后開始鏈接WiFi和mqtt服務(wù)器,連上之后,發(fā)送設(shè)備信息給HA,讓HA發(fā)現(xiàn)wb2并生成設(shè)備實體;
然后在433接收到遙控鍵值之后,用串口(uart)通信給wb2,wb2收到串口數(shù)據(jù)后,分析數(shù)據(jù),并將數(shù)據(jù)通過mqtt發(fā)送給HA,至此完成一次傳送。如果不想看下面的代碼,那只需要改這兩個地方就能用了。
main.c里面的WiFi賬號密碼
#define wifi_ssid "WiFi名稱"
#define wifi_pass "WiFi密碼"
yycg_mqtt.h里面的mqtt服務(wù)器信息
//設(shè)定MQTT服務(wù)器
#define mqtt_host "192.168.31.158"
#define mqtt_port 1883
#define mqtt_username "Ai-Thinker-WB2-433gateway"
#define mqtt_password ""
main函數(shù)
啟動之后,先初始化uart,并連接wifi及mqtt,這里使用了多任務(wù),wifi和mqtt是一個任務(wù),uart也用了一個任務(wù),軟時鐘任務(wù),這幾個任務(wù)是并行的。
void main(){
//初始化LED
bl_gpio_enable_output(LED_IO, 1, 0);
bl_gpio_output_set(LED_IO, 0);
//初始化配對按鈕
bl_gpio_enable_input(pair_IO, 1, 0);
//初始化uart,初始化之后,自帶的log會失效,算是一個bug
uart_init();
uart0_print("開始運行用戶代碼n");
vTaskDelay(1000);
//讀取保存的WiFi賬號信息
if(get_flash_wifi_data() == 1){
uart0_print("已讀取WiFi數(shù)據(jù)n");
}else{
uart0_print("未找到WiFi數(shù)據(jù),正在寫入預(yù)設(shè)數(shù)據(jù)n");
set_flash_wifi_data(wifi_ssid, wifi_pass);
get_flash_wifi_data();
}
vTaskDelay(1000);
//啟動WiFi和mqtt任務(wù)
xTaskCreate(Task_mqtt, "Task_mqtt", 20480, NULL, 15, NULL);
//啟動軟時鐘任務(wù)
xTaskCreate(Task_time, "Task_time", 2048, NULL, 5, NULL);
//啟動uart任務(wù)
xTaskCreate(Task_Uart, "Task_Uart", 2048, NULL, 10, NULL);
}
uart任務(wù)
void Task_Uart(void *param){
//初始化uart
uint8_t data[32];
int ret;
hosal_uart_dev_t uart_dev_echo = {
.config = {
.uart_id = 0,
.tx_pin = 6, // TXD GPIO
.rx_pin = 4, // RXD GPIO
.cts_pin = 255,
.rts_pin = 255,
.baud_rate = 9600,
.data_width = HOSAL_DATA_WIDTH_8BIT,
.parity = HOSAL_NO_PARITY,
.stop_bits = HOSAL_STOP_BITS_1,
.mode = HOSAL_UART_MODE_POLL,
},
};
bl_gpio_output_set(LED_IO, 1);
hosal_uart_init(&uart_dev_echo);
ret = hosal_uart_receive(&uart_dev_echo, data, sizeof(data));
//進入死循環(huán)讀取串口數(shù)據(jù)
while(1) {
uint8_t uart_433_data[16];
uint8_t mqtt_433_data[6];
uint8_t mqtt_433_data_old[6];
uint8_t mqtt_st;
ret = hosal_uart_receive(&uart_dev_echo, data, sizeof(data));
if (ret > 0){
size_t x = 0;
for (size_t i = 0; i < ret; i++){
uart_433_data[x] = data[i];
x++;
}
vTaskDelay(40);//可能是因為波特率是9600速度比較慢,一次接收會不完整,所以等待一下接收兩次
ret = hosal_uart_receive(&uart_dev_echo, data, sizeof(data));
for (size_t i = 0; i < ret; i++){
uart_433_data[x] = data[i];
x++;
}
uart0_send(uart_433_data, x);
mqtt_st = 0;
//mqtt_433_data[6] = '';
//將接收到的uart賦值給mqtt信息變量,并判斷新舊數(shù)據(jù)是否一樣(433數(shù)據(jù)可能重復(fù))
for(size_t i = 0; i < 6; i++){
mqtt_433_data[i] = uart_433_data[i+3];
if(mqtt_433_data[i] != mqtt_433_data_old[i]){
mqtt_st = 1;
}
}
//打印出新舊數(shù)據(jù)
uart0_send(mqtt_433_data_old, 6);
uart0_send((uint8_t *)"n", 1);
uart0_send(mqtt_433_data, 6);
//判斷
while(1){//二級循環(huán)
if(!(mqtt_st == 1 || time_nv>100))break;//判斷是否重復(fù),當(dāng)數(shù)據(jù)重復(fù)且間隔大于1s(軟時鐘作用)仍然發(fā)送
if(!(pair_event == 0))break;//判斷433模塊是不是處于配對狀態(tài)
if(!(mqtt_event == 1))break;//判斷mqtt服務(wù)器是否連接正常
//發(fā)送mqtt數(shù)據(jù),并將數(shù)據(jù)保存到變量方便下次對比
ha_text_send(R1A_ID1, (char*)mqtt_433_data);
for(size_t i = 0; i < 6; i++){
mqtt_433_data_old[i] = mqtt_433_data[i];
}
time_nv = 0;
break;
}
}
vTaskDelay(5);
}
}
軟時鐘任務(wù)
//軟時鐘函數(shù),time_nv變量10ms自加一次
void Task_time(void *param){
while(1){
time_nv++;
vTaskDelay(10);
}
}
MQTT訂閱回調(diào)函數(shù)
void mqtt_topic_data(char * topic, char * data){
char topic2[128];
//收到HA的上線信息,發(fā)送HA自動發(fā)現(xiàn)信息
if(strcmp(topic, "homeassistant/status")==0){
ha_config_code();
}
//處理"配對"
connect_topic_str(topic2, "button", R1A_ID2, "cmd_t");
if (strcmp(topic, topic2)==0){
pair_event = 1;
//模擬連續(xù)按兩下進入配對模式
bl_gpio_enable_output(pair_IO, 1, 0);
bl_gpio_output_set(pair_IO, 0);
vTaskDelay(50);
bl_gpio_output_set(pair_IO, 1);
vTaskDelay(200);
bl_gpio_output_set(pair_IO, 0);
vTaskDelay(50);
bl_gpio_output_set(pair_IO, 1);
bl_gpio_enable_input(pair_IO, 1, 0);
char X = 1;
time_nv = 0;
while(X){
if(!(bl_gpio_input_get_value(pair_IO))){
time_nv = 0;
}
if (time_nv>200){
X = 0;
}
vTaskDelay(200);
}
uint8_t data[16];
uart1_get(data);
pair_event = 0;
}
//處理"重置"
connect_topic_str(topic2, "button", R1A_ID3, "cmd_t");
if (strcmp(topic, topic2)==0){
pair_event = 1;
//模擬長按10S清除配對的遙控
bl_gpio_enable_output(pair_IO, 1, 0);
bl_gpio_output_set(pair_IO, 0);
vTaskDelay(10000);
bl_gpio_output_set(pair_IO, 1);
bl_gpio_enable_input(pair_IO, 1, 0);
char X = 1;
time_nv = 0;
while(X){
if(!(bl_gpio_input_get_value(pair_IO))){
time_nv = 0;
}
if (time_nv>200){
X = 0;
}
vTaskDelay(200);
}
uint8_t data[16];
uart1_get(data);
pair_event = 0;
}
vTaskDelay(1000);
}
HA初始化函數(shù)
void ha_config_code(){
//注冊"433鍵值","433配對"按鈕,"433重置"按鈕
ha_text_config(R1A_ID1, "433鍵值");
ha_button_config(R1A_ID2, "433配對");
ha_button_config(R1A_ID3, "433重置");
vTaskDelay(1000);
//發(fā)送設(shè)備上線信息
mqtt_pub(mqtt_lwt_topic, "online");
}
HA設(shè)置部分
在你燒錄好代碼之后,HA中會自動出現(xiàn)一個mqtt設(shè)備。
點擊左邊那個MQTT INFO復(fù)制433鍵值下面的topic內(nèi)容,每個設(shè)備中間部分會不一樣
homeassistant/text/7CB94CD1F767/433_R1A_001/config
去自動化設(shè)置里面,新建一個自動化,設(shè)置為當(dāng)收到某個 MQTT 消息時,主題填入剛才的內(nèi)容
或者也可以直接復(fù)制這段代碼貼上(記得改主題)
topic: homeassistant/text/7CB94CD1F767/433_R1A_001/state
trigger: mqtt
然后在下面的"就執(zhí)行"里面判斷鍵值,先設(shè)置一個短延遲,防止數(shù)據(jù)還沒來得及更新。
這個也可以復(fù)制代碼
choose:
- conditions:
- condition: template
value_template: "{{ "8FE004" == states("text.wb2wang_guan_433_433jian_zhi") }}"
alias: 鍵值判斷
sequence:
- action: light.toggle
target:
device_id: a38cb2e40595fabed52aab4309efb240
data: {}
alias: 菜狗86遙控-1-B鍵-8FE004-開關(guān)臥室燈
然后在下面的"就執(zhí)行"里面判斷鍵值,先設(shè)置一個短延遲,防止數(shù)據(jù)還沒來得及更新
這個也可以復(fù)制代碼不過
現(xiàn)在按下433按鈕,就能開關(guān)燈了
4、硬件、PCB和外殼
硬件接線和PCB
R1A的TX連接WB2的IO4,重置按鍵"K/O"連接WB2的IO5.
PCB基本上去就是一個傻瓜板很簡陋,,資料放附件,有需要的可以改一下自己用。
外殼
外殼是隨便畫的,我不太會3D建模,能把PCB裝進去就行了
5、附件
https://bbs.ai-thinker.com/forum.php?mod=attachment&aid=31734(內(nèi)含以下附件)
附件:mqtt_gateway_433代碼.zip
附件:PCB文件_WB2-433_2025-03-19.zip
附件:嘉立創(chuàng)EDA標(biāo)準(zhǔn)版_PCB工程_20250319.zip
附件:外殼.zip
審核編輯 黃宇
-
遙控
+關(guān)注
關(guān)注
11文章
290瀏覽量
57960 -
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
5681瀏覽量
53013 -
智能家居
+關(guān)注
關(guān)注
1934文章
9806瀏覽量
190584
發(fā)布評論請先 登錄
CE31-TD系列4G遙控開關(guān)模組核心板方案推薦
用Wi-Fi藍牙模組Ai-M62-CBS做一個電子沙漏

廣和通發(fā)布5G模組FG390系列
PN1-S25系列ProfiNet網(wǎng)關(guān)模組產(chǎn)品簡介
用安信可Ai-WB2-01S做一個可用網(wǎng)頁控制的簡易燈

低價不貴!安信可WiFi+BLE模組Ai-WB2系列

我的DIY遙控器——小擺件遠程控
全智芯433Mhz無線遙控級聯(lián)RGB炫彩燈方案
用小安派 DSL做一個天氣站

一文詳解:區(qū)分315MHz和433MHz遙控模塊

Ai-WB2+Modbus 485 RTU 遠程控制

安信可Ai-WB2系列的優(yōu)勢是?一秒讀懂!
用Ai-WB2開發(fā)板做智能家居全彩LED小夜燈

用 M61模組做一個紅外空調(diào)遙控器

評論