oui, "que" 5 fois... donc probablement 5 zones avec des "trous" dans la RAM à la fin
D'autant plus que par exemple :
String erreur = F("Valeur incorrecte, saisir entre ");
erreur.concat(mini);
erreur.concat(" et ");
erreur.concat(maxi);
Serial.println(erreur);
là le F() ne sert à rien, une String c'est de toutes manières de la mémoire dynamique, et ensuite tu va à chaque concat faire allouer un peu plus de ram pour allonger la String, alors qu'il n'y en a aucun besoin, tu pourrais faire directement :
Serial.print(F("Valeur incorrecte, saisir entre "));
Serial.print(mini);
Serial.print(F(" et "));
Serial.println(maxi);
Et la même chose est applicable à plein d'endroits dans ton code... et pour se passer de String, il existe déjà des fonctions standard du C pour manipuler des chaines.
Si tu veux aussi rester "dans les règles del'art" il faut éviter d'utiliser goto.
Pour ce qui est de l'utilisation de la ram, rajoute cette fonction dans ton code :
//from http://jeelabs.org/2011/05/22/atmega-memory-use/
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Et de temps en temps fais un Serial.println(freeRam());, par exemple à la fin de saisir(), puis dans la loop(), etc.
ensuite fais les modifs pour se passer de String au maximum et vois comment ça évolue, ça risque d'être instructif.