这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32WBA55CG开发板】小台灯之小程序显示电池电压

共2条 1/1 1 跳转至

【STM32WBA55CG开发板】小台灯之小程序显示电池电压

高工
2025-01-16 10:35:09     打赏

首先要感谢EEPW给这次学习的机会。

继《【STM32WBA55CG开发板】按键+小程序控制PWM小台灯》后续。

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

一、准备工作:新增3.7V锂电池

1、电池接线。

image.png

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

image.png

二、软件配置。

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

image.png

image.png

image.png

2、释放BT中的ADC调用。

image.png

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

image.png

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

image.png

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

image.png

三、STM32WBA55CG代码编写。

1、main中启用ADC和定时器:

image.png

2、定义ADC相关全局变量

image.png

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

image.png

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中,修改蓝牙发送字段代码。

image.png

__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修改:增加电池电压变量,原代码中已有温度变量,这里直接使用。

image.png

device.js中“wx.onBLECharacteristicValueChange((characteristic) => {“ 函数中增加电池电压和温度数据解析代码。

这里需要注意的是,由于我们配置STM32WBA55CG的上传数据字节为4个,所以这里也只能解析4个字节数据,若不一致会导致接线不出来。

image.png

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中增加电池电压控件,并修改温度控件,湿度控件可不管。

image.png

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

<!-- 温度显示控件 -->
<view class="display-item">
<text>温度:</text>
<text>{{temperature/10}}°C</text>
</view>

代码编写完之后,编译调试:

image.png

五、效果展示。

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

image.png

1736994693106.png

串口打印信息:

image.png






关键词: STM32WBA55CG     小台灯     电池电压显示    

助工
2025-01-16 10:43:45     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

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