查看: 21237|回复: 14

【我与OneNET的故事】+基于物联网技术的古建筑物监测节点

  [复制链接]

4

主题

43

帖子

137

积分

注册会员

Rank: 2

积分
137
发表于 2018-8-23 10:14:37 | 显示全部楼层 |阅读模式
前言:ONENET是一个非常强大的开放性很强的PAAS和SAAS的物联网平台,把物联网的平台和服务巧妙的结合在了一起。首先恭喜ONNET平台的连接量突破了5000万!在大二接触ONENET之后,因为运气的原因已经成功申请到了Mini,麒麟座和NBiot三块开发板。昨天偶然收到了ONENET仙女姐姐的私信,我以为我要被拉黑了。。。结果竟然是鼓励让我继续申请开发板。实话说,是ONENT伴随着我技术上的成长,那帮ONENET宣传更是我义不容辞的了。那接下来我就用我的毕业设计来分享我与ONENET的故事吧。


毕设题目:基于物联网技术的古建筑物监测节点的设计
古代文物建筑是中华文明的珍贵历史财富。近年来,由于土木工程结构的使用期限很长,结构在使用的过程中因出现异常天气,材料老化等情况而导致建筑承载能力降低,如果遇到台风、**等自然灾害,就可能遭受很严重的破坏,导致国家文物古建筑的损失。因此,建立结构健康监测系统,对古建筑安全健康信息进行监测和预警,可以及时发现结构损伤,在防灾减灾领域具有实际意义。

  根据上述背景意义,本文设计基于STM32[font=Calibri Lig**igbee的物联网古建筑物监测节点。该节点STM32单片机为**搭载GPRS模块的感知层阅读器,Zigbee为通信协议的感知节点,加入中移ONENET平台实现对古建筑物信息的实时监测。感知层通过多个Zigbee节点搭载倾斜传感器位移传感器,通过两种传感器分别可测出倾角和位移两个物理量,两者结合分析建筑物的结构变形。并且加入温湿度传感器对古建筑物内的环境进行实时监测,对火灾等事故进行有效地监测和预警。该监测节点可以安装在古建筑物各个分室的墙壁或者梁柱上,一旦发生**等自然灾害建筑体发生抖动,监测节点通过倾斜传感器对建筑抖动的时间和频率进行分析,通过Zigbee无线通信将数据发送到STM32和Zigbee协调器组成的无线网关,网关对数据进行判断并实现分级防护预警,同时可以将古建筑物的温湿度环境参数通过模块上传至ONENET,在ONENET创建古建筑物监测节点应用,监测人员实时对建筑的状态进行实时监测并且在发生自然灾害的第一时间做好预防措施。
  设计背景大概就是这样,因为做毕设的时候手里有申请到的麒麟座,因此就采用了麒麟座作为主控,并且采用搭配的ESP8266和M6312模块对古建筑物的数据进行无线上传,由于会一点Zigbee技术,考虑到古建筑的环境又采用了Zigbee多点组网技术,搭载了温湿度,倾斜和位移传感器将古建筑物各个区域的环境参数进行采集。
具体的实现过程这里就不介绍了,下面分享一下完成的成果:

上位机是采用的ONENET应用开发的:
图片1.png 图片2.png 图片3.png 图片4.png
图片5.png

麒麟座主控和传感器终端展示:
图片6.png 图片7.png

程序设计就分享一下STM32主控的主函数:
/*
************************************************************
*        函数名称:        main
*
*        函数功能:        
*
*        入口参数:        无
*
*        返回参数:        0
*
*        说明:               
************************************************************
*/

//由于Zigbee串口传过来的是16进制,所有需要封装数据流!!!!
int TQ(char n)
{
        if(n>=0x30&&n<=0x39)
        {
        switch(n)
        {

                case 0x30: {return 0;}
                case 0x31: {return 1;}
                case 0x32: {return 2;}
                case 0x33: {return 3;}
                case 0x34: {return 4;}
                case 0x35: {return 5;}
                case 0x36: {return 6;}
                case 0x37: {return 7;}
                case 0x38: {return 8;}
                case 0x39: {return 9;}

        }
        }
        else {return 0;}

}



int main(void)
{
        //定义所需变量

        u16 i;
        u16 len;



//        unsigned short timeCount = 0;        //发送间隔变量

        unsigned char *dataPtr = NULL;

        Hardware_Init();                                //初始化外围硬件

        M6312_Init();                                        //初始化GPRS模块


        while(OneNet_DevLink())                        //接入OneNET
                DelayXms(500);

        Beep_Set(BEEP_ON);                                //鸣叫提示接入成功
        DelayXms(250);
        Beep_Set(BEEP_OFF);

        while(1)
        {

                if(USART_RX_STA&0x8000)
                {                        

                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度

                        for(i=0;i<len;i++)
                        {
                                while(USART_Get**Status(USART1,USART_**_TC)!=SET);//等待发送结束
                        }

                        USART_RX_STA=0;                //状态标记重新赋0

                        if(USART_RX_BUF[0]==0x0b) //缓冲区第一位是0x0b 对应终端节点1
                        {
                                //
                                wen_shi=USART_RX_BUF[1];        // Zigbee串口过来的温度十位
                                wen_ge=USART_RX_BUF[2];   // Zigbee串口过来的温度个位
                                shi_shi=USART_RX_BUF[3];  // Zigbee串口过来的湿度十位
                                shi_ge=USART_RX_BUF[4];   // Zigbee串口过来的湿度个位
                                wen_shi=TQ(wen_shi);      //十六进制转换成相应变量
                                wen_ge=TQ(wen_ge);
                                shi_shi=TQ(shi_shi);
                                shi_ge=TQ(shi_ge);

                                Temp=wen_shi*10+wen_ge; //温度换算
                                Humi=shi_shi*10+shi_ge; //湿度换算


                                //     SUCCESS
                                x_short =USART_RX_BUF[5];
                                y_short =USART_RX_BUF[6];
                                z_short =USART_RX_BUF[7];

                                //负责倾斜数值转换
                                adxl345_x = (float)x_short * 0.001;                        //数值转换
                                adxl345_y= (float)y_short * 0.001;
                                adxl345_z= (float)z_short * 0.001;
                                adxl345_Z_angle = atan(sqrt((x_short * x_short + y_short * y_short)) / z_short) * 57.29583 - 80;        //计算Z轴角度
                                adxl345_Y_angle = atan(sqrt((x_short * x_short + z_short * z_short)) / y_short) * 57.29583 - 45;        //计算Y轴角度
                                adxl345_X_angle = atan(sqrt((z_short * z_short + y_short * y_short)) / x_short) * 57.29583 - 45;        //计算X轴角度

                                //负责位移传感器数值转换
                                Distance = USART_RX_BUF[8];
                                Distance_1 = Distance/1000;     //获取十位
                                Distance_2=Distance%1000/100;  //获取个位
                                Distance_3=Distance%100/10;   //获取十位
                                Distance_4=Distance%10;       //获取个位
                                Distance_all = Distance_1*10 +Distance_2 + Distance_3*0.1+ Distance_4*0.01;

                        }

                        if(USART_RX_BUF[0]==0x0c) //缓冲区第一位是0x0c 对应终端节点2
                        {
                                //
                                wen_shi=USART_RX_BUF[1];        // Zigbee串口过来的温度十位
                                wen_ge=USART_RX_BUF[2];   // Zigbee串口过来的温度个位
                                shi_shi=USART_RX_BUF[3];  // Zigbee串口过来的湿度十位
                                shi_ge=USART_RX_BUF[4];   // Zigbee串口过来的湿度个位
                                wen_shi=TQ(wen_shi);      //十六进制转换成相应变量
                                wen_ge=TQ(wen_ge);
                                shi_shi=TQ(shi_shi);
                                shi_ge=TQ(shi_ge);

                                Temp=wen_shi*10+wen_ge; //温度换算
                                Humi=shi_shi*10+shi_ge; //湿度换算


                                //     SUCCESS
                                x_short =USART_RX_BUF[5];
                                y_short =USART_RX_BUF[6];
                                z_short =USART_RX_BUF[7];

                                //负责倾斜数值转换
                                adxl345_x = (float)x_short * 0.001;                //数值转换
                                adxl345_y= (float)y_short * 0.001;
                                adxl345_z= (float)z_short * 0.001;
                                adxl345_Z_angle = atan(sqrt((x_short * x_short + y_short * y_short)) / z_short) * 57.29583 - 80;        //计算Z轴角度
                                adxl345_Y_angle = atan(sqrt((x_short * x_short + z_short * z_short)) / y_short) * 57.29583 - 45;        //计算Y轴角度
                                adxl345_X_angle = atan(sqrt((z_short * z_short + y_short * y_short)) / x_short) * 57.29583 - 45;        //计算X轴角度

                                //负责位移传感器数值转换
                                Distance = USART_RX_BUF[8];
                                Distance_1 = Distance/1000;     //获取十位
                                Distance_2=Distance%1000/100;  //获取个位
                                Distance_3=Distance%100/10;   //获取十位
                                Distance_4=Distance%10;       //获取个位
                                Distance_all = Distance_1*10 +Distance_2 + Distance_3*0.1+ Distance_4*0.01;

                        }


                        //安全预警判断
                        if(Temp >= 25 && Humi>=70)
                                {
                                                Dangerous = 3;

                                }
                                else if(Temp >= 25&&Humi>=50)
                                {
                                                                Dangerous = 2;
                                }
                                else Dangerous=1;
                                //

                        UsartPrintf(USART_DEBUG, "OneNet_SendData\r\n");
                        OneNet_SendData();                                                                        //发送数据
                        M6312_Clear();

                        //液晶调试模块
                        Lcd1602_DisString(0x80, "%d",Temp);  //液晶显示温湿度
                        Lcd1602_DisString(0xC0, "%d",Humi);
                        DelayMs(1000);                                                                        //延时3s
                        Lcd1602_Clear(0xFF);                                                        //清屏

                        Lcd1602_DisString(0x80, "%0.2f",adxl345_X_angle); //液晶显示X
                        Lcd1602_DisString(0xC0, "%0.2f",adxl345_Y_angle); //液晶显示Y
                        DelayMs(3000);                                                                        //延时3s
                        Lcd1602_Clear(0xFF);                                                        //清屏        

                        Lcd1602_DisString(0x80, "%0.2f",adxl345_Z_angle); //液晶显示Z
                        Lcd1602_DisString(0xC0, "%0.2f",adxl345_Z_angle);
                        DelayMs(3000);                                                                        //延时3s
                        Lcd1602_Clear(0xFF);                                                        //清屏        

                        Lcd1602_DisString(0x80, "%0.2f",Distance_all);    //液晶显示位移
                        Lcd1602_DisString(0xC0, "%0.2f",Distance_all);
                        DelayMs(3000);                                                                        //延时3s
                        Lcd1602_Clear(0xFF);                                                        //清屏        

                        Lcd1602_DisString(0x80, "Dangerous");       //液晶显示安全等级
                        Lcd1602_DisString(0xC0, "%d",Dangerous);
                        DelayMs(3000);                                                                //延时3s
                        Lcd1602_Clear(0xFF);                                                        //清屏        


                }

                        dataPtr = ESP8266_GetIPD(0);
                        if(dataPtr != NULL)
                        OneNet_Re**taPtr);

                        DelayXms(10);
        }

}

