///////////////////////////////////// myLIBRARY /////////////////////////////////////
#ifndef sti
#define sti
#if (ARDUINO >=100)
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <EEPROM.h>
#define EEPROMsiz 1024
class StringsTointEEPROM
{
public:
//constructor
StringsTointEEPROM();
// Methods
void format_eeprom();
int begin();
void save_string_to_eeprom(char *stringIn);
void save_nstrings_to_eeprom(int nbstring,char *stringsIn[]);
void print_strings_from_eeprom();
int get_string_from_eeprom(char *stringOut); //return 0 if MT
int get_nstrings_from_eeprom(int nbstring, char *stringsOut[]); //return 0 if MT
private:
int find_eeprom_address();
uint16_t _adr_EEPROM;
};
#endif
#include <stringsToint_EEPROM.h>
StringsTointEEPROM::StringsTointEEPROM()
{
}
void StringsTointEEPROM::format_eeprom()
{
for (int i=0;i<EEPROMsiz;i++) EEPROM.write(i,0xff);
}
int StringsTointEEPROM::begin()
{
return find_eeprom_address();
}
void StringsTointEEPROM::save_string_to_eeprom(char *stringIn)
{
// sync (0xaa)
// nchar(0..255)
// char[0]
// char[1]
// ..
// char[nchar-1]
// 0xff (end of latest string)
int i;
uint8_t len,val=0;
while (val!=0xff)
{
val=EEPROM.read(_adr_EEPROM);
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
}
_adr_EEPROM=(_adr_EEPROM-1)%EEPROMsiz;
EEPROM.write(_adr_EEPROM,0xaa); //write sync
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
len=strlen(stringIn);
EEPROM.write(_adr_EEPROM,len);//write nchar
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
for(i = 0; i < len; i++)
{
EEPROM.write(_adr_EEPROM, stringIn[i]);//write string
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
}
EEPROM.write(_adr_EEPROM,0xff); //write end of string
}
void StringsTointEEPROM::save_nstrings_to_eeprom(int nbstring,char *stringsIn[])
{
// sync (0xaa)
// nchar(0..255)
// char[0]
// char[1]
// ..
// char[nchar-1]
// 0xff (end of latest string)
int i,iter=0;
uint8_t len,val=0;
while (val!=0xff)
{
val=EEPROM.read(_adr_EEPROM);
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
}
_adr_EEPROM=(_adr_EEPROM-1)%EEPROMsiz;
while (nbstring>0)
{
EEPROM.write(_adr_EEPROM,0xaa); //write sync
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
len=strlen(stringsIn[iter]);
EEPROM.write(_adr_EEPROM,len);//write nchar
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
for(i = 0; i < len; i++)
{
EEPROM.write(_adr_EEPROM, stringsIn[iter][i]);//write string
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
}
nbstring--;
iter++;
}
EEPROM.write(_adr_EEPROM,0xff); //write end of string
}
void StringsTointEEPROM::print_strings_from_eeprom()
{
int i,cntr=0;
uint8_t len,val=0;
uint16_t adr_EEPROM=_adr_EEPROM;
while (val!=0xff) //find end of latest string
{
val=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
}
while(1) //display all strings that were stored in EEPROM in FIFO order
{
val=EEPROM.read(adr_EEPROM);
while (val!=0xaa) //find sync (could be long if EEPROM not full)
{
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
val=EEPROM.read(adr_EEPROM);
cntr++;
if (cntr==EEPROMsiz)
{
Serial.println("EEPROM is MT");
break;
}
}//while (val!=0xaa)
if (cntr==EEPROMsiz) break;
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
len=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
for(i = 0; i < len; i++)
{
Serial.print((char)EEPROM.read(adr_EEPROM));
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
}//for(i = 0; i < len; i++)
Serial.println();
val=EEPROM.read(adr_EEPROM);
if (val==0xff) break; //break if EEPROM not full or 1 full circle
else val=0;
}//while(1)
}
int StringsTointEEPROM::get_string_from_eeprom(char *stringOut)
{
//get latest string from eeprom
int i,cntr=0;
uint8_t len,val=0;
uint16_t adr_EEPROM=_adr_EEPROM;
while (val!=0xff) //find end of latest string
{
val=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
}
adr_EEPROM=(adr_EEPROM-1)%EEPROMsiz;
while (val!=0xaa) //find sync
{
val=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM-1)%EEPROMsiz; //back up
cntr++;
if (cntr==EEPROMsiz) break; //EEPROM is MT
}//while (val!=0xaa)
if (cntr==EEPROMsiz) return 0;
adr_EEPROM=(adr_EEPROM+2)%EEPROMsiz; //get to len
len=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
for(i = 0; i < len; i++)
{
stringOut[i]=(char)EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
}//for(i = 1; i < len; i++)
stringOut[len]='\0';
return 1;
}
int StringsTointEEPROM::get_nstrings_from_eeprom(int nbstring,char *stringsOut[])
{
int i,cntr=0,stringno;
uint8_t len,val=0;
uint16_t adr_EEPROM=_adr_EEPROM;
while (val!=0xff) //find end of latest string
{
val=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
}
adr_EEPROM=(adr_EEPROM-1)%EEPROMsiz;
for (stringno=0;stringno<nbstring;stringno++)
{
while (val!=0xaa) //find sync
{
val=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM-1)%EEPROMsiz; //back up
cntr++;
if (cntr==EEPROMsiz) break; //EEPROM is MT
}//while (val!=0xaa)
val=0;
if (cntr==EEPROMsiz) return 0;
}//for (stringno=0;stringno<laststring+1;stringno++)
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz; //get to len
for (stringno=0;stringno<nbstring;stringno++)
{
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz; //get to len
len=EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
for(i = 0; i < len; i++)
{
stringsOut[stringno][i]=(char)EEPROM.read(adr_EEPROM);
adr_EEPROM=(adr_EEPROM+1)%EEPROMsiz;
}//for(i = 0; i < len; i++)
stringsOut[stringno][len]='\0';
}//for (stringno=0;stringno<nbstring;stringno++)
return 1;
}
int StringsTointEEPROM::find_eeprom_address()
{
uint8_t val=0;
int cntr=0;
_adr_EEPROM=0;
while (val!=0xff)
{
val=EEPROM.read(_adr_EEPROM);
_adr_EEPROM=(_adr_EEPROM+1)%EEPROMsiz;
cntr++;
if (cntr==EEPROMsiz) return 0;
}
_adr_EEPROM=(_adr_EEPROM-1)%EEPROMsiz;
return 1;
}
//////////////////////////////////// myEXAMPLEscetch ///////////////////////////////////
#include <StringsToint_EEPROM.h>
#define TABLESIZ 6
StringsTointEEPROM inteeprom; //internal Arduino EEPROM Library for storing and retreiving c-strings
char eaudgc[10]="25";
char eaucm[10]="15";
char eautime[10]="(05:30)";
char airdgc[10]="18";
char airhum[10]="33";
char airtime[10]="(06:30)";
char *tableadr[]={eaudgc,eaucm,eautime,airdgc,airhum,airtime};
// STRUCTURE OF A STORED STRING
//-----------------------------
// sync (0xaa)
// nchar(0..255)
// char[0]
// char[1]
// ..
// char[nchar-1]
// 0xff (end of latest string)
//-----------------------------
void setup() {
Serial.begin(115200);
delay(1000);
//inteeprom.format_eeprom(); //needs to be formatted once
if (inteeprom.begin()==0) Serial.println("begin() ERROR, Format the EEPROM");
inteeprom.save_nstrings_to_eeprom(TABLESIZ,tableadr);
Serial.println("latest 6 strings read from EEPROM");
if (inteeprom.get_nstrings_from_eeprom(TABLESIZ,tableadr)==0) Serial.println("EEPROM is MT"); //read string
Serial.println(eaudgc);
Serial.println(eaucm);
Serial.println(eautime);
Serial.println(airdgc);
Serial.println(airhum);
Serial.println(airtime);
}
void loop() {
// put your main code here, to run repeatedly:
}