Il existe trois types de mémoires dans les microcontrôleurs utilisés dans les cartes Arduino. (Atméga 168 / 328 etc …)
La mémoire SRAM ne peut contenir que très peu de données 1Ko ou 2Ko selon le microcontrôleur. Si nous devons accéder à un tableau de grande dimension, nous serons vite limité. L'espace de stockage de la mémoire FLASH peut être utilisé, il faut cependant garder à l'esprit que ne seront stocké que des données non modifiables.
Pour forcer le compilateur à stocker le tableau dans l'espace programme, il faut utiliser le mot-clef PROGMEM lors de la déclaration de la donnée.
const uint8_t tableau[tailleTableau] PROGMEM = {0, 0, 0, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 2};
Cet attribut est déclaré dans le fichier d'en-tête, <avr/pgmspace.h>, pour cela il faut utiliser la directive include
#include <avr/pgmspace.h>
Pour accéder à ces données, il existe une méthode, prgm_read_byte() :
byte valeur = pgm_read_byte(&tableau[compteur]);
Pour les entiers qui sont stockés sur deux octets il est nécessaire d'utiliser la méthode pgm_read_word.
Le paramètre passé à cette méthode est une adresse, d'où le caractère & avant le nom de la donnée.