大家好:
基于前两篇帖子,这期我们实现的是成果贴
首先介绍一下主要硬件组成单元

这个灯板是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>
程序源码,压缩包形式(包含单片机程序及微信小程序代码)
我要赚赏金
