STM32G031无线温湿度仪开源项目 -7,低功耗的实现

关键词:CubeMX,CubeIDE,STM32G031C8T6,AHT10,DRF1609H

如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
低功耗实现有2个地方:
1,MCU本身的低功耗;
2,DRF169H的低功耗;
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
下面来分别简述下这2个方面的实现方法:

1,MCU本身的低功耗

STM32G0系列的功耗管理函数在这2个文件里面,是ST自带的库函数,实现起来非常方便
stm32g0xx_hal_pwr_ex.c
stm32g0xx_hal_pwr.c

具体的实现方法:
1,关闭LED及设定DRF1609H进入休眠,设定DRF1609H进入休眠是串口发送指令给DRF1609H
2,设定RTC中断时间,设定MCU进入低功耗
3,RTC中断唤醒MCU休眠
4,唤醒后重新初始化MCU(包括系统时钟、串口、IO口、DMA)
5,测量一次温湿度数据
6,唤醒DRF1609H,下拉DRF1609H的Function按键唤醒
7,发送温湿度数据
8,重复以上1-7

		// --Enter Low Power Model  -- //
		LED2_OFF();
		drf1609h_enterLowPower();
		HAL_Delay(5);
		//--Set wake up time = 0x500B = 10S ----
		//--Set wake up time = 0xA017 = 20S ----
		HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x500B, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
		HAL_PWREx_EnableFlashPowerDown(PWR_FLASHPD_STOP);
		//HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
		HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);
		SystemClock_Config();
		MX_GPIO_Init();
		MX_DMA_Init();
		MX_USART1_UART_Init();

		LED2_ON();
		//-------------------
		read_AHT10_once();
		//--------------------
		drf1609h_outLowPower();
		HAL_Delay(5);
		//--Send out the AHT10 Data as point-to-point transfer model -----
		set_lowpowerSendOutData();
		HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
		HAL_Delay(5);

2,DRF169H的低功耗实现

2.1,进入低功耗

DRF1609H只有工作在End Device节点下才有低功耗功能;
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS

		drf1609h_enterLowPower();
		HAL_Delay(5);

具体可以参考DRF1609H的说明书
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2,退出低功耗

退出是模拟下拉Function按键5MS实现

		drf1609h_outLowPower();
		HAL_Delay(5);
//-----------------------
void drf1609h_outLowPower(void)
{
	set_outLowPowerPin_outPut();
	HAL_Delay(1);

	set_outLowPowerPin_out_1();
	HAL_Delay(1);

	set_outLowPowerPin_out_0();
	HAL_Delay(5);

	set_outLowPowerPin_out_1();
	HAL_Delay(1);

	set_outLowPowerPin_input();
}

2.3,退出低功耗以后的数据传输

DRF1609H进入低功耗以后,将不会自动更新路由路径,所以唤醒后用点对点发送方式,点对点发送方式会自动寻找路由,但是效率比较低,所以一般情况下用透明传输方式。
Coordinator的短地址永远是0x0000,即采用目标地址为0x0000的点对点方式发送。
点对点发送的官方描述是这样的:
在这里插入图片描述
在这里插入图片描述
代码实现为:

		//--Send out the AHT10 Data as point-to-point transfer model -----
		set_lowpowerSendOutData();
		HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
		HAL_Delay(5);
//----------------------
void  set_lowpowerSendOutData(void)
{
	lowPowerSendOutData[4] = AHT10_OutData[0];
	lowPowerSendOutData[5] = AHT10_OutData[1];
	lowPowerSendOutData[6] = AHT10_OutData[2];
	lowPowerSendOutData[7] = AHT10_OutData[3];
}
uint8_t    lowPowerSendOutData[8]={0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
发布了8 篇原创文章 · 获赞 7 · 访问量 556

猜你喜欢

转载自blog.csdn.net/yihua2009/article/details/104296198