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() {  }
Writing and Reading the EEPROM for Arduino UNO
รูปที่ 1 ผลการทดลองที่ 1 การเขียนและอ่านข้อมูลเลข 1 ไบร์ (Byte)

ในตัวอย่างโปรแกรมการทดลองที่ 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 ในกรอบสีแดง

Arduino Library —> EEPROM.h

/* 
    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 */ }
Writing and Reading the EEPROM for Arduino UNO
รูปที่ 2 ผลการทดลองที่ 2 การเขียนและอ่านข้อมูลด้วยตัวเลขจำนวนและทศนิยม

ตัวอย่างโปรแกรมการทดลองที่ 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 */ }
Writing and Reading the EEPROM for Arduino UNO
รูปที่ 3 ผลการทดลองที่ 3 การเขียนและอ่านข้อมูลด้วยข้อความ

ตัวอย่างโปรแกรมการทดลองที่ 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 */ }
Writing and Reading the EEPROM for Arduino UNO
รูปที่ 4 ผลการทดลองที่ 4 การเขียนและอ่านข้อมูลแบบชุดข้อมูล

ตัวอย่างสุดท้ายที่ 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

  1. https://docs.arduino.cc/learn/built-in-libraries/eeprom
  2. https://docs.arduino.cc/learn/programming/eeprom-guide
  3. https://wiki-content.arduino.cc/en/Tutorial/LibraryExamples/EEPROMWrite
  4. https://wiki-content.arduino.cc/en/Tutorial/LibraryExamples/EEPROMRead
  5. https://github.com/PaulStoffregen/EEPROM
  6. https://github.com/arduino/ArduinoCore-avr/tree/master/libraries/EEPROM