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

发布者:灵感火花最新更新时间:2022-06-28 来源: eefocus关键字:STM32F407  气象站  数据处理 手机看文章 扫描二维码
随时随地手机看文章

一、七要素气象站介绍

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;

 

三、结果

初始值:

第一次测试:

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

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

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

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

关键字:STM32F407  气象站  数据处理 引用地址:基于STM32F407的七要素气象站(气象传感器)CR-WS数据处理实现

上一篇:STM32F407-基于AD7606进行多路数据采集
下一篇:STM32F407多路串口通信进行数据收发

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved