使用 Arduino EEPROM 來儲存變數值
特性: 一般執行 Arduino 時,如果正常供電的狀態下,一些變數會隨著電源消失也會跟著不見了,而 EEPROM 內的資料並不會隨著關機而消失。當我們要儲存用戶密碼或者一些變數值,期待下一次 Arduino 開機後又能讀取到上一次最後運作時的設定,那您就會需要將資料寫入到 EEPROM 內,不會隨著斷電後資料就遺失的問題。
應用範圍:儲存藍芽的密碼, 或者 ESP8266 的熱點密碼等等,可以設計搭配硬體按鍵後儲存變數。日後可以讓 Arduono 的程式呼叫讀取,如果有更新的時候再儲存。但是注意 EEPROM 有寫入次數的限制,ATmega 系列微控制器的 EEPROM 其每一個位置大約只能寫入 10 萬次,在使用的時候,最好盡量公平對待 EEPROM 的每一塊空間,不要對某塊空間偏心特別鍾愛,因為如果你頻繁地使用固定的一塊空間,那麼該塊空間可能很快就壽終正寢了。
不同版本的 Arduino 板子其微控制器的 EEPROM 容量是不一樣的: ATmega328 是 1024 bytes, ATmega168 和 ATmega8 是 512 bytes,而 ATmega1280 和 ATmega2560 是 4KB (4096 bytes)。
更多關於 Arduino EEPROM 函數庫相關語法與範例 https://www.arduino.cc/en/Reference/EEPROM
#include <EEPROM.h> struct config_t { long alarm; int mode; } configuration; template <class T> int EEPROM_writeAnything(int ee, const T& value) { const byte* p = (const byte*)(const void*)&value; int i; for (i = 0; i < sizeof(value); i++) EEPROM.write(ee++, *p++); return i; } template <class T> int EEPROM_readAnything(int ee, T& value) { byte* p = (byte*)(void*)&value; int i; for (i = 0; i < sizeof(value); i++) *p++ = EEPROM.read(ee++); return i; } void setup() { Serial.begin(9600); //configuration.alarm = 12345678; //configuration.mode = 1; //EEPROM_writeAnything(0, configuration); // ... } void loop() { EEPROM_readAnything(0, configuration); Serial.print("alarm = ");Serial.println(configuration.alarm); Serial.print("mode = ");Serial.println(configuration.mode); while(1) ; }