如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
低功耗实现有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();<div>HAL_UART_Transmit_DMA( &huart1, lowPowerSendOutData, 8);
- HAL_Delay(5);</div>
复制代码
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};
复制代码
|