0

I'm trying to build a random string, save it to EEPROM as int, then read it back and output it.
If I give it a predefined string then it works fine. But Something is wrong with the random string generator.

  String output;
  char letter;

  String mystr=""; //"ABCabc123..";
  String characters = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz";
  String numbers = "0123456789";
  String other = "<>!.,()?|=&%¤#";

  // add random characters to empty string
  for(int i=0 ; i < 12 ; i++){
    mystr += characters[random(0, characters.length())];
  }
  // add two numbers, one other and two more characters
  mystr += numbers[random(0, numbers.length())];
  mystr += numbers[random(0, numbers.length())];
  mystr += other[random(0, other.length())];
  mystr += characters[random(0, characters.length())];
  mystr += characters[random(0, characters.length())];

  // loop the string and place one character in each EEPROM address
  for(int i=0 ; i < mystr.length() ; i++)
  {
    EEPROM.writeInt( i,mystr[i] );
  }

  // read the string back from EEPROM
  for(int i=0 ; i < 17 ; i++){
    letter = EEPROM.readInt(i);
    output += letter;
  }

If I run the code output will be "H". Every time.
If I use the predefined string "ABCabc123.." then it works correct.

What am I doing wrong with building the mystr?

2
  • EEPROM.writeInt() and EEPROM.readInt() don't look like standard Arduino functions. Where did you get them? Also note that “¤” is not an ASCII character. It takes two bytes if you write it in UTF-8. Commented Dec 7, 2019 at 11:03
  • @EdgarBonet I can't include EEPROM.h . It's missing from Digispark boards I guess. I found EEPROM.h and downloaded it, but when I included it, I got an error that Debug.h was missing. So I just gave up on that and found anothter library. Commented Dec 7, 2019 at 11:45

1 Answer 1

1

Your first mistake is to use String. Don't. Instead use a char array.

char mystr[18]; // Room for 17 characters plus the NULL terminating character

Your string constants should also be char arrays, not String variables. And better to put them in PROGMEM:

const char characters[] PROGMEM = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz";
const char numbers[] PROGMEM = "0123456789";
const char other[] PROGMEM = "<>!.,()?|=&%¤#";

Now filling your target array becomes:

for(int i=0 ; i < 12 ; i++){
  mystr[i] = pgm_read_byte_near(characters + random(0, 50));
}

mystr[12] = pgm_read_byte_near(numbers + random(0, 10));
mystr[13] = pgm_read_byte_near(numbers + random(0, 10));
mystr[14] = pgm_read_byte_near(other + random(0, 14));
mystr[15] = pgm_read_byte_near(characters + random(0, 50));
mystr[16] = pgm_read_byte_near(characters + random(0, 50));
mystr[17] = 0; // Don't forget the NULL...

Your second problem is the use of EEPROM.writeInt and EEPROM.readInt. Those are for writing integer values, not characters. Instead just use EEPROM.read and EEPROM.write:

for (int i = 0; i < 17; i++) {
    EEPROM.write(i, mystr[i]);
}

Then to read back:

for (int i = 0; i < 17; i++) {
    mystr[i] = EEPROM.read(i);
}
// And don't forget to terminate the string...
mystr[17] = 0;
3
  • I can't get this working. First off all, the random does not seem to change between runs. I get the exact same string each time, only if I change something do I get a different result. When I output the array, character by character I get a shorter string than it should be. 7 characters Åo-Åyäv And two of those is not included in the character char. Commented Dec 7, 2019 at 11:56
  • Random isn't random, no. It's pseudo random. You have to set the "seed" to change the "random" sequence. Commented Dec 7, 2019 at 12:07
  • I see. I will try and use a different approach then. Commented Dec 7, 2019 at 13:45

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.