通过前面的功能实现,我们将主要的基本功能都是实现了:
LED灯的控制与电池电压采集:
https://forum.eepw.com.cn/thread/389424/1
蓝牙相关:
https://forum.eepw.com.cn/thread/389423/1
接下来就是把这些内容融合到一起,让这些成为一个独立的蓝牙控制的台灯,可以试试检测供电电池电压,简述一些硬件模块:
供电部分可以通过电池供电也可以通过USB供电,这里用到了一个电源管理模块(带开关的)可以实现充电、开关控制、LDO输出等功能;
采集部分为电池电量采集,通过电阻分压;
LED灯珠控制部分通过PWM控制,这里加了一个开关电路,有电池直接供电;开发板通过电源管理的LED输出进行供电。
整体实物连接效果如下:
上位机采用的是讲师分享的微信小程序方式进行控制,这样的方式有一点好处现实的内容可控,可以根据我们自己的要求进行显示内容的变化,不止是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