Semorphe

記住設定

拔掉電源,它還記得。 · ⏱ 約 25 分鐘

你會學到三件事

  1. 變數在斷電時全部消失,而 EEPROM 不會
  2. EEPROM.read / EEPROM.write位址存取
  3. EEPROM 有寫入次數上限——所以不能一直寫

開始之前

到目前為止,你的板子每次開機都失憶

第 10 課的 state、第 5 課校正出來的範圍、第 11 課的 WiFi 密碼—— 拔掉電源就沒了。

這一課給它一本永遠不會被擦掉的筆記本。

一、變數住在哪

斷電之後
一般變數(RAM) 消失
程式碼(Flash) 留著,而程式跑的時候改不了
EEPROM 留著,而且改得了 ← 這一課

Arduino Uno 有 1024 個位元組的 EEPROM。不多,而夠記設定。

二、用位址存取

int n = EEPROM.read(0);      // 讀第 0 格
EEPROM.write(0, n + 1);      // 寫回第 0 格

⚠️ 它不是變數,是一排格子——你要自己記得「第 0 格放的是什麼」。

位址   0    1    2    3   ...  1023
內容  [ ]  [ ]  [ ]  [ ]       [ ]

⚠️ 每一格只裝得下 0~255(一個位元組)。

想存一個大一點的數字要拆成好幾格,或用 EEPROM.put() / EEPROM.get() (它們會自己處理多格)。

⚠️ 從來沒寫過的格子讀出來是 255,不是 0。 所以「第一次開機」要有辦法分辨——常見做法是在某一格放一個約定好的記號。

三、⚠️ 它會壞

EEPROM 的每一格大約可以寫 10 萬次。聽起來很多,而——

void loop() {
    EEPROM.write(0, n);      // 🔴 千萬不要這樣
}

loop 一秒跑幾萬次。這樣寫的話,那一格幾秒鐘就報廢了。

EEPROM 是給「設定」用的,不是給「狀態」用的。

判準:這個值多久變一次? 一秒好幾次 → 不要寫進去。 使用者調整一次才變 → 可以。

EEPROM.update()write() 好——值沒變的話它不寫

四、開機計數器

void setup() {
    Serial.begin(9600);
    int n = EEPROM.read(0);
    Serial.println(n);
    EEPROM.write(0, n + 1);
}

每次開機印出「這是第幾次開機」,然後加一存回去。

⚠️ 到 255 之後會繞回 0——因為一格只有一個位元組。 這不是錯誤,是它的容量。

完成的樣子

void setup() {
    Serial.begin(9600);
    int n = EEPROM.read(0);
    Serial.println(n);
    EEPROM.write(0, n + 1);
}

void loop() {
}

換你了

把第 5 課校正出來的最暗/最亮值存進 EEPROM,開機時讀回來。

⚠️ 而它們可能超過 255——想一下怎麼處理。 (提示:analogRead 最大 1023,除以 4 就塞得進一格,代價是精度。 或者用兩格。或者用 EEPROM.put()。)

這一課你做了什麼

如果卡住了

你看到 多半是因為
第一次讀到 255 正常。從來沒寫過的格子就是 255
值到 255 就繞回 0 一格只有一個位元組。要更大就用多格或 put()
存進去的大數字讀出來不對 超過 255 被截斷了
用久了那一格壞掉 寫太頻繁了。改用 update(),而且不要放進 loop
在編輯器打開這一課 →