一種溫濕度傳感器的記錄數據保存方法
最原始的數據記錄都是依靠人工去完成的,每隔一段時間記錄一次數據。在科學實驗室里,科技人員經常拿著筆和紙記錄當時觀察的數據,這種工作既單調又枯燥,還不能及時。于是人們想到一種辦法,讓機器來定時采集和記錄,然后將采集的數據保存到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得規劃,實現數據記錄就很容易實現了。
審核編輯 黃宇
-
傳感器
+關注
關注
2551文章
51193瀏覽量
754410 -
FlaSh
+關注
關注
10文章
1638瀏覽量
148160 -
EEPROM
+關注
關注
9文章
1022瀏覽量
81670 -
ASCII
+關注
關注
5文章
172瀏覽量
35127
發布評論請先 登錄
相關推薦
評論