这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【WBA55CG无线MCU开发大作战】4、成果贴:汇总及讲解(蓝牙控制小夜灯)

共1条 1/1 1 跳转至

【WBA55CG无线MCU开发大作战】4、成果贴:汇总及讲解(蓝牙控制小夜灯)

高工
2025-01-12 22:21:06     打赏

        通过前面的功能实现,我们将主要的基本功能都是实现了:

        LED灯的控制与电池电压采集:

        https://forum.eepw.com.cn/thread/389424/1

        蓝牙相关:

        https://forum.eepw.com.cn/thread/389423/1

        接下来就是把这些内容融合到一起,让这些成为一个独立的蓝牙控制的台灯,可以试试检测供电电池电压,简述一些硬件模块:        

        供电部分可以通过电池供电也可以通过USB供电,这里用到了一个电源管理模块(带开关的)可以实现充电、开关控制、LDO输出等功能;

        采集部分为电池电量采集,通过电阻分压;

        LED灯珠控制部分通过PWM控制,这里加了一个开关电路,有电池直接供电;开发板通过电源管理的LED输出进行供电。

        整体实物连接效果如下:

image.png

        上位机采用的是讲师分享的微信小程序方式进行控制,这样的方式有一点好处现实的内容可控,可以根据我们自己的要求进行显示内容的变化,不止是HEX的数据格式,更加的直观,我们本次显示的内容是电池电压,这里我们可以通过修改小程序的显示内容:

<!-- 电压显示控件 -->
  <view class="display-item">
    <text>电池电压:</text>
    <text>{{temperature}} mV</text>
  </view>

        这里偷懒了,直接用解析的temperature数据进行显示。

        对应的开发板的程序需要进行适配管理,主要的内容就是如下:

        定时采集电池电压,这里是通过定时器17进行定时1s采集:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM17) {
    HAL_IncTick();
    ADC_cnt++;
    if(ADC_cnt > 100)
    {
        ADC_cnt = 0;
        if (HAL_ADC_Start(&hadc4) != HAL_OK)  
        {  
            /* ADC conversion start error */  
            Error_Handler();  
        }  
        /* Wait for ADC conversion completed */  
        if (HAL_ADC_PollForConversion(&hadc4, 10) != HAL_OK)  
        {  
            /* End Of Conversion flag not set on time */  
            Error_Handler();  
        }  
        uhADCxData = HAL_ADC_GetValue(&hadc4);
        uhADCxData = uhADCxData*3300/4096*2;
        uhADCxConvertedData[0] = uhADCxData;  
        UTIL_SEQ_SetTask( 1<<CFG_TASK_SEND_NOTIF_ID, CFG_SEQ_PRIO_0);
    }
  }
}

        这里采集完数据之后直接启动CFG_TASK_SEND_NOTIF_ID认为发送,对应的数据发送需要修改一下:

a_P2P_SERVER_UpdateCharData[0] = uhADCxConvertedData[0]>>8; /* Device Led selection */
a_P2P_SERVER_UpdateCharData[1] = uhADCxConvertedData[0];

        P2P_SERVER_Switch_c_SendNotification(void)中主要是修改这两处就可以实现数据发送关联了;

        而LED灯珠的控制测试在P2P_SERVER_Notification中进行:

case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
    /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */

    if(p_Notification->DataTransfered.p_Payload[0] == 0x00)
    {
        if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
        {
        BSP_LED_On(LED_BLUE);
        LED_flag = 1;
        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);
        __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,0);
        LED_flag = 0;
        LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n"); 
        P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
        }
    }
    else if(p_Notification->DataTransfered.p_Payload[0] == 0x03 && (LED_flag == 1))
    {
        __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,p_Notification->DataTransfered.p_Payload[1]*10);
    }
    /* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
    break;

        可以看到我们没有更改之前的控制(蓝灯的控制),在此基础上我们增加了LED灯珠的控制,开启和关闭是同步的,而亮度是只有在开启的情况下才会进行控制。

        综合的视频展现和讲解如下:

        【WBA55CG无线MCU开发大作战效果展示】 https://www.bilibili.com/video/BV1FacgedEu2/?share_source=copy_web&vd_source=1a9d212763ed1cd1e393681740edda64






关键词: WBA55CG     成果     汇总     小夜灯    

共1条 1/1 1 跳转至

回复

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