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?

asked Dec 7, 2019 at 10:06
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;
answered Dec 7, 2019 at 10:47
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

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.