踩着2024的尾巴完成了本次DIY活动,致敬天马行空!
不能全程通过STM32CubeMX去一步一步添加,那就把之前做过得内容移植到BLE_p2pServer里面,效果其实是一样得,不过这里我们有一点需要了解得是,LED2(绿灯)被用作状态展示了,会影响我们得功能展示,这一方面是个我们需要重点注意一下得地方,我们需要一个额外得LED进行蓝牙状态得展示,以便于我们之前的LED控制状态的展示,到这里就有必要开始设计一个扩展板以便于我们实现一个可以独立工作的工具。
这个扩展板上目前知道需要集成的模块:
CO2模块;
电源模块(电池/升压/开关机控制等);
LED状态展示;
我们需要结合板载的部分资源进行一些引脚的确定,例如板载LED,按键等内容,这些是不能冲突的,规划CO2模块的控制引脚等等。
我们这里用到了一个之前测评用的扩展模块,其上面原先搭载的是英飞凌CO2传感器12V,我们需要进行一下简单的修改,这次使用的是CO2传感器 5V版本,主要的差异就是发射器的供电,所以修改了一下升压电路的配置,使其输出为5V,毕竟不管是到5V还是12V,最终使用的是电池供电,最高也就4.2V左右,都是要进行升压的,整体的硬件连接如下:
由于涉及到了扩展板的LED展示,而蓝牙服务例程中使用的LED2进行连接状态的展示,这里我们需要进行一下转移,到扩展模块上的LED黄灯,我们使用PA2引脚进行控制,涉及到的函数主要集中在 "app_ble.c"中,修改如下:
static void Switch_OFF_GPIO(void *arg) { // BSP_LED_Off(LED_GREEN); BLELED_off; return; } static void Adv_Cancel(void) { // BSP_LED_Off(LED_GREEN); BLELED_off; APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_STOP); return; }
对应打开函数在SVCCTL_App_Notification(void *p_Pckt)中:
case ACI_HAL_END_OF_RADIO_ACTIVITY_VSEVT_CODE: { /* USER CODE BEGIN RADIO_ACTIVITY_EVENT */ // BSP_LED_On(LED_GREEN); BLELED_on; UTIL_TIMER_StartWithPeriod(&bleAppContext.SwitchOffGPIO_timer_Id, LED_ON_TIMEOUT_MS); /* USER CODE END RADIO_ACTIVITY_EVENT */ break; /* ACI_HAL_END_OF_RADIO_ACTIVITY_VSEVT_CODE */ }
按键的控制例程对应的在如下:
void APPE_Button3Action(void) { if (bleAppContext.Device_Connection_Status != APP_BLE_CONNECTED_SERVER) { LED.Mode_Dis++; LED.Mode_Dis %=5; } else { APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_CONN_PARAM_UPDATE); } return; }
B1和B2都用在了蓝牙服务控制上了,这里的手动控制LED模式就放到了B3按键上;
CO2传感器的采集实际上现成的驱动,和之前12V版本是共用的,最终结果会体现在如下变量中:
typedef struct { uint8_t Error; //错误码 uint8_t ID; uint8_t INTFlag; uint16_t PPM; uint8_t MEAS_STS; }PasCO2States;//传感器状态
我们只要定期通过P2P_SERVER_UpdateValue进行上传就可以了,这里我们写了一个CO2 PPM数据定期上传的函数,在采集到新的数据后就通过蓝牙进行传输:
__USED void P2P_SERVER_SendCO2(void) /* Property Notification */ { P2P_SERVER_Data_t p2p_server_notification_data; p2p_server_notification_data.p_Payload = (uint8_t*)a_P2P_SERVER_UpdateCharData; p2p_server_notification_data.Length = 0; /* USER CODE BEGIN Service1Char2_NS_1 */ a_P2P_SERVER_UpdateCharData[0] = 0x09; /* Device Led selection */ a_P2P_SERVER_UpdateCharData[1] = (PasCO2.PPM>>8); a_P2P_SERVER_UpdateCharData[2] = PasCO2.PPM; /* Update notification data length */ p2p_server_notification_data.Length = (p2p_server_notification_data.Length) + 3; if(PasCO2.sengflag != 0) { P2P_SERVER_UpdateValue(P2P_SERVER_CO2_C, &p2p_server_notification_data); PasCO2.sengflag = 0; } return; }
这里我们新添加了一个Characteristic3作为CO2数据上传的专属通道,这里建议通过STM32CubeMX进行修改,修改这里的数量可以随意增加:
然后可以参照Characteristic2进行配置修改:
这里我也进行过在程序里面按照对应的进行修改添加,但是最后相关服务能够连接,就是上传数据失败,aci_gatt_update_char_value CO2_C command, error code: 0x92,0x92的报错,估计也是临门一脚了,通过STM32CubeMX进行配置,直接可以连接了,上传数据也成功了:
最终的效果可以在如下视频中的最终效果展示视频中进行查看,视频地址如下:
【STM32WBA55CG环境检测(CO2)蓝牙上传效果展示】 效果视频