关键词:CubeMX,CubeIDE,STM32G031C8T6,AHT10,DRF1609H
1,读取温湿度传感器(AHT10)
本项目中,采用的是模拟I2C来读取数据,用STM32G031标准的I2C来读不行,不知到为什么,希望看到这个文章的您多多交流,用标准I2C就非常简单了。
具体的模拟过程就不多说了,按流程来就可以了,很简单。
我们这里已经做好了一个文件:dtk_aht10n.c,用户直接拷贝就可以使用,内部没有用到EVENT或其它技术,移植到其它单片机也能使用。AHT10官方也提供了一个demo,感觉不好用,所以自己做了一个。
一个完整的读取参数流程如下:注意那些延时都是需要的,不然读不出来
//--------------
void read_AHT10_once(void)
{
HAL_Delay(10);
reset_AHT10();
HAL_Delay(10);
init_AHT10();
HAL_Delay(10);
startMeasure_AHT10();
HAL_Delay(80);
read_AHT10();
HAL_Delay(5);
}
2,无线发送温湿度数据
1,在主程序里面设定了一个EVENT,每5秒读一次数据
2,如果是主动上报数据,则读取完成后,通过串口把数据发送给DRF1609H
3,DRF1609H将数据透明传输到Cordinator
这里把中间需要延时的部分,用EVENT实现,不需要阻塞,这样可以更快的响应串口指令。
// ---- Read AHT10 Function -------------
if( newEVENT_id & EVENT_3)
{
newEVENT_id = newEVENT_id & (~EVENT_3);
switch(aht10_status)
{
case 0:
aht10_status++;
reset_AHT10();
newEventStart(EVENT_3, 10);
break;
case 1:
aht10_status++;
init_AHT10();
newEventStart(EVENT_3, 20);
break;
case 2:
aht10_status++;
startMeasure_AHT10();
newEventStart(EVENT_3, 80);
break;
case 3:
aht10_status=0;
read_AHT10();
if(dataReportModel == activeReport)
{
//-- Send to DRF1609H -- then to Coordinator ---
//-- use Transparent transmission --------------
set_AHT10sendOutData();
HAL_UART_Transmit_DMA( &huart1, AHT10sendOutData, 10);
}
newEventStart(EVENT_3, 5000);
break;
}
读完以后,只需要把数据通过串口发出去即可(即实现了无线数据传输),所以说DRF1609H模块还是很简单使用的。
HAL_UART_Transmit_DMA( &huart1, AHT10sendOutData, 10);