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