一、概况
承接上期的【NUCEO-WBA55CG开发板测评】开箱与环境搭建,创建PWM输出工程过程贴,借助STM32CubeMX工具快速构建了四路PWM输出。本次按照刘工视频讲解的内容,使用“STM32Cube_FW_WBA_V1.5.0”官方提供的“BLE_p2pServer”工程,由于官方提供的例程中已使用PA8、PB12作为虚拟串口收发接口,因此需要采用其它IO口作为PWM输出,才能实现上期过程贴功能。
本次按照《DIY蓝牙遥控小台灯课程》要求,购买了5V/4W的展台日光灯,长20cm,配套购买了MOS触发开关驱动模块,TP4056充电模块Type-C接口(带保护),还充分利用一个坏了的手持式风扇的18650电池座。另外驱动两路PWM信号输出,作为L298N模块的两路信号输入,这里不考虑两个电机的转向,因此只需要创建两路PWM信号输入,如若考虑电机换向转动,则需创建四路PWM信号输入,这里就相当于模拟吊风扇。
二、连线示意图与实物连接

三、工程配置
将原“BLE_p2pServer”工程复制一份到同目录下,并重命名为“BLE_p2pServer_My”,然后使用CubeMX配置PA6、PA2、PA1三路PWM输出,初始化Pulse为0。具体的参数设置,这里就不再赘述。MCU的IO口利用如下:


四、代码完善
使用上述STM32CubeMX导出的MDK工程,在main.c中的main函数中添加“HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);”
“HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);”“HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);”,然后在“p2p_server_app.c”
文件中声明htim2、htim3,以及pwmValue,motor1Duty,motor2Duty的变量,并在“P2P_SERVER_Notification”函数中添加逻辑处理代码。
void P2P_SERVER_Notification(P2P_SERVER_NotificationEvt_t *p_Notification)
{
/* USER CODE BEGIN Service1_Notification_1 */
/* USER CODE END Service1_Notification_1 */
switch(p_Notification->EvtOpcode)
{
/* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
/* USER CODE END Service1_Notification_Service1_EvtOpcode */
case P2P_SERVER_LED_C_READ_EVT:
/* USER CODE BEGIN Service1Char1_READ_EVT */
/* USER CODE END Service1Char1_READ_EVT */
break;
case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
/* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
{
BSP_LED_On(LED_BLUE);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
}
if(p_Notification->DataTransfered.p_Payload[1] == 0x00)
{
BSP_LED_Off(LED_BLUE);
LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n");
P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
}
if(p_Notification->DataTransfered.p_Payload[0] == 0x03)
{
pwmValue = p_Notification->DataTransfered.p_Payload[1] * 20;
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,pwmValue);
LOG_INFO_APP("-- Send pwmValue : %d\n",pwmValue);
}
if(p_Notification->DataTransfered.p_Payload[0] == 0x04)
{
motor1Duty = p_Notification->DataTransfered.p_Payload[1] * 50;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1,motor1Duty);
LOG_INFO_APP("-- Send motor1Duty : %d\n",motor1Duty);
}
if(p_Notification->DataTransfered.p_Payload[0] == 0x05)
{
motor2Duty = p_Notification->DataTransfered.p_Payload[1] * 50;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2,motor2Duty);
LOG_INFO_APP("-- Send motor2Duty : %d\n",motor2Duty);
}
/* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
break;
case P2P_SERVER_SWITCH_C_NOTIFY_ENABLED_EVT:
/* USER CODE BEGIN Service1Char2_NOTIFY_ENABLED_EVT */
P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_ON;
LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION ENABLED\n");
LOG_INFO_APP(" \n\r");
/* USER CODE END Service1Char2_NOTIFY_ENABLED_EVT */
break;
case P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT:
/* USER CODE BEGIN Service1Char2_NOTIFY_DISABLED_EVT */
P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;
LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION DISABLED\n");
LOG_INFO_APP(" \n\r");
/* USER CODE END Service1Char2_NOTIFY_DISABLED_EVT */
break;
default:
/* USER CODE BEGIN Service1_Notification_default */
/* USER CODE END Service1_Notification_default */
break;
}
/* USER CODE BEGIN Service1_Notification_2 */
/* USER CODE END Service1_Notification_2 */
return;
}另外如果需要修改广播名称,可进入“app_ble.c”文件中进行修改,笔者这里设置成“WBA55CG”名称。
五、微信小程序
也是参考刘工讲解的视频讲解,先下载安装注册好微信开发者工具,去到小程序蓝牙能力概述,免费下载“示例代码”,然后加载到微信开发者工具中,结合MDK工程中的逻辑处理,添加数据变量,开关按钮,滑块按钮等。
六、小结与效果演示
正如视频所示,可通过微信小程序蓝牙远程控制板上LED1蓝色指示灯、4W展示台日光灯以及两路电机转速,基本达成预期效果。小结一下:之前没怎么接触微信小程序,也不太懂json,wxml,wxss等语法,经过此次尝试感觉受益匪浅,感谢EEPW提供的试用活动,以及刘工对活动的大力支持。
我要赚赏金
