基于STM32F407的七要素气象站(气象传感器)CR-WS数据处理实现

一、七要素气象站介绍

1.七要素气象站介绍

 

 

开发板还是采用STM32F407 

 485连线:

如果买了变送器就按照下图连线:

没有买变送器的话,直接从气象站上拉线,红正黑负,黄485-A,绿485-B。 如果开发板只有232接口,可以买个485转232转换头。还有一个点,它这个供电需要外接9V以上的直流电,光是两个电池是不行的,会出现数据响应错误。

2.通信协议

通信协议

地址       操作                   说明                          备注 
0x0000 保留   
0x0001 只读 空气温度,16进制,分辨率0.1℃ +40的数据 
0x0002 只读 空气湿度,16进制,分辨率0.1%RH   
0x0003 只读 风向,16进制,分辨率0.1° 设备正北指向为0° 
0x0004 只读 瞬时风速,16进制,分辨率0.1m/s 16s的平均风速 
0x0005 只读 最大风速,16进制,分辨率0.1m/s 历史最大值,掉电清除 
0x0006 只读 瞬时雨量(降雨强度),16进制,分辨率0.1mm/min 默认1min,其他定制。 
0x0007 只读 累计雨量,16进制,分辨率0.1mm 集满49999后,清0 
0x0008 只读 紫外线高位,16进制,分辨率1uw/cm2   

0x0009 只读 紫外线低位,16进制,分辨率1uw/cm2   
0x000A 只读 光照度高位,16进制,分辨率0.1lux   
0x000B 只读 光照度低位,16进制,分辨率0.1lux   
0x000C 只读 大气压高位,16进制,分辨率1帕   
0x000D 只读 大气压低位,16进制,分辨率1帕   

操作指令:

①读从机地址:

00 03 00 00 00 01 85 DB

00默认,03功能码,00 00为起始地址,00 01为寄存器个数,85 DB为CRC16校验码,用于485校验。

响应:

02 03 02 00 02 7D 85

02从机地址,03功能码,02数据长度,00 02数据内容,7D 85为CRC16校验码,用于485校验。

 

②读单个寄存器

01 03 00 01 00 01 D5 CA

01默认,03功能码,00 00为起始地址,00 01为寄存器个数,D5 CA为CRC16校验码,用于485校验。

响应:

01 03 02 01 68 B8 3A

01默认,03功能码,02数据长度,01 68数据内容,B8 3A为CRC16校验码,用于485校验。

 

③读温湿度

01 03 00 01 00 02 95 CB

01默认,03功能码,00 01为起始地址,00 02为寄存器个数,95 CB为CRC16校验码,用于485校验。

响应:

01 03 04 02 B4 02 1D 7A 6D

01默认,03功能码,04数据长度,02 B4 02 1D数据内容,7A 6D为CRC16校验码,用于485校验。

计算:

0x0001为温度寄存器,数据内容为02 B4,转换为十进制为692

       温度=692/10-40=29.2℃

0x0002为湿度寄存器,数据内容为021D,转换为十进制为209

湿度=209/10=20.9RH%

 

实际环境用串口助手测试

查询所有寄存器的值:

指令:
01 03 00 01 00 0D D5 CF

对数据进行分帧处理,获取其中的一组返回数据。

 

响应示例:
01 03 1A 02 88 02 E2 03 9B 00 00 00 01 00 00 00 00 00 00 00 02 00 00 00 00 00 01 73 4C BA 40


01 03为默认功能码

1A表示有26个数据

02 88对应0x0001地址,即温度寄存器,转换成十进制为648,温度=648/10-40=24.8℃。

02 E2对应0x0002地址,即湿度寄存器,转换成十进制为738,湿度=738/10=73.8RH%

03 9B对应0x0003地址,即风向寄存器,转换成十进制为923,风向=923/10=92.3°

00 00对应0x0004地址,即瞬时风速寄存器,瞬时风速为0

00 01对应0x0005地址,即最大风速寄存器,最大风速为0.1m/s

00 00对应0x0006地址,即瞬时雨量寄存器,瞬时雨量为0

00 00对应0x0007地址,即累计雨量寄存器,累计雨量为0.1

