发帖
7 0 0

【电子DIY作品】蓝牙远程控制家居+PB-03F+PC上位机

小小鸟
金牌会员

4

主题

97

回帖

1625

积分

金牌会员

积分
1625
电子DIY 205 7 6 天前
[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和灯一起装进天花板中,我补一个)

Snipaste_2025-03-20_16-17-57.png

Snipaste_2025-03-20_18-27-37.png

软件代码

上位机的关键部分代码,一个是连接设备,一个是发送数据

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和继电器装入到里面

22.png

2.png

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

视频展示

──── 0人觉得很赞 ────

使用道具 举报

图片裂开了,更换一下。
图片裂开了,更换一下。
6 天前
换啦换啦,还加视频了
小小鸟 发表于 2025-3-20 18:34
换啦换啦,还加视频了

等你把东西做完吧,时间可以缓一缓。
小小鸟 发表于 2025-3-20 18:34
换啦换啦,还加视频了

视频播放不了了,你把录制的视频发在B站,然后附超链接在帖里。
4 天前
爱笑 发表于 2025-3-21 16:35
视频播放不了了,你把录制的视频发在B站,然后附超链接在帖里。

OK,我完善后一并提交
继电器体积有点大
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28167 个
  • 话题数: 39945 篇