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?
1 Answer 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;
-
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– Andreas2019年12月07日 11:56:49 +00:00Commented 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– Majenko2019年12月07日 12:07:51 +00:00Commented Dec 7, 2019 at 12:07
-
I see. I will try and use a different approach then.Andreas– Andreas2019年12月07日 13:45:43 +00:00Commented Dec 7, 2019 at 13:45
EEPROM.writeInt()
andEEPROM.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.