首先要感谢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才会上报。
串口打印信息: