Saving Data to EEPROM

Okay, my problem is I cannot think of any logic that can save data on the Arduino's EEPROM with my program.

This is my code. As you can see, it has the variable ctr for counter, the one that determines the unit of length (meter, cm, ft, in, yd), and the variables mctr1, cmctr1, ftctr1, inctr1, ydctr1 for the respective units of length. The job is to:

  1. Save the data at the point when ssbtn is low.
  2. Save the data after the switch-case function inside the measurebtn.
  3. Retrieve the data whenever the Arduino is reset (meaning, at initialization, the code should first check if the EEPROM has the saved data or none).
#include <LiquidCrystal.h>
#include <stdio.h>

LiquidCrystal lcd(12,11,5,4,3,2);

byte p20[8] = {
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};
byte p40[8] = {
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
};
byte p60[8] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
};
byte p80[8] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
};
byte p100[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

const int measurebtn = 7;
const int ssbtn = 6;
const int resetbtn = 9;
const int ledPin = 13;
const int sensorPin = 8;

int ext = 0;
int cctr = 0;
int sctr = 0;
int pctr = 0;
int ctr=0;
int tripState = 0;
float pctr1 = 0;
float measure = 0;
int measurectr = 0;
int prevmeasure = 0;
int ssctr = 0;
int prevss = 0;
int resetctr = 0;
int prevreset = 0;
int prevsensor = 0;
int ctr2 = 5;
float mctr1 = 0, cmctr1 = 0, ftctr1 = 0, inctr1 = 0, ydctr1 = 0;

void setup() {
	lcd.begin(16,2);
	pinMode(measurebtn, INPUT);
	pinMode(ssbtn, INPUT);
	pinMode(resetbtn, INPUT);
        Serial.begin(9600);
        lcd.print("LOADING..");
        lcd.createChar(0, p20);
        lcd.createChar(1, p40);
        lcd.createChar(2, p60);
        lcd.createChar(3, p80);
        lcd.createChar(4, p100);
          lcd.setCursor(0, 1);
  lcd.print("                ");
  for (int i = 0; i<16; i++)
  {
    for (int j = 0; j<5; j++)
    {
      lcd.setCursor(i,1);
      lcd.write(j);
      delay(50);
    }
  }
        lcd.clear();
        lcd.setCursor(0,0); lcd.print("0.00");
        lcd.setCursor(0,1); lcd.print("YARDS");
}


void loop() {
measurectr = digitalRead(measurebtn);
if (measurectr == HIGH && measurectr != prevmeasure){
  lcd.clear();
  ctr2 += 1;
  ctr = ctr2 % 5; 
  Serial.print("count: ");
  Serial.println(ctr);
  Serial.print("counter: ");
  Serial.println(ctr2);
  prevmeasure = measurectr;
  switch(ctr){
	case 1:	mctr1 = pctr1 / 100;
                lcd.setCursor(0,0);
		lcd.print(mctr1);
                lcd.setCursor(0,1);
		lcd.print("METERS");
		break;
	case 2:	cmctr1 = pctr1;
                lcd.setCursor(0,0);
		lcd.print(cmctr1);
                lcd.setCursor(0,1);
 	        lcd.print("CENTIMETERS");
		break;
	case 3:	ftctr1 = (pctr1 / 100) * 3.28;
                lcd.setCursor(0,0);
		lcd.print(ftctr1);
                lcd.setCursor(0,1);
		lcd.print("FEET");
		break;
	case 4:	inctr1 = ((pctr1 /100) * 3.28) * 12;
                lcd.setCursor(0,0);
		lcd.print(inctr1);
                lcd.setCursor(0,1);
		lcd.print("INCHES");
		break;
	case 0:	ydctr1 = ((pctr1 /100) * 3.28) / 3;
                lcd.setCursor(0,0);
		lcd.print(ydctr1);
                lcd.setCursor(0,1);
		lcd.print("YARDS");
               	break;}
}
if (measurectr == LOW && measurectr != prevmeasure) {
  prevmeasure = measurectr;
}


ssctr = digitalRead(ssbtn);
if (ssctr == HIGH && ssctr != prevss){
  ssctr++;
  prevss = ssctr;
  tripState = digitalRead(sensorPin);
  if (tripState == HIGH && tripState != prevsensor){
        lcd.clear();
	pctr++;
        pctr1 = pctr * 1.00;
        prevsensor = tripState;
        switch(ctr){
	case 1:	mctr1 = pctr1 / 100;
                lcd.setCursor(0,0);
		lcd.print(mctr1);
                lcd.setCursor(0,1);
		lcd.print("METERS");
		break;
	case 2:	cmctr1 = pctr1;
                lcd.setCursor(0,0);
		lcd.print(cmctr1);
                lcd.setCursor(0,1);
 	        lcd.print("CENTIMETERS");
		break;
	case 3:	ftctr1 = (pctr1 / 100) * 3.28;
                lcd.setCursor(0,0);
		lcd.print(ftctr1);
                lcd.setCursor(0,1);
		lcd.print("FEET");
		break;
	case 4:	inctr1 = ((pctr1 /100) * 3.28) * 12;
                lcd.setCursor(0,0);
		lcd.print(inctr1);
                lcd.setCursor(0,1);
		lcd.print("INCHES");
		break;
	case 0:	ydctr1 = ((pctr1 /100) * 3.28) / 3;
                lcd.setCursor(0,0);
		lcd.print(ydctr1);
                lcd.setCursor(0,1);
		lcd.print("YARDS");
               	break;}
        Serial.print("measure: ");
        Serial.println(pctr);
        Serial.print("tripstate: ");
        Serial.println(tripState);	
	digitalWrite(ledPin, HIGH);
  }
  if (tripState == LOW && tripState != pctr){
	prevsensor = tripState;
	digitalWrite(ledPin, LOW);
  }
}

if (ssctr == LOW && ssctr != prevss){
	prevss = ssctr;
}

}

I need to save the variable ctr and any of the values saved in the mctr1/cmctr1/ftctr1/inctr1/ydctr1 in the EEPROM and retrieve them at the initial reset or start of the Arduino.

Guys, please help me with this. Thanks. Its a pleasure to read your replies in here. 8)

