아두이노/이론

아두이노 우노 EEPROM 사용하기

원원 2023. 11. 26. 16:37

안녕하세요. 오늘은 아두이노 우노에있는 EEPROM 기능을 사용해보겠습니다

EEPROM이란 Electrically Erasable Programmable Read-Only Memory의 약자로 비휘발성 데이터를 의미합니다
아두이노 우노는 일반적으로 ATMEGA32를 사용하므로 데이터시트를보면 EEPROM은 1024Bytes의 크기를 가지고있고 100,000번 write/erase 사용가능합니다. 제조사가 제시한 횟수를 초과하면 데이터 손실이 있을 수 있습니다

 

EEPROM라이브러리를 사용하면 매우쉽게 사용이 가능합니다. 

* Write하기
EEPROM.write(address,value)
address는 0~1023까지 가능하고 value에는 1byte 값을 적으면 됩니다

*Read하기
EEPROM.read(address);
address에는 읽을 주소를 적으면 됩니다

#include <EEPROM.h>

byte value=0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  EEPROM.write(0, 100);
  value = EEPROM.read(0);
  Serial.print(value);
}

void loop() {
  // put your main code here, to run repeatedly:
  
}


*Update기능
update함수는 write와 비슷합니다만 update를 사용하면 기존에 저장되어있는 값이랑 다를때만 값을 저장합니다
EEPROM은 수명이 있으므로 update함수를 사용하면 수명을 절약할수있습니다
EEPROM.update(address,value)
사용방식은 write와 같습니다.

*사용예시
하나의 장소에 1byte를 저장하므로 0~255까지 저장이 됩니다.
만약 256이상 저장하고싶다면 시프트레지스터를 사용하면 편리합니다
예를들어 1000을 저장하고싶다면 1000이면 16진수로 0x3e8입니다.  2바이트가 필요하므로 한 곳에는 0xe8을 저장하고 한 곳에는 0x03을 저장하면 됩니다.

#include <EEPROM.h>

int value=1000;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  EEPROM.update(0, value);
  EEPROM.update(1, value>>8);
  
  Serial.print("EEPROM.read(0) : 0x");
  Serial.println(String(EEPROM.read(0), HEX));

  Serial.print("EEPROM.read(1) : 0x");
  Serial.println(String(EEPROM.read(1), HEX));
  Serial.println("EEPROM.read(0) | EEPROM.read(1)<<8 : " + String(EEPROM.read(0) | (EEPROM.read(1) << 8)));
}

void loop() {
  // put your main code here, to run repeatedly:
  
}

 

아두이노 외에 다른 MCU를 사용할 때 EEPROM을 사용해야 할 상황이 생겼을 때 아두이노에서 제공해 주는 함수와 유사한 방식으로 함수를 만든다면 사용하기 편할 것 같습니다