上位机的应用链接:
https://open.iot.10086.cn/appview/p/f46c6a3f552302ac686b761faa2e7451

参加活动最后就是自己的肺腑之言:
特别感谢ONENET平台一直对我技术上的帮助,ONENET的开发资料非常全面,在ONENET平台上我的进步突飞猛进,更有非常热闹的技术讨论群让大家在轻松的沟通环境下获得了进步,因为ONENET我交到了很多志同道合的朋友。
对平台的建议:
ONENET麒麟座和Mini的开发教程都已经做得很丰富了,但是觉得最近申领的NBiot开发板的资料还不是很完善,用NBiot接入平台可能会因为各种物联网卡不配对,IMEI号等问题遇到接入困难。希望平台在NB的接入上面把资料整合得更加完美,毕竟以后将会是物联网的时代!
最后再次恭喜ONENET平台接入突破5000万,希望平台和自己能够走得越来越好,越来越远。



4

主题

43

帖子

137

积分

注册会员

Rank: 2

积分
137
 楼主| 发表于 2018-8-23 10:14:38 | 显示全部楼层
自己先站个楼

85

主题

150

帖子

586

积分

内部员工

积分
586

铂金小One

发表于 2018-8-23 10:21:27 | 显示全部楼层
66666

10

主题

91

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2018-8-23 12:15:58 | 显示全部楼层
哇  楼主已经有麒麟座了

