使用 Arduino EEPROM 來儲存變數值

使用 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)
 ;
}

台灣物聯科技 TaiwanIOT