首先要感谢EEPW给这次学习的机会。
继《【STM32WBA55CG开发板】按键+小程序控制PWM小台灯》后续。
https://forum.eepw.com.cn/thread/389506/1
一、准备工作:新增3.7V锂电池。
1、电池接线。

原理如下:电池电压检测,接入PA7(ADC4)。

二、软件配置。
1、配置ADC:选择ADC4循环获取3个通道的值。



2、释放BT中的ADC调用。

3、配置TIM17:定时1秒,用于定时做ADC采样。

4、BLE上传数据长度改为4个:传输电池电压2个+温度2个。

5、导出代码:代码导出之后,要再次删除感叹号!冗余的文件,即可编译通过。

三、STM32WBA55CG代码编写。
1、main中启用ADC和定时器:

2、定义ADC相关全局变量

3、main.c中添加TIM17回调函数:主要实现ADC循环采样。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM17) {
HAL_IncTick();
//eepw demo adc
LOG_INFO_APP("\r\nEEPW DEMO ADC ==> \r\n");
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();
}
Adcx_Value[0] = HAL_ADC_GetValue(&hadc4);
BatVolValue = Adcx_Value[0]*330/4096*2;
LogTempOut = (float)BatVolValue/100;
LOG_INFO_APP("BatVolValue: %d -> %0.2f V\r\n", BatVolValue, LogTempOut);
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();
}
Adcx_Value[1] = HAL_ADC_GetValue(&hadc4);
VrefVolValue = Adcx_Value[1]*330/4096;
LogTempOut = (float)VrefVolValue/100;
LOG_INFO_APP("VrefVolValue: %d -> %0.2f V\r\n", VrefVolValue, LogTempOut);
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();
}
Adcx_Value[2] = HAL_ADC_GetValue(&hadc4);
TempSensorValue = Adcx_Value[2]*3300/4096/2.5;
LogTempOut = (float)TempSensorValue/10;
LOG_INFO_APP("TempSensorValue: %d -> %0.1f V\r\n", TempSensorValue, LogTempOut);
}
}4、蓝牙部分代码。
在p2p_server_app.c中,修改蓝牙发送字段代码。

__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;
}
//a_P2P_SERVER_UpdateCharData[0] = 0x01; /* Device Led selection */
//a_P2P_SERVER_UpdateCharData[1] = P2P_SERVER_APP_Context.ButtonControl.ButtonStatus;
//eepw adc
LOG_INFO_APP("-- P2P APPLICATION SERVER : EEPW ADC Start \r\n");
// uint16_t *pValue = &BatVolValue;
// uint16_t VTempValue = *pValue;
LOG_INFO_APP("-- P2P APPLICATION SERVER : EEPW ADC BatVolValue = %d \r\n", BatVolValue);
a_P2P_SERVER_UpdateCharData[0] = BatVolValue / 10; /* Device Led selection */
a_P2P_SERVER_UpdateCharData[1] = BatVolValue % 10;
// *pValue = TempSensorValue;
// VTempValue = *pValue;
LOG_INFO_APP("-- P2P APPLICATION SERVER : EEPW ADC TempSensorValue = %d \r\n", TempSensorValue);
a_P2P_SERVER_UpdateCharData[2] = TempSensorValue / 10; /* Device Led selection */
a_P2P_SERVER_UpdateCharData[3] = TempSensorValue % 10;
LOG_INFO_APP("-- P2P APPLICATION SERVER : EEPW ADC End \r\n");
/* Update notification data length */
p2p_server_notification_data.Length = (p2p_server_notification_data.Length) + 4;
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;
}至此,STM32WBA55CG已经配置完成。接下来处理小程序。
四、小程序代码编写。
1、小程序代码修改。
device.js修改:增加电池电压变量,原代码中已有温度变量,这里直接使用。

device.js中“wx.onBLECharacteristicValueChange((characteristic) => {“ 函数中增加电池电压和温度数据解析代码。
这里需要注意的是,由于我们配置STM32WBA55CG的上传数据字节为4个,所以这里也只能解析4个字节数据,若不一致会导致接线不出来。

if(characteristic.characteristicId == '0000FE42-8E22-4541-9D4C-21EDAE82ED19')
{
let dataView = new DataView(characteristic.value)
//const temp = (dataView.getUint8(0))*10 + dataView.getUint8(1);
//const hum = (dataView.getUint8(2))*10 + dataView.getUint8(3);
const temp1 = (dataView.getUint8(0))*10 + dataView.getUint8(1);
const temp2 = (dataView.getUint8(2))*10 + dataView.getUint8(3);
this.setData({
//temperature: temp,
//humidity: hum,
BatVolValue: temp1,
temperature: temp2,
})
}device.wxml中增加电池电压控件,并修改温度控件,湿度控件可不管。

<!-- 电池电压显示控件 -->
<view class="display-item">
<text>电池电压:</text>
<text>{{BatVolValue/100}}V</text>
</view>
<!-- 温度显示控件 -->
<view class="display-item">
<text>温度:</text>
<text>{{temperature/10}}°C</text>
</view>代码编写完之后,编译调试:

五、效果展示。
微信小程序:注意上报数据,需要按开发板上的B1才会上报。


串口打印信息:

我要赚赏金
