🧩 1. ความหมายของ EEPROM / Flash Memory

EEPROM (Electrically Erasable Programmable Read-Only Memory) คือหน่วยความจำที่สามารถ “เขียน–ลบ–อ่าน” ได้ทางไฟฟ้า และข้อมูลจะ ไม่หายไปเมื่อปิดไฟ

ในบอร์ดต่าง ๆ :

บอร์ดพื้นที่ EEPROMหมายเหตุ
Arduino UNO / Nano1 KBใช้งานผ่าน EEPROM.h
Arduino MEGA4 KBใช้หลักการเดียวกัน
ESP8266 / ESP32จำลอง EEPROM อยู่ใน Flashใช้ EEPROM.h (จำลอง) หรือ Preferences.h

⚡ บน ESP32 จริง ๆ ไม่มี EEPROM แท้ ๆ — แต่จะจำลองพื้นที่บางส่วนของ Flash เพื่อใช้งานแบบเดียวกัน


⚙️ 2. การใช้งาน EEPROM บน Arduino

C++
#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 byteEEPROM.write(addr, val)EEPROM.read(addr)
หลาย byte (int, float, struct)EEPROM.put(addr, val)EEPROM.get(addr, var)

📘 ตัวอย่าง:

C++
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() ทุกครั้งหลังเขียน

📘 ตัวอย่าง:

C++
#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

C++
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 และรองรับข้อมูลหลายชนิด

📘 ตัวอย่าง:

C++
#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:

C++
for (int i=0; i<EEPROM.length(); i++) EEPROM.write(i, 0);
EEPROM.commit();

ESP32 Preferences:

C++
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)        │
          └────────────┘