一、前言
在某些环境下,无法通过有线传输数据,这时候我们需要使用Lora无线通信传输数据,Lora无线数据传输具有低功耗、距离长的特点,常用于工厂内等,需要Lora基站。
我曾做过距离测试:Lora模块距离测试-物联网Lora开发
二、代码实现
本次的任务目标为将光照数据由传感器端传至节点端。
由于我们需要在传感器端和节点端完成不同的程序设计,因此我们需要完成两份例程。
在提供的基础例程中,为我们提供了关于Lora基础通信的库,帮助我们尽快的完成程序的设计开发。这两个库文件分别是NS_Radio.c与sx1276.h,这是因为开发板的Lora模块使用的是sx1276模块完成的。
初始化与接收的函数是在NS_Radio.c中实现的:
/**********************************************************************************************
*函数:void NS_RadioInit( uint32_t freq, int8_t power, uint32_t txTimeout, uint32_t rxTimeout)
*功能:对射频模块发送、接收参数进行初始化
*输入:
* freq载波频率,建议433MHz附近频率最佳
* power发射功率,最大20
* txTimeout发送超时时间
* uint32_t rxTimeout 接收超时时间
*输出:无
*特殊说明:无
**********************************************************************************************/
void NS_RadioInit( uint32_t freq, int8_t power, uint32_t txTimeout, uint32_t rxTimeout)
{
NS_RadioEventsInit();//无线射频模块注册事件回调函数
NS_RadioSetTxRxConfig( freq, power, txTimeout );
Radio.Rx( rxTimeout );//设置LoRa模块为接收模式,同时设置超时时间,必许步骤
}
/**********************************************************************************************
*函数:uint16_t ReadRadioRxBuffer( uint8_t *payload)
*功能:读取射频接收缓存信息,包括读取接收到的数据长度和缓存数据。
*输入:无
*输出:uint8_t *payload, 指针,指向要用于存放接收缓存的地址
*返回:返回接收到的数据长度
*特殊说明:每调用一次ReadRadioRxBuffer( )函数,LoRaBufferSize会被置0.
**********************************************************************************************/
uint16_t ReadRadioRxBuffer( uint8_t *payload)
{
uint16_t LengthTemp;
LengthTemp = LoRaBufferSize;
if(LengthTemp <= 0)
{
return 0;
}
LoRaBufferSize = 0;
//payload = LoRaBuffer;
memcpy( payload, LoRaBuffer, LengthTemp );
return LengthTemp;
}
而发送的函数是在sx1276.c中实现的:
下面来看具体的代码实现。
传感器端
float temp=0,hum=0,light=0;
uint8_t data[30];
int main( void )
{
Init();
ADCS_Init();//初始化ADC
NS_RadioInit(433000000,10,1000,1000);//初始化无线通信
while( 1 )
{
HAL_Delay(1000);//延时1000ms
AdcScanChannel();//更新通道值
light=((5.0/2.0)*AdcReadCh0())*100.0;//获取光照并通过公式计算
memset(data,'\0',30);//清空数据数组
sprintf((char *)data,"%.2f",light);//将数据写入数组
SX1276Send(data,30);//发送数据
}
}
节点端
float temp=0,hum=0,light=0;
uint8_t data[30];
int main( void )
{
Init();
ADCS_Init();//初始化ADC
NS_RadioInit(433000000,10,1000,1000);//注意与传感器端相同
while( 1 )
{
HAL_Delay(1000);//延时1000ms
memset(data,'\0',30);//清空数据数组
if(ReadRadioRxBuffer(data)!=0)
{
light=atof((char *)data);
}
}
}
值得注意的是,数据的传输是受环境因素影响的,根据前文提到的NS_RadioInit()函数来看,其含有四个参数,第二个参数为发射功率,第三个参数与第四个参数分别为发送、接收的超时时间,当遇到环境问题,可以适当调整参数,以达到最好效果。