On stocke en PROGMEM des suite de octets. La façon dont vous les interpréter ensuite est à votre choix. Comme c’est décidé à la compilation, il faut bien entendu que ces valeurs soient connues à ce moment là
Pour l’anglais je n’ai jamais vu Google traduire LOW par HAUT.... vraiment surprenant. Ensuite ça reste de l’open source donc on peut soulever le capot et mettre les mais dans le cambouis si on veut explorer plus.
Tenez voici un exemple qui illustre comment on traitre des pointeurs, une structure etc
#include <avr/pgmspace.h>
enum situation_t : uint8_t {single, couple, RIP};
// on met 3 cSrting en PROGMEM qui correspondent à la situation
const char s0[] PROGMEM = "single";
const char s1[] PROGMEM = "couple";
const char s2[] PROGMEM = "rest in peace";
// on met l'adresse de ces cStrings en PROGMEM
const char* const descriptionSituation[] PROGMEM = {s0, s1, s2};
// on définit une structure dont le prénom est un pointeur constant
struct person_t {
const char * firstName;
const uint8_t d;
const uint8_t m;
const uint16_t y;
situation_t situation;
};
// On définit des cString en PROGMEM pour les prénoms
const char auguste[] PROGMEM = "Auguste";
const char camille[] PROGMEM = "Camille";
const char victor[] PROGMEM = "Victor";
const char juliette[] PROGMEM = "Juliette";
const char someone[] PROGMEM = "Mr Unknown";
// on met toute la structure en PROGMEM, dont le pointeur sur le prénom
const person_t population[] PROGMEM =
{
{auguste, 12, 11, 1840, RIP},
{camille, 8, 12, 1864, RIP},
{victor, 26, 2, 1802, RIP},
{juliette, 10, 4, 1806, RIP},
{someone, 1, 1, 2000, single}
};
// on peut calculer à la compilation le nombre d'éléments comme d'habitude
const uint16_t nbElements = sizeof(population) / sizeof(population[0]);
void setup() {
Serial.begin(115200);
for (const auto& member : population) // on va parcourir le tableau
{
Serial.println((const __FlashStringHelper *) pgm_read_word(&(member.firstName))); // on va chercher le pointeur et on cast pour que print commprenne que c'est en flash
Serial.print (pgm_read_byte_near(&(member.d)) ); // cast optionnel ici car pgm_read_byte_near va déjà retourner un uint8_t
Serial.write("/");
Serial.print (pgm_read_byte_near(&(member.m)) ); // cast optionnel ici car pgm_read_byte_near va déjà retourner un uint8_t
Serial.write("/");
Serial.println((uint16_t) pgm_read_word_near(&(member.y)) ); // cast optionnel ici car pgm_read_word_near va déjà retourner un uint16_t
Serial.println((const __FlashStringHelper *) pgm_read_word(&(descriptionSituation[(uint8_t) pgm_read_byte_near(&(member.situation))])));
Serial.println(F("------------------------------"));
}
}
void loop() {}
le moniteur série (à 115200 bauds) affichera
[color=purple]
Auguste
12/11/1840
rest in peace
------------------------------
Camille
8/12/1864
rest in peace
------------------------------
Victor
26/2/1802
rest in peace
------------------------------
Juliette
10/4/1806
rest in peace
------------------------------
Mr Unknown
1/1/2000
single
------------------------------
[/color]