物联网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()函数来看,其含有四个参数,第二个参数为发射功率,第三个参数与第四个参数分别为发送、接收的超时时间,当遇到环境问题,可以适当调整参数,以达到最好效果。

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西西菜鸟

打赏支持获得问题解答机会

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值