faut pas mettre le test sur millis() dans la boucle for. il faut utiliser la loop() comme boucle et tester à chaque tour de loop() si c'est le bon moment pour faire une action (donc le i devra être une variable qui persiste entre 2 appels à la loop() --> soit variable globale, soit static)
Si le code ne fait que ça, inutile d'enlever les delay...
Sinon, essaye de remplacer
if (temps - millis() >= 500) {
Serial.println(phrase.substring(i, i + 14));
temps = millis();
}
par
while (temps - millis() >= 500) { } // <-- c'est équivalent à un delay
Serial.println(phrase.substring(i, i + 14));
temps = millis();
Tu devrais déplacer longPhrase = phrase.length();dans le setup, inutile de le recalculer à chaque fois
Ceci dit, ma proposition n'apporte pas grand chose si tu veux que ton code fasse autre chose qu'un affichage déroulant (c'est le sens de la réponse de J-M-L, que je viens de voir en écrivant). Dans ce cas, il faudrait revoir la structure du code : ne pas faire une boucle for mais utiliser un compteur de position à afficher, qui irait de 0 à longPhrase - 14 dans les deux sens
String phrase = "Phrase deroulante de test";
byte longPhrase;
unsigned long temps = 0;
int position = 0;
int sens = 1;
void setup() {
Serial.begin(9600);
longPhrase = phrase.length();
}
void loop () {
if (millis() - temps >= 500) {
temps = millis();
Serial.println(phrase.substring(position, position + 14));
position += sens;
if (position <0) {
sens = 1;
position = 0;
} else if (position > longPhrase - 14) {
sens = -1;
position = longPhrase - 14;
}
}
}
A tester, je n'ai pas vérifié que ça compile ni que ça marche.
C'est encore plus compliqué:
il y a deux boucles, donc il faut définir (au moins) 2 états
#define BOUCLE1 0
#define BOUCLE2 1
uint8_t etatbcl = BOUCLE1 ;
void loop(){
if (BOUCLE1 == etatbcl ) {
// boucle1
}
if (BOUCLE2 == etatbcl ) {
// boucle2
}
logique pour modifier etatbcl (fin de la "boucle") et pour passer de i à i+1 ( balayage à l'interieur d'une "boucle")
}
Juste pour la précision:while (temps - millis() >= 500) { } // <-- c'est équivalent à un delay
n'est pas correct... il faut bien sûr écrire while (millis() - temps < 500) { } // <-- c'est équivalent à un delay