[i=s] 本帖最后由 小小鸟 于 2025-3-20 18:33 编辑 [/i]
项目简介
本项目通过PB-03F kit完成了远程控制家中的设备,比如风扇、灯光、插座电源等等。配置PC上位机,可以实时查看设备的状态以及完成控制。
项目参数
使用的是PB-03F Kit开发板,使用的是安信可的模组 - PB-03F模块,其内置了64KB SRAM,256KB flash,96 KBROM,256bit efuse,采用的芯片是 M0 核,支持二次开发开发,本工程就是通过Keil二次进行了开发。
下面是这模组的一些特点:
- 支持协议:蓝牙5.2
- 发射功率:10dBm
- 接收电流:9.4mA
- 发送电流:11.5mA
- 接收灵敏度:-93dBm
- 硬件加密加速器支持AES算法
- 蓝牙速率支持:125Kbps、500Kbps、1Mbps、2Mbps
硬件说明
下面是使用到的继电器模块的主要原理图(enmmm,下面的演示暂时还没有用起来,验证了一下方案的可行性,下周等我的220V的灯到了,将PB-03F和灯一起装进天花板中,我补一个)


软件代码
上位机的关键部分代码,一个是连接设备,一个是发送数据
def handle_control_action(self, btn, parent):
self.status = not self.status # 更新状态
self.update_image(parent) # 更新图片
new_text = "当前状态:开启" if self.status else "当前状态:关闭"
new_foreground = "red" if self.status else "black"
self.status_indicator.config(text=new_text,foreground=new_foreground) # 更新状态文本
btn.config(text="关闭" if self.status else "开启") # 更新按钮文本
data_bytes = bytes.fromhex('发送的数据')
asyncio.run_coroutine_threadsafe(
self.send_data('设备的服务',data_bytes),
self.loop
)
def start_scan(self):
asyncio.run_coroutine_threadsafe(self.scan_devices(), self.loop)
async def scan_devices(self):
try:
# 清空设备列表
self.root.after(0, self.device_tree.delete, *self.device_tree.get_children())
self.log_message("开始扫描蓝牙设备...")
# 执行扫描
devices = await BleakScanner.discover()
# 批量插入设备信息
def insert_devices():
for device in devices:
self.device_tree.insert(
'',
tk.END,
values=(device.name or "未知设备", device.address)
)
self.root.after(0, insert_devices)
self.log_message(f"扫描完成,找到 {len(devices)} 个设备")
except Exception as e:
error_msg = f"扫描失败: {str(e)}"
self.root.after(0, lambda: self.log_message(error_msg))
self.root.after(0, lambda: messagebox.showerror("扫描错误", error_msg))
def connect_device(self):
if selected := self.device_tree.selection():
item = self.device_tree.item(selected[0])
address = item['values'][1]
asyncio.run_coroutine_threadsafe(self.async_connect(address), self.loop)
PB-03F使用的是官方提供的keil工程上修改而来的(bleUart_AT),通过不断的定位最后发现BUP_data_BLE_to_uart_send在这个函数中,会接收到蓝牙发送过来的数据,所以想要完成交互,就可以在这添加一个数据处理函数rec_pro,根上位机的协议对应起来就可以完成控制和返回状态的逻辑了
int BUP_data_BLE_to_uart_send(void)
{
BUP_ctx_t* pctx = &mBUP_Ctx;
if(pctx->tx_state != BUP_TX_ST_IDLE && pctx->tx_size)
{
// run at cmd.
if((pctx->tx_size) == 2 && \
(pctx->tx_buf[0] == 'a') && \
(pctx->tx_buf[1] == 't'))
{
at_at(0,NULL);
pctx->tx_state = BUP_TX_ST_IDLE;
pctx->tx_size = 0;
return PPlus_SUCCESS;
}
// run at+reset cmd.
else if(pctx->tx_size == 8)
{
bool flag = true;
for(int i=0; i<8; i++)
{
if(pctx->tx_buf[i] != ptcmd[i])
{
flag = false;
break;
}
else
continue;
}
if(flag)
at_reset(0,NULL);
}
//AT_LOG("buf:%s",pctx->tx_buf);
//AT_LOG("size:%s",pctx->tx_size);
//FF 00 00 00 00 00 01 FF
rec_pro(pctx->tx_bu);
hal_uart_send_buff((UART_INDEX_e)g_uart_idx, pctx->tx_buf, pctx->tx_size);
pctx->tx_size = 0;
pctx->tx_state = BUP_TX_ST_SENDING;
return PPlus_SUCCESS;
}
LOG("BUP_data_BLE_to_uart_send: incorrect state\n");
return PPlus_ERR_INVALID_STATE;
}
实物展示
目前只是一个小小的Doem阶段,可以远程来控制LED,后面拆一个家中的灯泡,将PB-03F和继电器装入到里面


但是这个活动明天就要结束了😱,但我刚买到的模组和画的继电器模块还没来得急用起来😭。这个蓝牙模块感觉还可以做好多好玩的东西,比如远程控制(现在做的这个)、远程信号调试等等
视频展示