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

2023-05-16

一、七要素气象站介绍

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;

 

三、结果

初始值:

 

第一次测试:

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

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

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

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 卷积神经网络CNN学习记录-实战篇(Minst手写数据集识别)

    from tensorflow examples tutorials mnist import input data import tensorflow as tf minst 61 input data read data sets 34
  • 卷积神经网络CNN学习记录-CNN实现语义分割(Encoder-Decoder结构)

    1 Encoder from keras layers import def Conv Encoder input height 61 416 input width 61 416 Img In 61 Input shape 61 inpu
  • MobileNet学习记录-基于MobileNetV1的自动驾驶图像语义分割实现

    1 MobileNet基础及架构 Mobielnet学习记录 概念篇 2 实现思路 为了便于实现 xff0c 还是采用了Encoder Decoder结构 xff0c 利用MobileNet来进行特征提取 xff0c 相较于CNN的卷积操作
  • STM32F407-SPI通信接口

    1 SPI概念 SPI xff0c 是一种高速的 xff0c 全双工 xff0c 同步的通信总线 xff0c 并且在芯片的管脚上只占用四根线 xff0c 节约了芯片的管脚 xff0c 同时为PCB的布局上节省空间 xff0c 提供方便 xf
  • Python学习-变量类型

    1 单变量赋值 等号 xff08 61 xff09 用来赋值 xff0c 左边是一个变量名 xff0c 右边是存储在变量中的值 xff0c 定义变量不需要声明类型 xff0c 可以直接赋值使用 例 xff1a temp1 61 100 赋值
  • Python学习-条件循环

    1 while循环 while循环的语句格式为 xff1a while condition statements 当判断条件为真时 xff0c 就会执行循环中的语句 xff0c 当条件为假时退出循环 xff0c 若条件为一个永真式 xff0
  • Python学习-函数模块

    1 函数定义 定义规则 xff1a 函数代码块以 def 关键词开头 xff0c 后接函数标识符名称和圆括号 任何传入参数和自变量必须放在圆括号中间 圆括号之间可以用于定义参数 函数的第一行语句可以选择性地使用文档字符串 用于存放函数说明
  • STM32F407控制42,57两个步进电机用传感器限制位置

    功夫不负有心人 xff0c 终于把这个做出来了 xff0c 本项目为控制42 57两个步进电机 xff0c 带动齿轮 xff0c 进行上下左右转动 xff0c 四个限位金属传感器限制位置 传感器配置过程 步进电机配置过程 记录一下一个问题
  • Python学习-多线程

    1 线程 首先区分线程和进程两个概念 xff1a 进程是资源 xff08 CPU 内存等 xff09 分配的基本单位 xff0c 它是程序执行时的一个实例 程序运行时系统就会创建一个进程 xff0c 并为它分配资源 xff0c 然后把该进程
  • Spring MVC controller出错后进入了不该进入的拦截器

    拦截器对一些接口进行了排除 xff0c 使这些接口不用进入拦截器的验证 xff0c 但是出现了一个现象 xff0c 例如 api v1 auth register 这个接口 xff0c 如果因为某些原因 xff0c 出现异常了 xff0c
  • Git学习-本地仓库与版本管理

    一 创建仓库 1 创建空仓库 在合适的位置创建一个新目录 xff0c Git Bash支持的是linux命令操作 第一种方法 xff1a mkdir mygit cd mygit pwd 用mkdir创建目录 xff0c pwd查看当前路径
  • STM32F407用wk2124芯片编写SPI转四路串口驱动

    目录 引言 一 SPI通信配置 1 GPIO初始化设置 2 SPI参数配置 3 读写函数 4 速度设置 二 WK2124逻辑代码编写 1 片选初始化 2 写寄存器函数 3 读寄存器函数 4 写FIFO函数 5 读FIFO函数 6 WK212
  • Git学习-远程仓库

    创建远程仓库 本地现在有一个仓库git xff0c 同时可以在github上创建一个同名的git仓库 xff0c 可以供自己和他人协同操作 1 在github电机new repository创建一个新仓库 xff0c 名称保持与本地一致 R
  • Python学习-SQLite

    SQLite是一种嵌入式数据库 xff0c 它的数据库就是一个文件 由于SQLite本身是C写的 xff0c 而且体积很小 xff0c 所以 xff0c 经常被集成到各种应用程序中 xff0c 甚至在iOS和Android的App中都可以集
  • Python学习-TCP网络编程

    1 客户端 Socket是网络编程的一个抽象概念 通常我们用一个Socket表示 打开了一个网络链接 xff0c 而打开一个Socket需要知道目标计算机的IP地址和端口号 xff0c 再指定协议类型即可 大多数连接都是可靠的TCP连接 创
  • Git学习-分支

    在Git里 xff0c 主分支为master分支 HEAD也不是指向提交 xff0c 而是指向master xff0c master才是指向提交的 xff0c 所以 xff0c HEAD指向的就是当前分支 一开始的时候 xff0c mast
  • Matplotlib绘制各类图像(折线图,曲线图...)-画图的神

    Matplotlib简介 Matplotlib是一个Python工具箱 xff0c 用于科学计算的数据可视化 借助它 xff0c Python可以绘制如Matlab和Octave多种多样的数据图形 最初是模仿了Matlab图形命令 但是与M
  • STM32F407多路串口通信进行数据收发

    一直被说是就不能把几个串口放在一起 xff0c 写个标准例程直接用 xff0c 非要每次用哪个串口才现场改程序 xff0c 被迫把usart1 usart2 usart3进行了资源整合 xff0c 挂在这以备不时之需 功能简述 xff1a
  • 基于Keras实现电影评论文本分类与RNN实现

    notebook使用评论文本将影评分为积极 xff08 positive xff09 或消极 xff08 nagetive xff09 两类 这是一个二元 xff08 binary xff09 或者二分类问题 xff0c 一种重要且应用广泛
  • 基于STM32F407的七要素气象站(气象传感器)CR-WS数据处理实现

    一 七要素气象站介绍 1 七要素气象站介绍 开发板还是采用STM32F407 485连线 xff1a 如果买了变送器就按照下图连线 xff1a 没有买变送器的话 xff0c 直接从气象站上拉线 xff0c 红正黑负 xff0c 黄485 A