关键词:CubeMX,CubeIDE,STM32G031C8T6,AHT10,DRF1609H
本项目的全部源码资料下载
如果是定时上报温湿度数据的方式,我们可以将这个节点做成低功耗的,这样用电池供电,使用起来就非常方便了。
低功耗实现有2个地方:
1,MCU本身的低功耗;
2,DRF169H的低功耗;
AHT10的功耗非常少,我们这个是采用5号电池供电,基本上就不需要考虑了。
项目做下来,休眠时大约电流是50UA,如果20秒发送一次,电池用一年基本上是没问题的。
下面来分别简述下这2个方面的实现方法:
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);
DRF1609H只有工作在End Device节点下才有低功耗功能;
发送指令,即可以使DRF1609H进入低功耗,发送指令后是有回复的我们可以等待回复,也可以delay 5MS
drf1609h_enterLowPower();
HAL_Delay(5);
退出是模拟下拉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();
}
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};