記住設定
拔掉電源,它還記得。 · ⏱ 約 25 分鐘
你會學到三件事
- 變數在斷電時全部消失,而 EEPROM 不會
EEPROM.read / EEPROM.write 用位址存取
- 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 |
在編輯器打開這一課 →