基于OneNET View 3.0 的可视化数据监测系统

基于OneNET View 3.0 的可视化数据监测系统——制作说明

功能说明

本系统通过维特的九轴姿态传感器WT901C和GPS卫星定位模块获取被测物体的经纬度、高度、速度、加速度、磁场等数据,通过串口2将所得数据传输给STM32单片机进行数据整合,再利用STM32单片机的串口1将所整合到的数据通过维特智能4G无线透传模块Cat.1(模块核心是合宙的Air724UG-4G)将数据传输到onenet云平台,并利用平台所提供的基础服务MQTT物联网套件对数据源进行管理。最后利用OneNET View 3.0平台所提供的可视化界面对所有数据进行数据可视化。

WT901C姿态传感
STM32
4G通讯模块Cat.1
onenet
GPS卫星定位

在这里插入图片描述

可监测数据

时间、经纬度、高度、航向、速度、加速度、位移、温度、磁场

成果展示

可视化成果
在这里插入图片描述

注:由于采用免费可视化,所以只能做3个数据源的界面
资料包连接

实物图

在这里插入图片描述

制作步骤

1.传感器部分

将WT901C模块通过USB-TTL线连接口电脑,打开上位机软件(传感器资料包里)
在这里插入图片描述正确连接软件串口,波特率9600或115200都可以
在这里插入图片描述点击配置进入该页面,并进行如下设置
在这里插入图片描述回传速率根据自己需求设定

频率 对应时间
10HZ 0.1s
5HZ 0.2s
2HZ 0.5s
1HZ 1s

注:该设计使用免费版,只能有3个数据源,所以只勾选欧拉角。设置完成后注意锁定,保存设置。

2. STM32部分

将程序包里的程序正确下载到单片机中

串口读写数据

//CopeSerialData为串口2中断调用函数,串口每收到一个数据,调用一次这个函数。
void CopeSerial2Data(unsigned char ucData)
{
    
    
	static unsigned char ucRxBuffer[250];
	static unsigned char ucRxCnt = 0;	
	
	
	
	LED_REVERSE();					//接收到数据,LED灯闪烁一下
	ucRxBuffer[ucRxCnt++]=ucData;	//将收到的数据存入缓冲区中
	if (ucRxBuffer[0]!=0x55) //数据头不对,则重新开始寻找0x55数据头
	{
    
    
		ucRxCnt=0;
		return;
	}
	if (ucRxCnt<11) {
    
    return;}//数据不满11个,则返回
	else
	{
    
    
		switch(ucRxBuffer[1])//判断数据是哪种数据,然后将其拷贝到对应的结构体中,有些数据包需要通过上位机打开对应的输出后,才能接收到这个数据包的数据
		{
    
    
			case 0x50:	memcpy(&stcTime,&ucRxBuffer[2],8);break;//memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据结构体里面,从而实现数据的解析。
			case 0x51:	memcpy(&stcAcc,&ucRxBuffer[2],8);break;
			case 0x52:	memcpy(&stcGyro,&ucRxBuffer[2],8);break;
			case 0x53:	memcpy(&stcAngle,&ucRxBuffer[2],8);break;
			case 0x54:	memcpy(&stcMag,&ucRxBuffer[2],8);break;
			case 0x55:	memcpy(&stcDStatus,&ucRxBuffer[2],8);break;
			case 0x56:	memcpy(&stcPress,&ucRxBuffer[2],8);break;
			case 0x57:	memcpy(&stcLonLat,&ucRxBuffer[2],8);break;
			case 0x58:	memcpy(&stcGPSV,&ucRxBuffer[2],8);break;
			case 0x59:	memcpy(&stcQ,&ucRxBuffer[2],8);break;
		}
		ucRxCnt=0;//清空缓存区
	}
}

void CopeSerial1Data(unsigned char ucData)
{
    
    	
	UART2_Put_Char(ucData);//转发串口1收到的数据给串口2(JY模块)
}

数据发送代码

void TIM3_IRQHandler(void)   //TIM3中断
{
    
    
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
	{
    
    
		num++;
		if(num>=120)
		{
    
    
			num=0;
			printf("{\r\n\"id\":123,\r\n\"dp\":{\r\n");
			printf("\"x_angle\":[{\r\n\"v\":%.3f,\r\n}],\r\n",(float)stcAngle.Angle[0]/32768*180);
			printf("\"y_angle\":[{\r\n\"v\":%.3f,\r\n}],\r\n",(float)stcAngle.Angle[1]/32768*180);
			printf("\"z_angle\":[{\r\n\"v\":%.3f,\r\n}],\r\n",(float)stcAngle.Angle[2]/32768*180);
			printf("}\r\n}\r\n");
		}
			
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
		}
}

