Writing and Reading the EEPROM for Arduino UNO

การทดลองนี้จะเป็นการใช้งานไลบารี่ EEPROM.h สำหรับเขียนและอ่านข้อมูลลงในหน่วยความจำ EEPROM ของตัวชิฟ ATMFGA328P บนบอร์ดควบคุม Arduino UNO และในการทดลองจะปรับโค้ดตัวอย่างโปแกรมเดิมให้สั้นลงและเข้าใจการทำงานได้ง่ายสำหรับนำไปประยุกต์ใช้งาน ทั้งนี้ไลบารี่ EEPROM.h สามารถดาวน์โหลดได้จากเว็บไซต์ทั่วไปหรือตามลิ้งก์เว็บไซต์ที่อ้างอิงท้ายการทดลองนี้ ทั้งนี้การใช้งานหน่วยความจำ EEPROM มีประโยชน์มากเมื่อเราต้องการเก็บข้อมูลบางอย่างเฉพาะให้อยู่ในชิฟนั้นๆ เช่น ค่าคอนฟิกการทำงานต่างๆ การทำงานผิดพลาดของวงจร หรือการระบุโค้ดการผลิตสินค้า เป็นต้น
/*
Lab EEPROM Sample1
Credit Arduino Code by https://github.com/PaulStoffregen/EEPROM
*/
#include <EEPROM.h>
unsigned int addr0 = 0;
unsigned int addr1 = 1;
void setup(){
Serial.begin(9600);
//********* Write EEPROM ***********************
byte val0 = 22;
byte val1 = 55;
EEPROM.write(addr0, val0);
Serial.print(val0);
Serial.println(", Write addr0 ");
EEPROM.write(addr1, val1);
Serial.print(val1);
Serial.println(", Write addr1 ");
delay(1000);
Serial.println(" Write OK... ");
//********* Read EEPROM ***********************
byte value0;
byte value1;
value0 = EEPROM.read(addr0);
value1 = EEPROM.read(addr1);
Serial.print(value0);
Serial.println(", Read addr0 ");
Serial.print(value1);
Serial.println(", Read addr1 ");
delay(1000);
Serial.print(" Read OK... ");
}
void loop() { }

ในตัวอย่างโปรแกรมการทดลองที่ 1 เป็นการเขียนข้อมูลแบบ 1 ไบร์ 2 จำนวน ด้วยคำสั่ง EEPROM.write(addr0, val0); และ EEPROM.write(addr1, val1); กับเลขจำนวน 22 และ 55 ลงในหน่วยความจำ EEPROM ที่ตำแหน่ง addr0 และ addr1 จากนั้นทดลองอ่านค่ากลับอีกครั้งด้วยคำสั่ง value0 = EEPROM.read(addr0); และ value1 = EEPROM.read(addr1); แล้วแสดงผลผ่านหน้าต่าง Serial Monitor และผลการทดลองที่ได้แสดงในรูปที่ 1 ในกรอบสีแดง
/*
Lab EEPROM Sample2
Credit Arduino Code by https://github.com/PaulStoffregen/EEPROM
*/
#include <EEPROM.h>
unsigned int eeAddress = 0;
void setup(){
Serial.begin(9600);
//********* Write EEPROM ***********************
float f = 456.789;
EEPROM.put( eeAddress, f );
Serial.print( f, 3 );
Serial.println(", Write data OK...");
delay(1000);
//********* Read EEPROM ***********************
EEPROM.get( eeAddress, f );
Serial.print( f, 3 );
Serial.print( ", Read data OK... " );
delay(1000);
}
void loop(){ /* Empty loop */ }

ตัวอย่างโปรแกรมการทดลองที่ 2 จะเป็นการเขียนข้อมูลตัวเลขมีทิศนิยม ด้วยคำสั่ง EEPROM.put( eeAddress, f ); ด้วยตัวเลข 456.789; ลงในหน่วยความจำ EEPROM ที่ตำแหน่ง Address 0 จากนั้นทดลองอ่านค่ากลับด้วยคำสั่ง EEPROM.get( eeAddress, f ); และแสดงผลที่ได้ผ่านหน้าต่าง Serial Monitor ซึ่งผลการทดลองที่ได้แสดงในรูปที่ 2 ในกรอบสีแดง
/*
Lab EEPROM Sample3
Credit Arduino Code by https://github.com/PaulStoffregen/EEPROM
*/
#include <EEPROM.h>
struct MyObject{
char name[12];
};
unsigned int eeAddress = 0;
void setup(){
Serial.begin(9600);
//********* Write EEPROM ***********************
Serial.println(" Write...OK.");
MyObject customVar = {"Test EEPROM"};
EEPROM.put(eeAddress, customVar );
delay(1000);
//********* Read EEPROM ***********************
Serial.print(" Read ---> ");
EEPROM.get(eeAddress, customVar );
Serial.print(customVar.name);
delay(1000);
}
void loop(){ /* Empty loop */ }

