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. 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.
    – Andreas
    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.
    – Andreas
    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.
    – Majenko
    Dec 7, 2019 at 12:07
  • I see. I will try and use a different approach then.
    – Andreas
    Dec 7, 2019 at 13:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.