一种温湿度传感器的记录数据保存方法

电子说

1.3w人已加入

描述

一种温湿度传感器的记录数据保存方法

最原始的数据记录都是依靠人工去完成的,每隔一段时间记录一次数据。在科学实验室里,科技人员经常拿着笔和纸记录当时观察的数据,这种工作既单调又枯燥,还不能及时。于是人们想到一种办法,让机器来定时采集和记录,然后将采集的数据保存到FLASH中。当我们需要的时候,再从FLASH中读出来,供我们使用。可见,机器记录数据既保证了实时性和效率,还节省了人工成本。

我们先回顾一下人工记录的方法:先在一张空白的纸上制作一个表格,里面有:序号,内容,时间,签字人姓名,核验时间。同理、机器记录也需要首先要有一个空白的数据记录区,而且掉电再上电还要保证数据继续存在。于是我们会很快想到FLASH存储器,FLASH通常有两种:I2C通讯的EEPROM和SPI通讯的FLASH。EEPROM最大的分区为页,限制了EEPROM的容量扩展;其次跨页写入时,EEPROM需要发送重启条件;再次I2C抗干扰能力差。SPI通讯的FLASH支持扇区读、写和擦除,同时支持块擦除,容量大,性价比高。因此,SPI通讯的FLASH是我们的首选。

W25Q128容量为16M字节,共计4096个扇区,每个扇区为4*1024个字节,地址为24位。扇区擦除后,里面的数据全部是0xFF。

1、保存对象

温度1(float型),温度2(float型),湿度1(u8型),湿度2(u8型),状态数据(u8型)

1、数据保存周期

规定每5分钟保存一次。这样,每天保存的信息数量为:24*60/5=288条。

2、消息格式

1)、时间:

用秒表示,32位数值,使用16进制的ASCii码表示,需要占用8个字节。

若用0表示2000年1月1日00:00:00,则:

全为平年,最大年数为0x100000000/3600/24/365=4294967296=136.19年

全为闰年,最大年数为0x100000000/3600/24/366=4294967296=135.82年

从2023年算起,还可以支持112年,这个时间数值够用了。

2)、u32和单精度浮点数:

单精度浮点数为32位数值,使用16进制的ASCii码表示,需要占用8个字节。

3)、整型数:

u16型数值,使用16进制的ASCii码表示,需要占用4个字节,用D表示。

u8型数值,使用16进制的ASCii码表示,需要占用2个字节,用d表示。

4)、校验码:

校验码为u8型数值,使用16进制的ASCii码表示,需要占用2个字节。

5)、起始符号和结束符号:

起始符号’(’,使用ASCii码表示,需要占用1个字节。

结束符号’)’,使用ASCii码表示,需要占用1个字节。

6)、上传状态:

0xFF表示没有上传,需要执行断网续传;字符’Y’ 表示已上传,无需续传。需要占用1个字节。

7)、消息格式:(上传状态/时间/f1/f2/d1/d2/d3/校验码)

每条信息为3*8+3*2+5=35个字节。

1个时间数据,3个浮点数,3个u8型数值。

举例:

(Y000000003F0000003F0000004B4B00XX)

Y表示该信息已经上传

时间:00000000通过换算得到时间为2000-01-01 00:00:00

温度1为浮点字符串数值3F000000,合为十进制数为0.5度

温度2为浮点字符串数值3F000000,合为十进制数为0.5度

湿度1为u8型字符串数值4B,合为十进制数为75

湿度2为u8型字符串数值4B,合为十进制数为75

温度1,温度2,湿度1和湿度2状态值为u8型字符串数值00,合为十进制数为0。

3、扇区规划

1)、每个扇区的前两个字节,用来记录扇区的状态:

分别用SectorXByte[0]和SectorXByte[1]表示,其中-1

SectorXByte[0]=0xFF且SectorXByte[1]=0xFF表示该扇区为空白扇区;

SectorXByte[0]=’1’且SectorXByte[1]=0xFF表示该扇区可以继续保存信息;

SectorXByte[0]=’1’且SectorXByte[1]=’1’表示该扇区满,不能再保存信息;

SectorXByte[0]=0xFF且SectorXByte[1]=’1’表示该扇区损坏了,不能保存信息;

这么规定的目的,可以告诉我们当前写到哪个扇区了,同时,可以避免将数据写入坏扇区。

举例:

Sector0Byte[0]=0xFF且Sector0Byte[1]=0xFF表示扇区0为空白扇区;

Sector0Byte[0]=’1’且Sector0Byte[1]=0xFF表示扇区0可以继续保存信息;

Sector0Byte[0]=’1’且Sector0Byte[1]=’1’表示扇区0满,不能再保存信息;

Sector0Byte[0]=0xFF且Sector0Byte[1]=’1’表示扇区0损坏了,不能保存信息;

2)、每个扇区的信息数量

(4096-2)/35=116.9条,按照116条/扇区计算,损失34个字节。

3)、规定信息写入,不得跨越扇区。因此最后34个字节为0xFF,不使用。这么设计的目的,就是为了保证扇区前两个字节用作记录扇区的状态,不被改变,同时,也是为了扇区具有可读性。

4、W25Q64JV(8M容量的FLASH)

1)、最大信息数量

116*2048=237568条数据

2)、最多天数

237568/288=824天,因此8M的FLASH可以保存2.2年的数据。

5、W25Q128JV(16M容量的FLASH)

1)、最大信息数量

116*4096=475136条数据

2)、最多天数

475136/288=1649天,因此16M的FLASH可以保存4.5年的数据。

6、总结

通过上述对FLASH得规划,实现数据记录就很容易实现了。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分