查看: 2171|回复: 5

[资料发布] unicore开发套包实验 - 温湿度定时上报

[复制链接]

8

主题

13

帖子

61

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
61
发表于 2019-11-20 17:17:51 | 显示全部楼层 |阅读模式
1、实验环境说明

1.1、实验前提:

1.1.1、已经确保节点网关添加入unicode3.0服务器中。
具体步骤查看《unicore开发套包使用教程》

1.1.2、创建好工程,并配置好开发环境
关于工程目录说明参考:《M90_M91 开发板系列编程指导说明书

1.2、实验器件
l 利尔达LSD4WN-2NTEST03LoRaWAN开发板(USB线、天线转接头)
l 利尔达unicode3.0服务器
l LoRaWAN网关
1.3、实验软件
l MDK 5.14
l 串口调试助手

附上代码工程:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

13

帖子

61

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
61
 楼主| 发表于 2019-11-20 17:20:15 | 显示全部楼层
本帖最后由 RF001 于 2019-11-21 09:21 编辑

2、程序说明
2.1、初始化
2.1.1、MCU初始化

初始化如图所示
主要注意初始化IIC(温湿度传感器通讯)
串口(与模块通讯),

2.1.2、模块初始化
调用M90_M91_Interface.h中的M90_M91_Init()函数进行初始化

2.2、关于模块操作时序

在操作模块之前请认真查看一下时序图,对模块进行操作。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

13

帖子

61

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
61
 楼主| 发表于 2019-11-20 17:24:27 | 显示全部楼层
本帖最后由 RF001 于 2019-11-20 18:41 编辑

2.3、关于模块参数设置
关于模块设置参数流程:
2.3.1、确保模块唤醒且进入命令模式
调用LoRaNode_SetWake()LoRaNode_SetMode()进行设置
    // 该函数用于通过AT指令设置M90的参数(适用于参数为整型)   
    int LoRaNode_Setinteger(uint8_t *AT_Command,uint32_t AT_Value);   
    // 该函数用于通过AT指令设置M90的参数(适用于参数为数组,字符串)。    
    int LoRaNode_Setpoint(uint8_t *AT_Command,uint8_t *AT_Key);

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

13

帖子

61

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
61
 楼主| 发表于 2019-11-20 17:26:09 | 显示全部楼层
本帖最后由 RF001 于 2019-11-21 09:26 编辑

