Suppression de Delay()

Bonjour.

Je souhaite remplacer les delay() du code suivant pour les remplacer par millis().

String phrase = "Phrase deroulante de test";
byte longPhrase;


void setup() {
  Serial.begin(9600);
}

void loop() {

  longPhrase = phrase.length();

  for (int i = 0 ; (i + 14) <= longPhrase; i++) {

    delay(500);

    Serial.println(phrase.substring(i, i + 14));

  }

  for (int i = (longPhrase - 14) ; i >= 0; i--) {

    delay(500);

    Serial.println(phrase.substring(i, i + 14));

  }
}

J’ai essayé ça :

String phrase = "Phrase deroulante de test";

byte longPhrase;

unsigned long temps = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {

  longPhrase = phrase.length();

  for (int i = 0 ; (i + 14) <= longPhrase; i++) {

    if (temps - millis() >= 500) {

      Serial.println(phrase.substring(i, i + 14));

      temps = millis();
    }
  }

  for (int i = (longPhrase - 14) ; i >= 0; i--) {

    if (temps - millis() >= 500) {

      Serial.println(phrase.substring(i, i + 14));

      temps = millis();
    }
  }
}

Mais ça ne marche pas.

Mouldolas: Mais ça ne marche pas.

Encore ce fameux problème :'(

Posez-vous la question de ce que vaut la variable "temps" aux différentes étapes de votre code ;)

(ou demandez à un Serial.println() de le faire pour vous.. c'est comme ça qu'on débuggue)

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")
}

Merci pour vos réponses :)

lesept:
Sinon, essaye de remplacer…

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

Les deux boucles c'est pour faire défiler dans les deux sens : j'ai mis une variable (sens) pour le prendre en compte

@J-M-L : yes, oups !