Thinking Different




EEPROM

 

부화기 설정 값과 시간 등을 저장하기 위해서 EEPROM을 사용하여 저장하는 소스 코드 입니다.

 

EEPROM 에 대한 자세한 내용은 아래 글을 참고하시면 됩니다.

 

https://copynull.tistory.com/478

 

[아두이노] 31. EEPROM 비휘발성 메모리 사용 (4byte 저장)

EEPROM (Electrically Erasable Programmable Read-Only Memory) 이하 비휘발성 메모리(NVM)라고 한다. 전기가 꺼져도 데이터를 저장하고 있으며 다음에 다시 전기가 들어오면 읽고 와서 사용할 수 있다.  컴퓨터

copynull.tistory.com

 

 

 

Incubator_Main.ino

...

#include <EEPROM.h>

...

extern unsigned long EggMoveTime;
extern unsigned long SaveTime; // 저장 시간


unsigned long nowTime = 0; // 현재타이머시간

...

long mode = 0;   // 0 = 부화기, 1 = 육추기 모드

...

void setup()
{  
  ...

  // rom 저장 데이터 읽기
  mode = EEPROM_Read(0);
  nowTime = EEPROM_Read(1);
  EggMoveTime = EEPROM_Read(2);

  ...
}

void loop() 
{
  ...

  if(millis()-beforeTime>=1000)
  {
    ...
    
    SaveTime++;
    
    ...

    // 자동 저장
    AutoSave();

    ...
  }

  ...
}

 

 

_eeprom.ino

#define AUTO_SAVE_TIME (60*30)         // 30분마다
unsigned long SaveTime = 0;       // 저장 시간

// 롬 데이터 쓰기
void EEPROM_Write(int address, long value)
{
  byte b4 = (value & 0xFF);
  byte b3 = ((value >> 8) & 0xFF);
  byte b2 = ((value >> 16) & 0xFF);
  byte b1 = ((value >> 24) & 0xFF);

  EEPROM.write(address * 4, b4);
  EEPROM.write(address * 4 + 1, b3);
  EEPROM.write(address * 4 + 2, b2);
  EEPROM.write(address * 4 + 3, b1);
}

// 롬 데이터 갱신
void EEPROM_Update(int address, long value)
{
  byte b4 = (value & 0xFF);
  byte b3 = ((value >> 8) & 0xFF);
  byte b2 = ((value >> 16) & 0xFF);
  byte b1 = ((value >> 24) & 0xFF);

  EEPROM.update(address * 4, b4);
  EEPROM.update(address * 4 + 1, b3);
  EEPROM.update(address * 4 + 2, b2);
  EEPROM.update(address * 4 + 3, b1);
}

// 롬 데이터 읽기
long EEPROM_Read(int address)
{
  long d4 = EEPROM.read(address * 4);
  long d3 = EEPROM.read(address * 4 + 1);
  long d2 = EEPROM.read(address * 4 + 2);
  long d1 = EEPROM.read(address * 4 + 3);

  return ((d4 << 0) & 0xFF) + ((d3 << 8) & 0xFFFF) + ((d2 << 16) & 0xFFFFFF) + ((d1 << 24) & 0xFFFFFFFF);
}

// 자동 저장
void AutoSave()
{
  if(SaveTime >= AUTO_SAVE_TIME)
  {
    EEPROM_Update(0, mode);
    EEPROM_Update(1, nowTime);
    EEPROM_Update(2, EggMoveTime);

    SaveTime = 0;
  }
}

 

 

이로써 모든 코드가 완료되었습니다.