物联网Lora模块从入门到精通(八)Lora无线通信

一、前言

        在某些环境下,无法通过有线传输数据,这时候我们需要使用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()函数来看,其含有四个参数,第二个参数为发射功率,第三个参数与第四个参数分别为发送、接收的超时时间,当遇到环境问题,可以适当调整参数,以达到最好效果。

猜你喜欢

转载自blog.csdn.net/qq_39724355/article/details/131157510
今日推荐