🧩 1. ความหมายของ EEPROM / Flash Memory
EEPROM (Electrically Erasable Programmable Read-Only Memory) คือหน่วยความจำที่สามารถ “เขียน–ลบ–อ่าน” ได้ทางไฟฟ้า และข้อมูลจะ ไม่หายไปเมื่อปิดไฟ
ในบอร์ดต่าง ๆ :
| บอร์ด | พื้นที่ EEPROM | หมายเหตุ |
|---|---|---|
| Arduino UNO / Nano | 1 KB | ใช้งานผ่าน EEPROM.h |
| Arduino MEGA | 4 KB | ใช้หลักการเดียวกัน |
| ESP8266 / ESP32 | จำลอง EEPROM อยู่ใน Flash | ใช้ EEPROM.h (จำลอง) หรือ Preferences.h |
⚡ บน ESP32 จริง ๆ ไม่มี EEPROM แท้ ๆ — แต่จะจำลองพื้นที่บางส่วนของ Flash เพื่อใช้งานแบบเดียวกัน
⚙️ 2. การใช้งาน EEPROM บน Arduino
#include <EEPROM.h>
int addr = 0;
int value;
void setup() {
Serial.begin(9600);
value = 123;
EEPROM.write(addr, value); // เขียนข้อมูล
EEPROM.commit(); // (ใน UNO ไม่ต้องใช้)
Serial.println("Saved!");
int readVal = EEPROM.read(addr);
Serial.print("Read: ");
Serial.println(readVal);
}
void loop() {}
ข้อมูลที่เขียนไว้จะยังคงอยู่แม้ถอดปลั๊กหรือรีเซ็ตบอร์ด
🔹 3. การเขียนและอ่านข้อมูลหลายชนิด
| ชนิดข้อมูล | คำสั่งเขียน | คำสั่งอ่าน |
|---|---|---|
| 1 byte | EEPROM.write(addr, val) | EEPROM.read(addr) |
| หลาย byte (int, float, struct) | EEPROM.put(addr, val) | EEPROM.get(addr, var) |
📘 ตัวอย่าง:
int number = 987;
EEPROM.put(0, number); // เขียน int
EEPROM.commit();
delay(500);
int x;
EEPROM.get(0, x);
Serial.println(x);
🔹 4. การใช้งาน EEPROM จำลองบน ESP32
บน ESP32 ต้อง กำหนดขนาดจำลอง (เช่น 512 หรือ 1024 byte) และเรียก commit() ทุกครั้งหลังเขียน
📘 ตัวอย่าง:
#include <EEPROM.h>
#define EEPROM_SIZE 512
void setup() {
Serial.begin(115200);
EEPROM.begin(EEPROM_SIZE);
int count = EEPROM.read(0);
Serial.printf("Last Count: %d\n", count);
count++;
EEPROM.write(0, count);
EEPROM.commit();
Serial.println("Saved new count!");
}
void loop() {}
เปิด Serial Monitor จะเห็นค่าที่เพิ่มขึ้นเรื่อย ๆ ทุกครั้งที่รีเซ็ตบอร์ด เพราะค่าถูกเก็บไว้ใน Flash ไม่หาย
🔹 5. การจัดเก็บข้อมูลหลายตัวใน EEPROM
struct Config {
int brightness;
float threshold;
char ssid[20];
} config;
void setup() {
EEPROM.begin(512);
// บันทึกค่า
config.brightness = 128;
config.threshold = 2.5;
strcpy(config.ssid, "LIC-WiFi");
EEPROM.put(0, config);
EEPROM.commit();
// อ่านกลับ
Config readCfg;
EEPROM.get(0, readCfg);
Serial.printf("SSID:%s, Bright:%d, Th:%.2f\n",
readCfg.ssid, readCfg.brightness, readCfg.threshold);
}
🔹 6. การใช้งาน Preferences API (เฉพาะ ESP32)
ESP32 มีคลาส Preferences ซึ่งใช้งานง่ายกว่า EEPROM และรองรับข้อมูลหลายชนิด
📘 ตัวอย่าง:
#include <Preferences.h>
Preferences prefs;
void setup() {
Serial.begin(115200);
prefs.begin("settings", false); // สร้าง namespace
prefs.putInt("count", prefs.getInt("count", 0) + 1);
prefs.putString("ssid", "LIC-WiFi");
Serial.printf("Count: %d\n", prefs.getInt("count", 0));
Serial.println(prefs.getString("ssid", "none"));
prefs.end();
}
void loop() {}
| คำสั่ง | ความหมาย |
|---|---|
begin(namespace, readonly) | เปิดพื้นที่เก็บข้อมูล |
putInt / putFloat / putString | เขียนค่า |
getInt / getString | อ่านค่า |
remove(key) | ลบข้อมูล |
clear() | ลบทั้งหมด |
🔹 7. การลบข้อมูล EEPROM / Preferences
Arduino:
for (int i=0; i<EEPROM.length(); i++) EEPROM.write(i, 0);
EEPROM.commit();
ESP32 Preferences:
prefs.begin("settings", false);
prefs.clear();
prefs.end();
🔹 8. ข้อควรระวัง
1️⃣ EEPROM / Flash มีอายุการเขียนจำกัด (~100,000 ครั้งต่อ address)
2️⃣ ไม่ควรเขียนซ้ำใน loop บ่อย ๆ (ควรเขียนเฉพาะเมื่อค่ามีการเปลี่ยนจริง)
3️⃣ เรียก commit() ทุกครั้งหลังเขียน (เฉพาะ ESP32 / ESP8266)
4️⃣ ไม่เหมาะเก็บข้อมูลขนาดใหญ่ (เช่น log sensor ต่อเนื่อง) — ให้ใช้ SD card แทน
🔹 9. การประยุกต์ใช้งาน
| งานจริง | สิ่งที่เก็บใน EEPROM |
|---|---|
| ระบบล็อกอิน | รหัส Wi-Fi / Token |
| ระบบ Smart Home | ค่าการตั้งเวลา / โหมดการทำงานล่าสุด |
| เครื่องมือวัด | ค่าการสอบเทียบ (Calibration) |
| IoT Device | ค่า API Key, Server URL |
| ระบบรีเลย์ | สถานะเปิด/ปิดก่อนปิดไฟ |
📘 ตัวอย่าง: บันทึกค่า SSID และ Password หลังผู้ใช้ตั้งผ่าน Web Config เพื่อให้ ESP32 เชื่อมต่อ Wi-Fi อัตโนมัติเมื่อเปิดเครื่องใหม่
📚 10. แบบฝึกหัด
1️⃣ เขียนโปรแกรมบันทึกค่าจำนวนครั้งที่รีเซ็ตบอร์ดลงใน EEPROM
2️⃣ เขียนโปรแกรมเก็บค่า อุณหภูมิล่าสุด จาก DHT22 และอ่านกลับมาหลังรีเซ็ต
3️⃣ สร้างโครงสร้าง Config บันทึก SSID / Password / Threshold
4️⃣ เขียนโปรแกรม Preferences แบบ Key–Value ใน ESP32
5️⃣ ทดลองลบข้อมูลทั้งหมดและอ่านค่าใหม่หลังบูต
🧾 11. สรุปแนวคิดสำคัญ
| หัวข้อ | อธิบาย |
|---|---|
| EEPROM | หน่วยความจำเก็บข้อมูลถาวร |
| Flash | พื้นที่หลักของ ESP32 ใช้จำลอง EEPROM |
| EEPROM.begin(size) | เริ่มใช้งานและกำหนดขนาด |
| EEPROM.write / read / put / get | เขียน–อ่านข้อมูล |
| EEPROM.commit() | ยืนยันการเขียน (สำคัญใน ESP32) |
| Preferences | ระบบเก็บข้อมูลแบบ Key-Value ใน ESP32 |
| ข้อจำกัด | เขียนซ้ำได้ ~100,000 ครั้ง |
| ประยุกต์ใช้ | บันทึกการตั้งค่า, ค่าคงที่, สถานะล่าสุด |
📘 ภาพแนวคิดการทำงาน
┌────────────┐
│ RAM │ ← หายเมื่อรีเซ็ต
└────────────┘
│
EEPROM / Flash
│
┌────────────┐
│ เก็บค่าถาวร │
│ (Wi-Fi, Setup) │
└────────────┘