注意UART1的波特率必须设置为115200

int main(void)
{
    
      		
	unsigned char i = 0;
	SysTick_init(72,10);//设置时钟频率
//	Initial_UART1(9600);//接PC的串口
	Initial_UART1(115200);//接PC的串口
	Initial_UART2(9600);//接JY-901模块的串口	
	
	LED_ON();
	delay_ms(4999);delay_ms(1000);//等等JY-91初始化完成

	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
	
	
	//功能现象,20秒钟左右会进行一次加速度校准,加速度校准之后,XY角度会缓慢回到0度状态
	while(1)
	{
    
    			
//		delay_ms(1000);
//		i++;
//		if(i>20)
//		{
    
    
//			i = 0;
//			printf("正在进行加速度校准\r\n");
//			sendcmd(ACCCALSW);delay_ms(100);//等待模块内部自动校准好,模块内部会自动计算需要一定的时间
//			sendcmd(SAVACALSW);delay_ms(100);//保存当前配置
//			printf("加速度校准完成\r\n");
//		}
//		//输出时间
//		printf("Time:20%d-%d-%d %d:%d:%.3f\r\n",stcTime.ucYear,stcTime.ucMonth,stcTime.ucDay,stcTime.ucHour,stcTime.ucMinute,(float)stcTime.ucSecond+(float)stcTime.usMiliSecond/1000);
//			delay_ms(10);
//		//输出加速度
//		//串口接受到的数据已经拷贝到对应的结构体的变量中了,根据说明书的协议,以加速度为例 stcAcc.a[0]/32768*16就是X轴的加速度,
//		printf("Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
//			delay_ms(10);
//		//输出角速度
//		printf("Gyro:%.3f %.3f %.3f\r\n",(float)stcGyro.w[0]/32768*2000,(float)stcGyro.w[1]/32768*2000,(float)stcGyro.w[2]/32768*2000);
//			delay_ms(10);
		//输出角度
		printf("Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);
			delay_ms(10);
//		//输出磁场
//		printf("Mag:%d %d %d\r\n",stcMag.h[0],stcMag.h[1],stcMag.h[2]);	
//			delay_ms(10);
//		//输出气压、高度
//		printf("Pressure:%ld Height%.2f\r\n",stcPress.lPressure,(float)stcPress.lAltitude/100);
//			delay_ms(10);
//		//输出端口状态
//		printf("DStatus:%d %d %d %d\r\n",stcDStatus.sDStatus[0],stcDStatus.sDStatus[1],stcDStatus.sDStatus[2],stcDStatus.sDStatus[3]);
//			delay_ms(10);
//		//输出经纬度
//		printf("Longitude:%ldDeg%.5fm Lattitude:%ldDeg%.5fm\r\n",stcLonLat.lLon/10000000,(double)(stcLonLat.lLon % 10000000)/1e5,stcLonLat.lLat/10000000,(double)(stcLonLat.lLat % 10000000)/1e5);
//			delay_ms(10);
//		//输出地速
//		printf("GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n",(float)stcGPSV.sGPSHeight/10,(float)stcGPSV.sGPSYaw/10,(float)stcGPSV.lGPSVelocity/1000);
//			delay_ms(10);
//		//输出四元素
//		printf("Four elements:%.5f %.5f %.5f %.5f\r\n\r\n",(float)stcQ.q[0]/32768,(float)stcQ.q[1]/32768,(float)stcQ.q[2]/32768,(float)stcQ.q[3]/32768);
//		    delay_ms(10);//等待传输完成
	}//主循环
}

3. WT4G-M模块部分

打开 s Luatools 工具,按照“ZL-LTE系列(4G)软件安装及固件下载详解V1.1”将“Air724固件”正确安装驱动并烧录固件。
在这里插入图片描述设置模块的网络通道参数。

在这里插入图片描述

4. 云平台部分

按照“ZL-LTE系列(4G)OneNET平台连接教程详解V1.1”文件正确连接平台,并成功在线接受数据流。
在这里插入图片描述在这里插入图片描述

5. onenet view可视化部分

根据onenet view开发文档,建立模板和可视化。
在这里插入图片描述

Guess you like

Origin blog.csdn.net/qq_43667552/article/details/113407161