这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32WBA55CG开发板】基于BLE双色温台灯并通过按键上报电池电压及电

共6条 1/1 1 跳转至

【STM32WBA55CG开发板】基于BLE双色温台灯并通过按键上报电池电压及电流-成果贴

菜鸟
2025-01-06 23:12:46   被打赏 100 分(兑奖)     打赏

大家好:

    基于前两篇帖子,这期我们实现的是成果贴

    首先介绍一下主要硬件组成单元

    

156a5176-9f1d-45de-9775-528d49c4981d.jpg

    这个灯板是12V供电的,可实现双色温亮度控制

    我的电源使用的是3S的锂电池包

    5e0d200f-c9d5-4f34-a273-22d63106614c.jpg

    为了方便检测电压及电流,我们使用的是INA226模块

    4047e478-f08c-4af3-90ab-295241760581.jpg

    再一个就是MOS驱动

    4eed4f18-a0e7-4bbc-aa85-5ce89b4886d3.jpg

    以及12V转5V降压模块

    企业微信截图_17361690867045.png

    整体硬件结构图如下图所示

    企业微信截图_17361703275385.png

    主要使用引脚见下图

    企业微信截图_17361704698931.png

    接下来说一下软件流程

    企业微信截图_17361711913700.png

    接下来解释软件编码部分

    整个工程以示例工程BLE_p2pServer为基础,进行适配。

    在导入BLE_p2pServer示例工程后,需要进行如下操作:

        1、配置TIM2的CH3和CH4                 企业微信截图_17361715196695.png

            企业微信截图_17361715617163.png

        2、IIC配置

        企业微信截图_17361716797558.png

                3、调整蓝牙服务My_SWITCH_Char数据长度为8

            企业微信截图_17361718031174.png

            配置好之后生成初始代码

            进行下一步修改

            依据过程贴添加INA226驱动文件

            资料链接:https://github.com/patsaoglou/INA226

            企业微信截图_17361719928960.png

            接下来修改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 = &current;
	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

企业微信截图_17361727832049.png


至此单片机端程序适配完成。


接下来进入小程序端程序适配工作

修改device.wxml文件,添加触摸滑块,修正显示控件名称

企业微信截图_17361730232142.png

后续修改device.js,适配白光及暖光控制相关代码

白光控制

企业微信截图_17361731346202.png

暖光控制

企业微信截图_17361731612465.png

接下类是电压电流数据解析相关代码

企业微信截图_17361732795448.png

至此代码适配完成,相关效果图如下

白光效果

企业微信截图_17361754356250.png

暖光效果

企业微信截图_17361754823441.png

双色光效果

企业微信截图_17361755264165.png

至此项目介绍已完毕,后面附视频介绍链接。

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>

程序源码,压缩包形式(包含单片机程序及微信小程序代码)

蓝牙控灯程序代码-小程序-单片机.zip




关键词: STM32WBA55CG     蓝牙台灯    

高工
2025-01-06 23:56:10     打赏
2楼

楼主这家当也太硬了啊


助工
2025-01-07 08:12:55     打赏
3楼

这工程挺牛的呀,可以用到现实工程中。


专家
2025-01-07 08:16:14     打赏
4楼

厉害的


助工
2025-01-07 13:36:26     打赏
5楼

谢谢分享


菜鸟
2025-01-12 17:45:23     打赏
6楼

学习了


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]