您知道Arduino在關(guān)閉時可以存儲數(shù)據(jù)嗎?草圖不存儲在閃存中。我說的是EEPROM中的可變數(shù)據(jù)。加入我的行列,向我展示如何讀寫它,以及它可以為您的項目做什么。
如果您不熟悉Arduino,請確保閱讀我們的初學(xué)者指南。
什么是EEPROM?
EEPROM代表電可擦可編程只讀存儲器。這是一種非易失性存儲器。如果您不了解任何含義,請不要擔(dān)心。即使沒有電源,它也可以簡單地存儲數(shù)據(jù)(與RAM不同,RAM需要電力才能保留任何數(shù)據(jù))。
EEPROM內(nèi)置于眾多處理器中,例如Matrix Creator Pi HAT中使用的現(xiàn)場可編程門陣列(FPGA)。所有的Arduino都有EEPROM,但容量因型號而異。請務(wù)必查看我們的購買指南以獲取有關(guān)每塊板的更多詳細信息。
工作原理?
使用 Fowler-Nordheim隧道對EEPROM進行電擦除和編程。您無需了解技術(shù)細節(jié)即可使用它。基本前提是用電來更改二進制數(shù)據(jù)(什么是二進制)。可以電子方式讀取,擦除和重寫。
幸運的是,Arduino語言可以輕松更改數(shù)據(jù),而無需任何計算機科學(xué)學(xué)位。
預(yù)期壽命
雖然在Arduino中易于使用EEPROM,但壽命確實有限。 EEPROM指定可處理100,000個讀/擦除周期。這意味著您可以在EEPROM變得不穩(wěn)定之前寫入并擦除/重寫數(shù)據(jù)100,000次。實際上,取決于每個處理器的容差,Atmel(Arduino“芯片”的制造商)半導(dǎo)體可以處理更多或更少的循環(huán)次數(shù)。
一旦某個位置被寫入并擦除了太多次,它就會開始變得不可靠。它可能無法返回正確的數(shù)據(jù),也可能無法返回相鄰位的值。
這聽起來像很多次寫入,但是如果以編程方式進行讀取和寫入(在《例如,strong》 loop )。讀取數(shù)據(jù)不會降低芯片質(zhì)量,僅寫入會。您可以無憂無慮地從EEPROM讀取數(shù)據(jù)!
請務(wù)必注意,此限制適用于每個內(nèi)存位置。您的Arduino在EEPROM中可能有1,000個或更多可用的存儲位置,因此,如果您對一個位置寫入太多次,則只會影響該位置,而不會影響其他位置。稍后,我將討論耗損均衡,它可以通過均勻分配數(shù)據(jù)來減少EEPROM的耗損-SSD可以利用這一點。
它有什么用?
EEPROM對于您的Arduino項目非常有用。由于即使斷電也能記住數(shù)據(jù),因此您可以存儲Arduino的狀態(tài)。也許您可以建造一個可以記住其位置或剩余多少“彈藥”的激光轉(zhuǎn)塔。您可以使用它來控制設(shè)備,并記錄設(shè)備被激活的次數(shù)。
EEPROM最適合諸如設(shè)置或高分的事情。如果要定期寫入復(fù)雜數(shù)據(jù),則可以考慮使用以太網(wǎng)屏蔽(具有內(nèi)置SD插槽)或Raspberry Pi。
讀寫
現(xiàn)在,理論已成為現(xiàn)實,讓我們看看如何讀寫一些數(shù)據(jù)!首先,包括庫(Arduino IDE隨附):
#include
現(xiàn)在寫入一些數(shù)據(jù):
EEPROM.write(0, 12);
這會將數(shù)字 12 寫到EEPROM位置 0 。每次寫入需要3.3毫秒( ms ,1000ms = 1秒)。請注意,您不能寫字母( char ),只允許從0到255的數(shù)字。這就是為什么EEPROM非常適合設(shè)置或高分,但不適用于播放器名稱或單詞的原因。可以使用這種方法存儲文本(您可以將字母表中的每個字母映射到一個數(shù)字),但是您將需要具有多個存儲位置-每個字母一個位置。
以下是您的閱讀方式該數(shù)據(jù):
EEPROM.read(0);
零是您之前寫入的地址。如果您以前沒有寫過地址,它將返回最大值( 255 )。
有一些更有用的方法可用。假設(shè)您想存儲小數(shù)位或字符串:
EEPROM.put(2,“12.67”);
這會將數(shù)據(jù)寫入多個位置,這很容易編寫,但仍然很方便。您仍需要跟蹤已寫入的位置數(shù),以免意外覆蓋數(shù)據(jù)!您必須使用 get 方法再次檢索此數(shù)據(jù):
float f = 0.00f;
EEPROM.get(2, f);
get中的值存儲在浮點型 f 變量。請注意,如何使用 0.00f 作為值進行初始化。 f 使編譯器知道您可能希望在此變量中存儲大量數(shù)字,因此它會在編譯過程中設(shè)置一些其他配置。
Arduino網(wǎng)站上的EEPROM文檔還有更多示例。
磨損平衡
磨損平衡是一種用于減少磨損并延長EEPROM壽命的技術(shù)。如果您僅在一個小型項目上工作,則不必擔(dān)心這一點。
保存EEPROM壽命的最簡單方法是限制您的寫入到特定位置。您可以通過先讀取地址來完成此操作,如果您要寫入的值已經(jīng)存在,則無需再次寫入(請記住,讀取數(shù)據(jù)無害)。操作方法如下:
int safeWrite(int data, address) {
if(EEPROM.read(address) != data) {
EEPROM.write(address, data);
}
}
這是相當(dāng)簡單的代碼,但是僅適用于整數(shù)!不用重新發(fā)明輪子,而是使用Arduino EEPROM庫中內(nèi)置的功能:
EEPROM.update(address, val);
此方法與 write 方法,盡管它可能會大大減少所需的寫入次數(shù)!
如果您需要寫入大量數(shù)據(jù),并且擔(dān)心芯片消耗wearing盡,則可以跟蹤進行多少次寫入,盡管這會使用更多數(shù)據(jù)。這是偽代碼的粗略實現(xiàn):
var address = 0
var writeCount = 0
if(writeCount 》 75,000)
writeCount = 0
address += 1
EEPROM.write(address, data)
您將需要將地址和writeCount存儲在EEPROM中(并且writeCount需要在地址位置之間劃分)。在大多數(shù)情況下,將不需要此級別的保護。 Arduino也是如此便宜,因此您可能會發(fā)現(xiàn)購買備份更容易!
責(zé)任編輯:wv
-
EEPROM
+關(guān)注
關(guān)注
9文章
1022瀏覽量
81661 -
Arduino
+關(guān)注
關(guān)注
188文章
6471瀏覽量
187243
發(fā)布評論請先 登錄
相關(guān)推薦
評論