ตัวอย่างโปรแกรมการทดลองที่ 3 จะเป็นการเขียนข้อมูลแบบข้อความด้วยคำสั่ง MyObject customVar = {“Test EEPROM”}; และ EEPROM.put(eeAddress, customVar ); ซึ่งใช้ตัวอย่างข้อความคือ Test EEPROM ลงในหน่วยความจำ EEPROM ที่ตำแหน่ง Address 0 จากนั้นทดลองอ่านค่ากลับด้วยคำสั่ง EEPROM.get(eeAddress, customVar ); และ Serial.print(customVar.name); สำหรับแสดงผลที่ได้ผ่านหน้าต่าง Serial Monitor ผลการทดลองที่ได้แสดงในรูปที่ 3 ในกรอบสีแดง
/*
Lab EEPROM Sample4
Credit Arduino Code by https://github.com/PaulStoffregen/EEPROM
*/
#include <EEPROM.h>
struct MyObject{
float data1;
byte data2;
char name[12];
};
unsigned int eeAddress = 0;
void setup(){
Serial.begin(9600);
//********* Write EEPROM ***********************
Serial.println(" Write EEPROM OK...");
MyObject customVar = {102.08f,55,"Test EEPROM"};
eeAddress += sizeof(float);
EEPROM.put(eeAddress, customVar );
delay(1000);
//********* Read EEPROM ***********************
int eeAddress = sizeof(float);
EEPROM.get(eeAddress, customVar );
Serial.println( " Read EEPROM " );
Serial.println( customVar.data1 );
Serial.println( customVar.data2 );
Serial.println( customVar.name );
delay(1000);
}
void loop(){ /* Empty loop */ }

ตัวอย่างสุดท้ายที่ 4 เป็นการเขียนข้อมูลแบบชุดข้อมูลด้วยคำสั่ง MyObject customVar = {102.08f,55,”Test EEPROM”}; eeAddress += sizeof(float); และ EEPROM.put(eeAddress, customVar ); ในตัวอย่างชุดข้อมูลคือ (102.08f,55,”Test EEPROM”) ซึ่งจะมีทั้งข้อมูลแบบไบร์ จำนวนตัวเลขมีทศนิยมและข้อความในชุดเดียว ให้ลงในหน่วยความจำ EEPROM ที่ตำแหน่ง Address 0 จากนั้นทดลองอ่านค่ากลับด้วยคำสั่ง int eeAddress = sizeof(float); และ EEPROM.get(eeAddress, customVar ); และ Serial.print(customVar.name); และนำผลที่ได้แสดงผ่านหน้าต่าง Serial Monitor ด้วยการแบ่งข้อมูลออกเป็นส่วนๆ ด้วยคำสั่ง Serial.println( customVar.data1 ); และ Serial.println( customVar.name ); ตามลำดับ ซึ่งผลการทดลองที่ได้แสดงในรูปที่ 4 ในกรอบสีแดง
สำหรับการทดลองใช้งานไลบารี่ EEPROM.h ครั้งนี้ เป็นส่วนหนึ่งของการเรียกใช้งานที่สะดวกและใช้งานได้ไม่ยากนัก ทั้งนี้คำสั่งอื่นๆ เพิ่มเติมของการใช้ไลบารี่สามารถศึกษาได้ตามลิ้งก์เว็บไซต์อ้างอิงข้างล่าง ทั้งนี้ในส่วนของบทความที่นำเสนอนี้ จะปรับโค้ดโปรแกรมให้สั้นและเข้าใจง่าย รวมทั้งเป็นคำสั่งเรียกใช้งานบ่อยๆ มาเป็นแนวทางให้กับผู้อ่านได้นำไปพัฒนาโค้ดโปรแกรมต่อได้รวดเร็วยิ่งขึ้น
Reference
- https://docs.arduino.cc/learn/built-in-libraries/eeprom
- https://docs.arduino.cc/learn/programming/eeprom-guide
- https://wiki-content.arduino.cc/en/Tutorial/LibraryExamples/EEPROMWrite
- https://wiki-content.arduino.cc/en/Tutorial/LibraryExamples/EEPROMRead
- https://github.com/PaulStoffregen/EEPROM
- https://github.com/arduino/ArduinoCore-avr/tree/master/libraries/EEPROM