4

主题

43

帖子

137

积分

注册会员

Rank: 2

积分
137
 楼主| 发表于 2018-8-23 12:37:04 | 显示全部楼层

哈哈,分享你的故事

4

主题

43

帖子

137

积分

注册会员

Rank: 2

积分
137
 楼主| 发表于 2018-8-23 12:37:48 | 显示全部楼层
本帖最后由 zhouzhoupcber 于 2018-8-23 12:38 编辑
韩磊 发表于 2018-8-23 12:15
哇  楼主已经有麒麟座了

不过现在手上没有啦,需要一个

2

主题

21

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2018-8-24 21:25:39 | 显示全部楼层
页面做的很漂亮 ,
我想要一个NB 可惜申请不到

4

主题

43

帖子

137

积分

注册会员

Rank: 2

积分
137
 楼主| 发表于 2018-8-25 07:45:13 | 显示全部楼层
迷惘186 发表于 2018-8-24 21:25
页面做的很漂亮 ,
我想要一个NB 可惜申请不到

项目写得详细点,界面做得漂亮点,一定可以的!

4

主题

20

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2018-8-26 21:47:44 | 显示全部楼层
为大佬大call

4

主题

43

帖子

137

积分

注册会员

Rank: 2

积分
137
 楼主| 发表于 2018-8-27 07:49:48 | 显示全部楼层

太夸张了,共同学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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