Go Down

Topic: Suppression de Delay() (Read 101 times) previous topic - next topic

Mouldolas

Bonjour.

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

Code: [Select]
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 :

Code: [Select]
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.

funkTLS

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)

J-M-L

#2
Apr 16, 2019, 03:51 pm Last Edit: Apr 16, 2019, 03:52 pm by J-M-L
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)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

Si le code ne fait que ça, inutile d'enlever les delay...
Sinon, essaye de remplacer
Code: [Select]
    if (temps - millis() >= 500) {
      Serial.println(phrase.substring(i, i + 14));
      temps = millis();
    }
par
Code: [Select]
    while (temps - millis() >= 500) { }  // <-- c'est équivalent à un delay
    Serial.println(phrase.substring(i, i + 14));
    temps = millis();


Tu devrais déplacer
Code: [Select]
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

Code: [Select]

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.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

dbrion06

C'est encore plus compliqué:
il y a deux boucles, donc il faut définir (au moins) 2 états
Code: [Select]

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



Mouldolas

Merci pour vos réponses  :)

J-M-L

#6
Apr 16, 2019, 04:34 pm Last Edit: Apr 16, 2019, 04:35 pm by J-M-L
Sinon, essaye de remplacer...
Juste pour la précision:
Code: [Select]
while (temps - millis() >= 500) { }  // <-- c'est équivalent à un delay
n'est pas correct... il faut bien sûr écrire
Code: [Select]
    while (millis() - temps < 500) { }  // <-- c'est équivalent à un delay
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

lesept

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 !
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up