Please modify your code and change the quote tags in code tags, makes it much better readable. (There is a known bug in the IDE, I know)

Okay, my problem is I cannot think of any logic that can save data on the Arduino's EEPROM with my program.

Have you worked through the - http://www.arduino.cc/en/Reference/EEPROM -

This is what I did...

#include <LiquidCrystal.h>
#include <EEPROM.h>

LiquidCrystal lcd(12,11,5,4,3,2);

byte p20[8] = {
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};
byte p40[8] = {
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
};
byte p60[8] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
};
byte p80[8] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
};
byte p100[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

const int measurebtn = 7;
const int ssbtn = 6;
const int resetbtn = 9;
const int ledPin = 13;
const int sensorPin = 8;

int ext = 0;
int cctr = 0;
int sctr = 0;
int pctr = 0;
int ctr;
int tripState = 0;
float pctr1 = 0;
float measure = 0;
int measurectr = 0;
int prevmeasure = 0;
int ssctr = 0;
int prevss = 0;
int resetctr = 0;
int prevreset = 0;
int prevsensor = 0;
int ctr2 = 5;
float mctr1, cmctr1, ftctr1, inctr1, ydctr1;

void setup() {
	lcd.begin(16,2);
	pinMode(measurebtn, INPUT);
	pinMode(ssbtn, INPUT);
	pinMode(resetbtn, INPUT);
        Serial.begin(9600);
        lcd.print("LOADING..");
        lcd.createChar(0, p20);
        lcd.createChar(1, p40);
        lcd.createChar(2, p60);
        lcd.createChar(3, p80);
        lcd.createChar(4, p100);
        lcd.setCursor(0, 1);
  	lcd.print("                ");
	for (int i = 0; i<16; i++){
	    for (int j = 0; j<5; j++){
	      lcd.setCursor(i,1);
	      lcd.write(j);
	      delay(50);
	    }
	}
        lcd.clear();
        ctr = EEPROM.read(0)
	switch(ctr){
	case 1:	mctr1 = EEPROM.read(1);
		lcd.setCursor(0,0);
		lcd.print(mctr1);
		lcd.setCursor(0,1);
		lcd.print("METERS");
		break;
	case 2:	cmctr1 = EEPROM.read(1);
		lcd.setCursor(0,0);
		lcd.print(cmctr1);
		lcd.setCursor(0,1);
		lcd.print("CENTIMETERS");
		break;
	case 3:	ftctr1 = EEPROM.read(1);
		lcd.setCursor(0,0);
		lcd.print(ftctr1);
		lcd.setCursor(0,1);
		lcd.print("FEET");
		break;
	case 4:	inctr1 = EEPROM.read(1);
		lcd.setCursor(0,0);
		lcd.print(inctr1);
		lcd.setCursor(0,1);
		lcd.print("INCHES");
		break;
	case 0:	ydctr1 = EEPROM.read(1);
		lcd.setCursor(0,0);
		lcd.print(ydctr1);
		lcd.setCursor(0,1);
		lcd.print("YARDS");
		break;
	}
}


void loop() {


if (resetctr == HIGH && resetctr != prevreset){
	resetctr++;
	prevreset = resetctr;
	<IT SHOULD CLEAR THE EEPROM IN THIS FUNCTION>
}

if (resetctr == LOW && resetctr != prevreset){
	prevreset = resetctr;
}

measurectr = digitalRead(measurebtn);
if (measurectr == HIGH && measurectr != prevmeasure){
  lcd.clear();
  ctr2 += 1;
  ctr = ctr2 % 5; 
  Serial.print("count: ");
  Serial.println(ctr);
  Serial.print("counter: ");
  Serial.println(ctr2);
  prevmeasure = measurectr;
  switch(ctr){
	case 1:	mctr1 = pctr1 / 100;
                lcd.setCursor(0,0);
		lcd.print(mctr1);
                lcd.setCursor(0,1);
		lcd.print("METERS");
		break;
	case 2:	cmctr1 = pctr1;
                lcd.setCursor(0,0);
		lcd.print(cmctr1);
                lcd.setCursor(0,1);
 	        lcd.print("CENTIMETERS");
		break;
	case 3:	ftctr1 = (pctr1 / 100) * 3.28;
                lcd.setCursor(0,0);
		lcd.print(ftctr1);
                lcd.setCursor(0,1);
		lcd.print("FEET");
		break;
	case 4:	inctr1 = ((pctr1 /100) * 3.28) * 12;
                lcd.setCursor(0,0);
		lcd.print(inctr1);
                lcd.setCursor(0,1);
		lcd.print("INCHES");
		break;
	case 0:	ydctr1 = ((pctr1 /100) * 3.28) / 3;
                lcd.setCursor(0,0);
		lcd.print(ydctr1);
                lcd.setCursor(0,1);
		lcd.print("YARDS");
               	break;}
  EEPROM.write(0,ctr);
  switch(ctr){
  case 1:	EEPROM.write(1,mctr1);
		break;
  case 2:	EEPROM.write(1,cmctr1);
		break;
  case 3:	EEPROM.write(1,ftctr1);
		break;
  case 4:	EEPROM.write(1,inctr1);
		break;
  case 0:	EEPROM.write(1,ydctr1);
		break;
  }
}
if (measurectr == LOW && measurectr != prevmeasure) {
  prevmeasure = measurectr;
}


ssctr = digitalRead(ssbtn);
if (ssctr == HIGH && ssctr != prevss){
  ssctr++;
  prevss = ssctr;
  tripState = digitalRead(sensorPin);
  if (tripState == HIGH && tripState != prevsensor){
        lcd.clear();
	pctr++;
        pctr1 = pctr * 1.00;
        prevsensor = tripState;
        switch(ctr){
	case 1:	mctr1 = pctr1 / 100;
                lcd.setCursor(0,0);
		lcd.print(mctr1);
                lcd.setCursor(0,1);
		lcd.print("METERS");
		break;
	case 2:	cmctr1 = pctr1;
                lcd.setCursor(0,0);
		lcd.print(cmctr1);
                lcd.setCursor(0,1);
 	        lcd.print("CENTIMETERS");
		break;
	case 3:	ftctr1 = (pctr1 / 100) * 3.28;
                lcd.setCursor(0,0);
		lcd.print(ftctr1);
                lcd.setCursor(0,1);
		lcd.print("FEET");
		break;
	case 4:	inctr1 = ((pctr1 /100) * 3.28) * 12;
                lcd.setCursor(0,0);
		lcd.print(inctr1);
                lcd.setCursor(0,1);
		lcd.print("INCHES");
		break;
	case 0:	ydctr1 = ((pctr1 /100) * 3.28) / 3;
                lcd.setCursor(0,0);
		lcd.print(ydctr1);
                lcd.setCursor(0,1);
		lcd.print("YARDS");
               	break;}
          EEPROM.write(0,ctr);
	  switch(ctr){
	  case 1:	EEPROM.write(1,mctr1);
			break;
	  case 2:	EEPROM.write(1,cmctr1);
			break;
	  case 3:	EEPROM.write(1,ftctr1);
			break;
	  case 4:	EEPROM.write(1,inctr1);
			break;
	  case 0:	EEPROM.write(1,ydctr1);
			break;
	  }	
	digitalWrite(ledPin, HIGH);
  }
  if (tripState == LOW && tripState != pctr){
	prevsensor = tripState;
	digitalWrite(ledPin, LOW);
  }
}

if (ssctr == LOW && ssctr != prevss){
	prevss = ssctr;
}

}

This should how it works:

  1. It should flash on the LCD the saved "ctr" and any of the ff. (mctr1/cmctr1/ftctr1/inctr1/ydctr1) on the void setup() function...
  2. Then the "resetbtn" (Reset button) should clear the EEPROM or the saved memory.
  3. Everytime the "ssbtn", "measurebtn" or "sensorPin" goes HIGH, it should WRITE on the EEPROM to save the values of "ctr" and any of the ff. (mctr1/cmctr1/ftctr1/inctr1/ydctr1).

And the turnout...

  1. It doesn't display the saved memory. Though I don't know if the EEPROM can save (write) a floating value, or it is the addressing or whatever is the mistake.
  2. I don't know how to clear. I used the clear() function of the EEPROM and my thing doesn't work.

It wastes everyone's time when you post code that won't even compile.

        ctr = EEPROM.read(0)

Don't you think a ; might be useful?

Though I don't know if the EEPROM can save (write) a floating value, or it is the addressing or whatever is the mistake.

The only basic function for writing to EEPROM allows you to write a single byte. Writing ints, floats, structs, etc. is possible, though. Search for EEPROM_writeAnything.

You could do this yourself, using a union to union a byte array and a float. Set the float and write the 4 bytes to 4 different addresses. Do the reverse on read.

The only way to "clear" EEPROM is to write the default value (0xFF) back there.

Will do...

Is it possible to write and write values to EEPROM with the same address of the variable?

For example, when I press "measurebtn", it writes into EEPROM address 1, then if I press again the "measurebtn", can I overwrite the EEPROM address 1 with the new value without clearing the EEPROM?

"can I overwrite the EEPROM address 1 with the new value without clearing the EEPROM"
Yes. It will just store the last value written in. Acts like slow RAM, that's all.