1.STM32 stop模式待机电流6.7uA
2.DHT11温湿度传感器<1uA
3.NB模组BC28待机电流4.3uA
以上综合待机电流11.3uA
主函数代码如下:
while (1)
{
MX_RTC_Init();//每次同步后都初始化,1分钟后可以再次报警
ATRecTime = HAL_GetTick();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (SendClockFlag == 1)
{
SendClockFlag = 0;
/*读取温度*/
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值,如果读取失败则一直死在这里
/*发送数据并接收20s*/
TriggerSendData();//触发发送数据
while(!((HAL_GetTick()-ATRecTime > 20000) && NBSendAccessFlag))//NBSendAccessFlag = 1表示发送数据成功,并等待接收20s
{
NB_Task();
}
//printf ("temperature = %d ,humidity = %d\n",temperature,humidity);
temperature = 0; humidity = 0;//复位温湿度值
/*调试信息i的值*/
// printf("i = %d\n",i);
i ++;//实现上报命令依次递增
//STM32 STOP模式配置步骤如下:
/*把所有引脚配置为模拟
*解决串口150uA漏电问题,实测有效:
*1.先把所有引脚配置为模拟模式
*2.再将STM32设置为STOP模式
*3.再将串口设置为正常推挽输出模式
*4.PA0读取温湿度要设置为高速模式
*/
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay (200);
/*进入STOP模式*/
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/*唤醒之后首先初始化时钟、GPIO、串口的GPIO、串口初始化*/
SystemClock_Config();
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
MX_GPIO_Init();
MX_USART1_UART_Init();
}
}
/* USER CODE END 3 */
}
根据以上的数据推算:
每一年的待机电量:
24h * 365天 * 11.3uA = 113.88mAh
假如一小时发送一次数据,每次发送所需时间1分钟,发送数据一年所需电量:
1min / 60 * 24h * 365天 * 3mA = 438mAh
整机一年所需电量:
113.88mAh + 438mAh = 551.88mAh
2节5号电池规格为3V,2000mAh ,理论待机时间为3年以上!