EEprom storage using writeAnything.h

mySensVals will be numbers anywhere from 100 to 2000
Does the Uno have enough eeprom to store this many settings?
thanks.

struct config_settings
{
    int mySensVals[12];  //# of pulses in 2-12 cups 
    boolean Enable_Audio;  //whether the user wants sound
    boolean Enable_Piezo;  //whether the user wants a knock sensor
    boolean Enable_PhotoCell;  //whether the user wants to use the photocell
} MySettings;


//...set up values to save.  

    EEPROM_writeAnything(0, MySettings);  //save the settings

I count 27 bytes of storage needed to store that structure into eeprom. As the Uno has a 1,000 byte eeprom it should fit rather nicely, if not lonely with all the extra eeprom space avalible. :wink:

Lefty

Thanks! (that was quick). I'll reread the ref section on sizes, an integer must be only 2 bytes, and a boolean 1, to only add up to 27...

Yeah, I just read the size of bolleans and integers. strange a boolean only holds true or false, in 1 byte, and and integer at 2 bytes can hold a huge number. I thought it would have been a lot more bytes than that. I should be okay with all the settings I can think of changing!

strange a boolean only holds true or false, in 1 byte, and and integer at 2 bytes can hold a huge number.

The smallest addressible item on the AVR is a byte.
If you are really pushed for space (it doesn't look like you are!), you can use structs with bit-fields defined in them for boolean flags.

struct {
unsigned flag0:1; // defines eight, one bit fields.
unsigned flag1:1;
unsigned flag2:1;
unsigned flag3:1; 
unsigned flag4:1;
unsigned flag5:1;
unsigned flag6:1;
unsigned flag7:1;};
struct config_settings {
    int mySensVals[13];  //# of pulses in 2-12 cups 
    int motor_delay;     //change the distance the platform travels
    boolean Enable_Audio;  //whether the user wants sound
    boolean Enable_Piezo;  //whether the user wants a knock sensor
    boolean Enable_Photocell;  //whether the user wants to use the photocell to turn on the cabinet lighting
    int Photocell_Level;  //threshold for light/darkness
} MySettings;

void LoadSettings(){
  EEPROM_readAnything(0, MySettings);   //load the settings
}

void SaveSettings(){
  EEPROM_writeAnything(0, MySettings);  //save the settings
  sendMessage("Settings saved!");
}

...so I think I'm using 33 bytes of EEPROM to save settings.
Now I have other settings I want to save/load in reference to time, since I've added an RTC module.
Can I save other settings to another part of the EEPROM like this:

struct config_settings {
    int CurrentYear;    //for keeping track of what year it is
    int CupsTotal;    //lifetime total
    int CupsMonth;    //cups drank this month
    int CusYear;        //cups drank this year
    int CupsLast;    //last cup drank
} TimeData;

void LoadSettings(){
  EEPROM_readAnything(34, TimeData);   //load the settings
}

void SaveSettings(){
  EEPROM_writeAnything(34, TimeData);  //save the settings
}

Can I save other settings to another part of the EEPROM like this:

Yes, and no. You have the right idea, and address, but this:

struct config_settings {
    int CurrentYear;    //for keeping track of what year it is
    int CupsTotal;    //lifetime total
    int CupsMonth;    //cups drank this month
    int CusYear;        //cups drank this year
    int CupsLast;    //last cup drank
} TimeData;

won't work, because you have already defined a struct called config_settings, so you can't define another struct with the same name.

    int CusYear;        //cups drank this year

CusYear? No p?

PaulS:

    int CusYear;        //cups drank this year

CusYear? No p?

Ok, maybe it'd be better with a p.
:blush:

Thanks, I didn't think about the first part of that struct, since I never use the name 'config_settings', I thought it was just part of the code that made the whole thing work. So it can be anything?

So it can be anything?

Well, there are a few reserved keywords that it CAN'T be, but everything else is what it CAN be.