大家好:
基于前两篇帖子,这期我们实现的是成果贴
首先介绍一下主要硬件组成单元
这个灯板是12V供电的,可实现双色温亮度控制
我的电源使用的是3S的锂电池包
为了方便检测电压及电流,我们使用的是INA226模块
再一个就是MOS驱动
以及12V转5V降压模块
整体硬件结构图如下图所示
主要使用引脚见下图
接下来说一下软件流程
接下来解释软件编码部分
整个工程以示例工程BLE_p2pServer为基础,进行适配。
在导入BLE_p2pServer示例工程后,需要进行如下操作:
1、配置TIM2的CH3和CH4
2、IIC配置
3、调整蓝牙服务My_SWITCH_Char数据长度为8
配置好之后生成初始代码
进行下一步修改
依据过程贴添加INA226驱动文件
资料链接:https://github.com/patsaoglou/INA226
接下来修改main.c文件,添加tim初始化代码及INA226数据读取代码
首先包含INA226头文件
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "ina226.h" /* USER CODE END Includes */
接下来配置TIM启动及INA226初始化
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); ina226_handle ina226; ina226_init(&ina226, &hi2c1, V_BUS_2_116ms | V_SHUNT_2_116ms | CONTINUOUS_MODE_ALL); /* Set calibration register */ ina226_set_cal_reg(&ina226); /* USER CODE END 2 */
在循环内读取电压电流数据
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if (check_if_conversion_ready(&ina226) == INA_CONVERSION_READY) { current = ina226_current_via_reg(&ina226); bus_voltage = ina226_read_bus_voltage(&ina226); power = ina226_power_via_reg(&ina226); } HAL_Delay(10); /* USER CODE END WHILE */ MX_APPE_Process(); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
接下来就是和蓝牙相关的代码的修改了
主要修改p2p_server_app.c文件
首先修改控制灯光亮度的部分,位于函数P2P_SERVER_Notification
/* Functions Definition ------------------------------------------------------*/ 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]; __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,pwmValue); } if(p_Notification->DataTransfered.p_Payload[0] == 0x04) { pwmValue = p_Notification->DataTransfered.p_Payload[1]; __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,pwmValue); } /* 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; }
这部分代码是添加的
if(p_Notification->DataTransfered.p_Payload[0] == 0x03) { pwmValue = p_Notification->DataTransfered.p_Payload[1]; __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,pwmValue); } if(p_Notification->DataTransfered.p_Payload[0] == 0x04) { pwmValue = p_Notification->DataTransfered.p_Payload[1]; __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,pwmValue); }
添加外部变量引用
/* External variables --------------------------------------------------------*/ /* USER CODE BEGIN EV */ extern float bus_voltage; extern float current; /* USER CODE END EV */
接下来修改函数P2P_SERVER_Switch_c_SendNotification
__USED void P2P_SERVER_Switch_c_SendNotification(void) /* Property Notification */ { P2P_SERVER_APP_SendInformation_t notification_on_off = Switch_c_NOTIFICATION_OFF; 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 */ if(P2P_SERVER_APP_Context.ButtonControl.ButtonStatus == 0x00) { P2P_SERVER_APP_Context.ButtonControl.ButtonStatus = 0x01; } else { P2P_SERVER_APP_Context.ButtonControl.ButtonStatus = 0x00; } uint32_t *pValue = &bus_voltage; uint32_t tempValue = *pValue; LOG_INFO_APP("-- tempValue == %x\n", tempValue); for (size_t i = 0; i < 4; i++) { a_P2P_SERVER_UpdateCharData[3 -i] = (tempValue >> (8 * i)) & 0xFF; } for (size_t i = 0; i < 4; i++) { LOG_INFO_APP("-- No %d of buffer == %x\n", i, a_P2P_SERVER_UpdateCharData[i]); } pValue = ¤t; tempValue = *pValue; LOG_INFO_APP("-- tempValue == %x\n", tempValue); for (size_t i = 0; i < 4; i++) { a_P2P_SERVER_UpdateCharData[7 -i] = (tempValue >> (8 * i)) & 0xFF; } for (size_t i = 0; i < 4; i++) { LOG_INFO_APP("-- No %d of buffer == %x\n", i + 4, a_P2P_SERVER_UpdateCharData[i + 4]); } /* Update notification data length */ p2p_server_notification_data.Length = (p2p_server_notification_data.Length) + 8; if(P2P_SERVER_APP_Context.Switch_c_Notification_Status == Switch_c_NOTIFICATION_ON) { LOG_INFO_APP("-- P2P APPLICATION SERVER : INFORM CLIENT BUTTON 1 PUSHED\n"); notification_on_off = Switch_c_NOTIFICATION_ON; } else { LOG_INFO_APP("-- P2P APPLICATION SERVER : CAN'T INFORM CLIENT - NOTIFICATION DISABLED\n"); } /* USER CODE END Service1Char2_NS_1 */ if (notification_on_off != Switch_c_NOTIFICATION_OFF) { P2P_SERVER_UpdateValue(P2P_SERVER_SWITCH_C, &p2p_server_notification_data); } /* USER CODE BEGIN Service1Char2_NS_Last */ /* USER CODE END Service1Char2_NS_Last */ return; }
此处主要添加的是电压电流数据上报的功能
需要注意数据长度为8
至此单片机端程序适配完成。
接下来进入小程序端程序适配工作
修改device.wxml文件,添加触摸滑块,修正显示控件名称
后续修改device.js,适配白光及暖光控制相关代码
白光控制
暖光控制
接下类是电压电流数据解析相关代码
至此代码适配完成,相关效果图如下
白光效果
暖光效果
双色光效果
至此项目介绍已完毕,后面附视频介绍链接。
https://www.bilibili.com/video/BV1TRrDYeEvu/
<iframe src="//player.bilibili.com/player.html?bvid=BV1TRrDYeEvu&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
程序源码,压缩包形式(包含单片机程序及微信小程序代码)