一种温湿度传感器的记录数据保存方法
最原始的数据记录都是依靠人工去完成的,每隔一段时间记录一次数据。在科学实验室里,科技人员经常拿着笔和纸记录当时观察的数据,这种工作既单调又枯燥,还不能及时。于是人们想到一种办法,让机器来定时采集和记录,然后将采集的数据保存到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得规划,实现数据记录就很容易实现了。
审核编辑 黄宇
-
传感器
+关注
关注
2550文章
51035浏览量
753048 -
FlaSh
+关注
关注
10文章
1633浏览量
147935 -
EEPROM
+关注
关注
9文章
1019浏览量
81557 -
ASCII
+关注
关注
5文章
172浏览量
35089
发布评论请先 登录
相关推荐
评论