一、概况
承接上期的【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提供的试用活动,以及刘工对活动的大力支持。