基于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多路串口通信进行数据收发

推荐阅读最新更新时间:2024-11-11 09:43

stm32F407(CORTEX-M4)之RCC配置与TIM2的PWM
之前我已经发过了关于TIM2的PWM,但是没有自己配置RCC时钟,用到的系统时钟、HCLK、PCLK1与PCLK2都是系统启动代码里默认设置的,但是由于应用场合不同,默认的设置可能不满足用户需要,这时便需要手动配置。还是同样的问题,M4的资料太少,我只能参考函数的英文说明(我已经习惯看英文了,呵呵)来自己配置,不敢独享,现分享如下: (我的外部时钟为25MHz) #include static __IO uint32_t TimingDelay; //__IO为volatile的宏定义 int8_t LED_Flag = 1; //LED灯翻转标志位 void RCC_Config(void); voi
[单片机]
STM32F407 外扩SRAM
字节控制功能。支持高/低字节控制。 看看实现 IS62WV51216 的访问,需要对 FSMC进行哪些配置。 这里就做一个概括性的讲解。步骤如下: 1)使能 FSMC 时钟,并配置 FSMC 相关的 IO 及其时钟使能。 要使用 FSMC,当然首先得开启其时钟。然后需要把 FSMC_D0~15,FSMCA0~18 等相关IO 口,全部配置为复用输出,并使能各 IO 组的时钟。 使能 FSMC 时钟的方法: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE); 对于其他 IO 口设置的方法前面讲解很详细,这里不做过多的讲解。 2)设置 FSMC BANK1 区域 3。
[单片机]
<font color='red'>STM32F407</font> 外扩SRAM
STM32F407入门开发: NEC红外线协议解码
一、NEC红外线协议与接收头介绍 红外线遥控是家电领域里很常见的一种遥控方式,常见的电视机、空调、投影机等设备基本都支持红外线遥控;这也主要是红外线遥控成本比较低,现在很多电视机也支持蓝牙遥控器了,穿透性、速度、比红外线遥控要好很多。 红外线遥控的原理: 就是通过红外光的闪烁传递数据,需要一对红外线发射管、一个红外线接收头。 这个红外线接收头对红外光很敏感,接收到红外光就输出低电平,相反就是高电平。所以可以通过这个原理就可以通过与遥控器端、接收端约定协议就能传递数据了。 二、解码实现代码 红外线协议有很多,下面就以NEC协议为例: NEC协议分为: 引导码、用户码、用户反码、按键码、按键反码组成。 引导码是9ms低电平+4
[单片机]
CAST和Achronix使用无损压缩IP支持从数据中心到边缘的数据处理
美国加利福尼亚州圣克拉拉市,2018年5月—基于现场可编程门阵列(FPGA)的硬件加速器器件及嵌入式FPGA(eFPGA)领域内领导性企业Achronix半导体公司(Achronix Semiconductor Corporation)日前宣布:与专注于为电子系统设计人员提供半导体IP的半导体知识产权公司CAST Incorporated达成合作;CAST的高性能无损压缩IP已经被植入,以支持Achronix 的FPGA产品组合,用来完成数据中心和移动边缘间数据传输的高效处理。 CAST为Deflate、GZIP和ZLIB等无损压缩工具提供标准的硬件实现,它们与用于压缩或解压的软件实现方式兼容。ZipAccel内核提供的硬件实
[半导体设计/制造]
【STM32】stm32f407 + DS18B20 碰出不一样的火花
前言 之前在这篇文章:【STM32学习记录4】1.44寸TFT液晶屏显示字符、汉字和图片 卖了一个关子: 开发板:stm32f407VET6 开发环境:keil5 MDK 一、硬件基础——DS18B20 1.DS18B20简介 2.硬件连接 根据手册,DS18B20的硬件接法很简单,分为以下两种: 需要注意的是不管哪一种接法DQ上一定要接个上拉电阻 1.【寄生接法】 DS18B20_GND → to→ STM32F407_GND DS18B20_VCC → to→ STM32F407_GND DS18B20_DQ → to→ STM32F407_P** DQ引脚可接任意IO口 关于寄生方式,
[单片机]
【STM32】<font color='red'>stm32f407</font> + DS18B20 碰出不一样的火花
stm32f407以太网及USB OTG快速开发
引言 想要快速完成网络协议栈和USB OTG功能,使用ST自家的工具STM32CubMx再好不过的了。如果你还不会使用,别着急下面我会一步一步的用图片告诉你如何做。 软件平台:windows、STM32CubMx、keil v5 硬件平台:原子的stm32f407ZGT6开发板, STM32CubMx配置 1、以太网管脚的映射配置 第一:阅读原理图,使用STM32CubMx完成配置,原理图这里不说明。直接到STM32CubMx配置。 (1)、打开STM32CubMx软件,选择New Project,在弹出的菜单选择,选择对应的芯片,点击OK即可。如下图: (2) 设置clock,板子使用的是8MHz的晶振,软件对应
[单片机]
<font color='red'>stm32f407</font>以太网及USB OTG快速开发
STM32F407 基本定时器使用
介绍STM32F407基本定时器的配置方法,分别介绍轮询方式、中断方式使用定时器完成定时。 【1】定时器介绍 定时器相关的章节在STM32F4xx参考手册第14、15、16、17章节。 【2】基本定时器配置示例 增加一个Timer.c文件,代码如下 #include timer.h /* 函数功能:基本定时器7初始化配置 函数形参: psc :预分频系数 arr :重载值 说明:定时器的视频频率为84MHZ ,是APB1时钟频率的2倍 */ void Time7_InitConfig(u16 psc,u16 arr) { /*1. 开时钟*/ RCC- APB1ENR|=1 5;
[单片机]
<font color='red'>STM32F407</font> 基本定时器使用
STM32F407 GPIO口输出配置配置步骤
STM32F407ZGT6 是意法半导体(STMicroelectronics)公司推出的一款高性能ARM Cortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一员,具备强大的处理能力和丰富的外设功能,适用于各种应用领域。 【1】F407建工程所需依赖文件 【2】 新建工程 **说明:STM32F4 的主频最高是 168Mhz,所以我们一般设置 PLLCLK 为 168Mhz(M=8,N=336,P=2),通过 SW 选择 SYSCLK=PLLCLK即可得到 168Mhz 的系统运行频率。** 【3】分析LED硬件原理图 【4】编写L
[单片机]
<font color='red'>STM32F407</font> GPIO口输出配置配置步骤
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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