00 00 00 02对应0x0008,0x0009地址,分别为紫外线高低位,大小为2uw/cm2  

00 00 00 00对应0x000A,0X000B地址,分别为光照度高低位,大小为0帕

00 01 73 4C对应0x000C,0x000D地址,分别为大气压高低位,转换成十进制95052,大气压=95052帕=95.052kpa,标准为101.325kpa

读取某个数据,如风速、风向、光照根据寄存器地址去读即可。

二、功能讲解

首先整体说一下我写的思路,通过串口三去发送指令并接收来自气象站的数据,再用串口一进行打印检查,对于多串口共用有问题的可以看看我的STM32F407多路串口通信进行数据收发,然后后期会用串口二将数据发送到全站仪去检测,目前只是个demo,但是已经完成了对数据的处理和收发功能。

举个栗子:读一下温度传感器

 double getTemperature()
	{
		
		u8 bitOne,bitTwo,bitThree,bitFour;
		double res;
		bitOne=USART3_RX_BUF[3]>>4;
		bitTwo=USART3_RX_BUF[3]&0x0F;
		bitThree=USART3_RX_BUF[4]>>4;
		bitFour=USART3_RX_BUF[4]&0x0F;
		res=(bitOne*pow(16,3)+bitTwo*pow(16,2)+bitThree*16+bitFour)/10-40;
		w.Temperature=res;
		return w.Temperature;
	}

前三位为默认指令码,因此数据从第四位开始,因为要求的数据格式为10进制,并且要进行计算,所以就进行了一下转换,分离高4位和低4位,然后乘以权重,再根据数据通信协议进行数据计算,最后存在结构体的温度变量中。

再举个栗子,大气压传感器

double getAtmospheric_Pressure()
{

		
		u8 bitOne,bitTwo,bitThree,bitFour,bitFive,bitSix,bitSeven,bitEight;
		double res;
		bitOne=USART3_RX_BUF[25]>>4;
		bitTwo=USART3_RX_BUF[25]&0x0F;
		bitThree=USART3_RX_BUF[26]>>4;
		bitFour=USART3_RX_BUF[26]&0x0F;
		bitFive=USART3_RX_BUF[27]>>4;
		bitSix=USART3_RX_BUF[27]&0x0F;
		bitSeven=USART3_RX_BUF[28]>>4;
		bitEight=USART3_RX_BUF[28]&0x0F;
		res=(bitOne*pow(16,7)+bitTwo*pow(16,6)+bitThree*pow(16,5)+bitFour*pow(16,4)+bitFive*pow(16,3)+bitSix*pow(16,2)+bitSeven*pow(16,1)+bitEight)/10;
		w.Atmospheric_Pressure=res;
		return w.Atmospheric_Pressure;

}

和温度传感器一样,但是因为通信协议有高位和低位四个数,所以要多定义几个变量。

指令定义:

u8 weatherIndex[8] = {0x01,0x03,0x00,0x01,0x00,0x0D,0xD5,0xCF}; 

发送函数:

	 void sendIndex(void)
	{

		u8 t;
		
		//向气象传感器发送指令,返回的数据暂存于USART3_RX_BUF
		for(t=0;t<8;t++)
	{
		USART_SendData(USART3, weatherIndex[t]);         
		while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
	}
	
	delay_ms(3000);
}

ps:发送间隔不能太短,我这里设置的就有点短了,气象仪有点反应不过来,延时要给大一点。

 

结构体定义:

typedef struct weatherData{
		double Temperature;//温度
		double Humidity;//湿度
		double Instantaneous_Wind_Speed;//瞬时风速
		double Max_Wind_Speed;//最大风速
		double Wind_Direction;//风向
		double Ultraviolet_Rays;//紫外线
		double Instantaneous_Rainfall;//瞬时雨量
		double Accumulated_Rainfall;//累计雨量
		double Illuminance;//光照度
		double Atmospheric_Pressure;//大气压
	}weather;

 

三、结果

初始值:

 

第一次测试:

第二次:轻拨风速转片,转动风向标

 第三次:使劲的转,让风速突破历史记录

 第四次:停止转动,记录保持

第五次:断电,重新上电,各项数据保持

 

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值