一、七要素气象站介绍
硬件安装,通信协议详情见七要素气象站CR-WS通信协议及数据说明
通信协议
地址 操作 说明 备注
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数据长度,01 68 01 68数据内容,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;
三、结果
初始值:
第一次测试:
第二次:轻拨风速转片,转动风向标
第三次:使劲的转,让风速突破历史记录
第四次:停止转动,记录保持
第五次:断电,重新上电,各项数据保持
下载地址:https://download.csdn.net/download/qq_41573860/12776557
因为涉及到很多其他方面的功能,所以我上传的项目中已经能删的文件已经删掉,只留了气象传感器和串口相关的函数,注释掉的是气象站用不到的,测试了一下不影响气象站的使用和数据处理。因为要检测变化值,连续检测,然后将前后两次的各项传感器数值进行比较,若差值太大就要停止,所以我准备用结构体存储,把每一次测的数据存于队列中,当连续三次没有出问题的话就出队。我没有把程序往进放,这个仅是数据收发和处理的, 有问题可以私我,大家一起讨论学习。等再完善一些后,我上传到github上再分享链接,就不用积分了。
来源:oschina
链接:https://my.oschina.net/u/4288530/blog/4539779