Arduino makes it pretty easy to store & use character strings, but those strings compete with your variables, so you can’t do as much. Here’s how to put big strings into read-only program memory and use them.
Lots of sketches can have big strings in them. Maybe you’ve built a little command-line interface or you’re storing small web pages (for net-connected Arduinos). Normally you do something like this:
char hellostr[] = "<html><head><title>hello world</title></head>" "<body><p align=center><h1>hello world</h1></p> "</body></html>"; // and then sometime later Serial.println( hellostr );
The problem with this is that “hellostr” is stored in RAM along with your variables. The ATmega chip in Arduino only has 1kB of RAM. If your code is getting complex, and you’re using big strings, and lots of libraries, you may start having mysterious problems. Arduino can’t warn you if your sketch starts using too much RAM.
Instead, you can use PROGMEM, or PROGram MEMory, to store your strings. That is, the flash ROM memory that your code lives in. Using PROGMEM strings can be tricky, but here’s a little function called “printProgStr()” to make it almost as easy.
const char hellostr[] PROGMEM = "..."; // notice added 'const' and 'PROGMEM' // given a PROGMEM string, use Serial.print() to send it out void printProgStr(const prog_char str[]) { char c; if(!str) return; while((c = pgm_read_byte(str++))) Serial.print(c,BYTE); } // and then at some point printProgStr( hellostr );
If you have another use for the string that isn’t “Serial.print()”, just create your own function and put whatever per-character handling function in there instead.
I use this:
char p_buffer[80];
#define P(str) (strcpy_P(p_buffer, PSTR(str)), p_buffer)
Make sure p_buffer is large enough for the largest string
Then just wrap all your static strings in P(),
Like this:
Serial.print(P(“I am a string which is saved in PROGMEM”))