2.3.2、设置参数
M90_M91_Interface提供了俩个设置AT指令的函数,
他们的区别就是一个参数不同,使用时需要注意区分
// 唤醒模块        
LoRaNode_SetWake(Mode_WakeUp);        
HAL_Delay(10);        
// 模块进入命令模式      
LoRaNode_SetMode(Mode_CMD);      
HAL_Delay(10);
关于模块AT指令参考:《LoRaWAN End Node ( LSD4WN-2L系列 )  产品使用说明书》
代码如下(同频CN470):
int LoRaWAN_Node_SetParameter(void)
{
        int result = 0;
        // 唤醒模块
        LoRaNode_SetWake(Mode_WakeUp);
        HAL_Delay(10);
        // 模块进入命令模式
        LoRaNode_SetMode(Mode_CMD);
        HAL_Delay(10);

        // 设置频率
        result += LoRaNode_Setpoint("AT+FREQ=","1,8,475300000");
        // 0->20dBm, 1->17, 2->16dBm, 3->14dBm, 4->12dBm, 5->10dBm, 6->7dBm, 7->5dBm, 8->2dBm
        result += LoRaNode_Setinteger("AT+Power=", 0);
        // 0->SF12, 1->SF11, 2->SF10, 3->SF9, 4->SF8, 5->SF7
        result += LoRaNode_Setinteger("AT+DATARATE=", 3);
        // 0:UNCONFIRM 1:CONFIRM
        result += LoRaNode_Setinteger("AT+CONFIRM=", 1);
        // 设置RX2
        result += LoRaNode_Setpoint("AT+RX2=","0,505300000");
        // 设置CLASS
        result += LoRaNode_Setinteger("AT+CLASS=",Class_A);
        // 设置OTAA
        result += LoRaNode_Setinteger("AT+OTAA=",NET_OTAA);

        // 修改为自身应用的APPEUI
        result += LoRaNode_Setpoint("AT+APPEUI=","XXXXXXXXXXXXXXXX");
        Delay_ms(30);
        // 修改为自身应用的APPKEY
        result += LoRaNode_Setpoint("AT+APPKEY=","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        Delay_ms(30);

        result += LoRaNode_Setpoint("AT+SAVE","\0");
        Delay_ms(200);

        return result;

}

回复

使用道具 举报

8

主题

13

帖子

61

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
61
 楼主| 发表于 2019-11-20 18:46:28 | 显示全部楼层
本帖最后由 RF001 于 2019-11-21 09:28 编辑

2.4、模块入网
配置完参数进行入网
入网过程如下:
代码:
void LoRaWAN_Join(void){
        // 重启模块
        LoRaNode_Reset();
        Delay_ms(500);
        // 进入透传模式
        LoRaNode_SetMode(Mode_Transparent);
        DEBUG_Printf("正在join...");
        // 判断入网标志
        while((LoRaNode_STAT_STATUS() != 1)||(LoRaNode_BUSY_STATUS() != 1))
        {
                        DEBUG_Printf(".");
                        LED3_ON;
                        Delay_ms(500);
                        LED3_OFF;
                        Delay_ms(500);
        }
        LED3_ON;
        DEBUG_Printf("\n");
        DEBUG_Printf("入网成功\n");
}

2.5、数据上行
数据上行流程:

代码:
// confirm:确认帧:1 非确认帧: 0
int LoRaWAN_Node_Send(uint8_t *buf, uint8_t confirm)
{
    // 唤醒模块
    LoRaNode_SetWake(Mode_WakeUp);
    HAL_Delay(20);
    // 进入透传模式
    LoRaNode_SetMode(Mode_Transparent);
    HAL_Delay(20);
   
    uint8_t TimeOut_Sign = 0;
    // 等待模块空闲
    while(LoRaNode_BUSY_STATUS() == GPIO_PIN_RESET)
    {
            if(Time_Out_Break(20000, &TimeOut_Sign) == 1)
            {
                    return -1;
            }
    }
   
    LoRaNode_Send_AT(buf);

    //----等待 BUSY 引脚处于忙状态(低电平),等待时可以加超时判断
    TimeOut_Sign = 0;
    while(LoRaNode_BUSY_STATUS() == GPIO_PIN_SET)
    {
            if(Time_Out_Break(2000, &TimeOut_Sign) == 1)
            {
                    return -2;  // 错误 -2  : 模块没有接收到串口发送的数据,或者模块没有工作
            }
    }

    //----等待数据发送完成  BUSY 引脚回到空闲状态(高电平),等待时可以加超时判断
    TimeOut_Sign = 0;
    while(LoRaNode_BUSY_STATUS() == GPIO_PIN_RESET)
    {
            if(Time_Out_Break(60000, &TimeOut_Sign) == 1)
            {
                    return -3; // 错误 -3  : 模块工作异常
            }
    }
   
    if(confirm == 1)
    {
        if(LoRaNode_STAT_STATUS() == GPIO_PIN_RESET)
        {
            return -4; // 若为确认帧,则表示模块未收到ACK
        }
    }
   
    HAL_Delay(500);
   
    LoRaNode_MODE_LOW();

    return 0; // 本次通信成功
}
2.6、实现温湿度定时上报
定时上报数据流程图
代码:
int User_App(void)
{
        int state = 0;
        uint8_t SS_Data[5]={0};


        state = LoRaWAN_Node_SetParameter();
        if(state < 0)
        {
                DEBUG_Printf("参数设置错误\n");
                return -1;
        }else{
                DEBUG_Printf("参数设置成功\n");
        }
        // 模块入网
        LoRaWAN_Join();
        // 传感器初始化
        HDC1000_Init();

        while(1){

                // 更新温湿度数据
                HDC1000_Update(Env_temp_str);

                SS_Data[0] = 0xFF;
                SS_Data[1] = Env_temp.Tempter/256;
                SS_Data[2] = Env_temp.Tempter%256;
                SS_Data[3] = Env_temp.Humidi;
                SS_Data[4] = 0xFF;

                // 上行数据
                state = LoRaWAN_Node_Send(SS_Data);
                if(state == 0){
                        DEBUG_Printf("数据上行成功, 上行数据:");
                        for(int i = 0; i<5; i++){
                                DEBUG_Printf("%02x ", SS_Data);
                        }
                        DEBUG_Printf("\n");
                }else{
                        DEBUG_Printf("数据上行错误,错误代码:%d\n", state);
                }

                HAL_Delay(5000);
        }

        return 0;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

13

帖子

61

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
61
 楼主| 发表于 2019-11-20 18:48:17 | 显示全部楼层
本帖最后由 RF001 于 2019-11-21 10:11 编辑

3、实现现象
3.1、节点端
打开串口调试助手,显示:

3.2、服务器端
登录服务器,点击节点设备详情,进入查看数据表格。
点击上行数据的详情
查看payloadData是否与节点端一致

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表