Go Down

Topic: Fonction millis l'utiliser comme delay pour l'exéc ligne par ligne avec delay (Read 737 times) previous topic - next topic

mickynuts

Bonjour bonjour,

Voilas j'ai essayé mon code avec différents compteurs, avec un seul, avec aussi une intervale. Mais ça ne change rien. J'ai essayé de comprendre en lisant les réponses sur internet, sur Arduino, et avec diverses recherches et l'exemple BlinkWithoutDelay. Sans parvenir à ce que je veux. Étant totalement débutant, comment arrivé à faire que mon programme execute mes instructions ligne après ligne comme avec l'option delay.
Voici le dernier code sur lequel je me suis arreté. il compile mais le resultat de mon animation est la même et ne prend pas en compte le delay imposé. Le même sketch, sans les IF et avec Delay fonctionne comme je veux. Je sais que je ne comprend pas plein de chose. Si vous pouvez m'aider avec seulement le même exemple mais avec 2 instructions dans la boucle loop. Ce serai super. En même temps ça permetterai à d'autres débutants de comprendre. J'ai peut être pas compris les principes mais soyez indulgent. Merci de votre aide.
Code: [Select]

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 7, 6, 5, 4);
#include <Arduino.h>
#include <Wire.h>
unsigned long currentMillis =0;
unsigned long previousMillis1=0;
unsigned long previousMillis2=0;
unsigned long previousMillis3=0;
unsigned long previousMillis4=0;
unsigned long previousMillis5=0;
unsigned long previousMillis6=0;
unsigned long previousMillis7=0;
unsigned long previousMillis8=0;
unsigned long previousMillis9=0;
unsigned long previousMillis10=0;
unsigned long previousMillis11=0;
unsigned long previousMillis12=0;
unsigned long previousMillis13=0;
unsigned long previousMillis14=0;
unsigned long previousMillis15=0;
unsigned long previousMillis16=0;
unsigned long previousMillis17=0;
unsigned long previousMillis18=0;
unsigned long previousMillis19=0;
unsigned long previousMillis20=0;
unsigned long previousMillis21=0;
unsigned long previousMillis22=0;
unsigned long previousMillis23=0;
unsigned long previousMillis24=0;
unsigned long previousMillis25=0;
unsigned long previousMillis26=0;
unsigned long previousMillis27=0;
unsigned long previousMillis28=0;
unsigned long previousMillis29=0;
unsigned long previousMillis30=0;
unsigned long previousMillis31=0;



void setup() {

  display.begin();
  display.setContrast(55);
  display.clearDisplay();   // clears the screen and buffer

}


void loop() {
 unsigned long currentMillis = millis();
 if((unsigned long)(currentMillis - previousMillis1) >= 100) {
  display.drawLine(42, 10, 42, 0, BLACK);
    display.display();
      previousMillis1 = millis;   
}
 if((unsigned long)(currentMillis - previousMillis1) >= 100) {   
   display.drawLine(42, 10, 47, 0, BLACK);
    display.display();
      previousMillis2 = previousMillis1;
 }
  if((unsigned long)(currentMillis - previousMillis2) >= 100) { 
  display.drawLine(42, 10,52 ,0 , BLACK);
    display.display();
      previousMillis3 = previousMillis2;
 }
 if((unsigned long)(currentMillis - previousMillis3) >= 100) {
  display.drawLine(42, 10, 52, 5, BLACK);
    display.display();
      previousMillis4 = previousMillis3;
 }
if((unsigned long)(currentMillis - previousMillis4) >= 100) {
  display.drawLine(42, 10,52 ,10 , BLACK);
    display.display();
      previousMillis5 = previousMillis4;
 } 
if((unsigned long)(currentMillis - previousMillis5) >= 100) {
  display.drawLine(42, 10, 52, 15, BLACK);
    display.display();
      previousMillis6 = previousMillis5;
}
if((unsigned long)(currentMillis - previousMillis6) >= 100) {
  display.drawLine(42, 10,52 ,20 , BLACK);
    display.display();
      previousMillis7 = previousMillis6;

if((unsigned long)(currentMillis - previousMillis7) >= 100) {
  display.drawLine(42, 10,47 ,20 , BLACK);
    display.display();
      previousMillis8 = previousMillis7;
}
if((unsigned long)(currentMillis - previousMillis8) >= 100) {
  display.drawLine(42, 10, 42, 20, BLACK);
    display.display();
      previousMillis9 = previousMillis8;
}
if((unsigned long)(currentMillis - previousMillis9) >= 100) {
  display.drawLine(42, 10,37 ,20 , BLACK);
    display.display();
      previousMillis10 = previousMillis9;
}
if((unsigned long)(currentMillis - previousMillis10) >= 100) {
  display.drawLine(42, 10, 32, 20, BLACK);
    display.display();
      previousMillis11 = previousMillis10;
}
if((unsigned long)(currentMillis - previousMillis11) >= 100) {
  display.drawLine(42, 10,32 ,15 , BLACK);
    display.display();
      previousMillis12 = previousMillis11;
}
if((unsigned long)(currentMillis - previousMillis12) >= 100) {
  display.drawLine(42, 10,32 ,10 , BLACK);
    display.display();
      previousMillis13 = previousMillis12;
}
if((unsigned long)(currentMillis - previousMillis13) >= 100) {
  display.drawLine(42, 10,32 ,5 , BLACK);
    display.display();
      previousMillis14 = previousMillis13;
}
if((unsigned long)(currentMillis - previousMillis14) >= 100) {
  display.drawLine(42, 10,32 ,0 , BLACK);
    display.display();
      previousMillis15 = previousMillis14;
}
if((unsigned long)(currentMillis - previousMillis15) >= 100) {
  display.drawLine(42, 10,37 ,0 , BLACK);
    display.display();
      previousMillis16 = previousMillis15;
}
if((unsigned long)(currentMillis - previousMillis16) >= 100) {
//Reverse
  display.drawLine(42, 10, 42, 0, WHITE);
    display.display();
      previousMillis17 = previousMillis16;
}
if((unsigned long)(currentMillis - previousMillis17) >= 100) {
  display.drawLine(42, 10, 47, 0, WHITE);
    display.display();
      previousMillis18 = previousMillis17;
}
if((unsigned long)(currentMillis - previousMillis18) >= 100) {
  display.drawLine(42, 10,52 ,0 , WHITE);
    display.display();
      previousMillis19 = previousMillis18;
}
if((unsigned long)(currentMillis - previousMillis19) >= 100) {
  display.drawLine(42, 10, 52, 5, WHITE);
    display.display();
      previousMillis20 = previousMillis19;
}
if((unsigned long)(currentMillis - previousMillis20) >= 100) {
  display.drawLine(42, 10,52 ,10 , WHITE);
    display.display();
      previousMillis21 = previousMillis20;
}
if((unsigned long)(currentMillis - previousMillis21) >= 100) {
  display.drawLine(42, 10, 52, 15, WHITE);
    display.display();
      previousMillis22 = previousMillis21;
}
if((unsigned long)(currentMillis - previousMillis22) >= 100) {
  display.drawLine(42, 10,52 ,20 , WHITE);
    display.display();
      previousMillis23 = previousMillis22;
}
if((unsigned long)(currentMillis - previousMillis23) >= 100) {
  display.drawLine(42, 10,47 ,20 , WHITE);
    display.display();
      previousMillis24 = previousMillis23;
}
if((unsigned long)(currentMillis - previousMillis24) >= 100) {
  display.drawLine(42, 10, 42, 20, WHITE);
    display.display();
      previousMillis25 = previousMillis24;
}
if((unsigned long)(currentMillis - previousMillis25) >= 100) {
  display.drawLine(42, 10,37 ,20 , WHITE);
    display.display();
      previousMillis25 = previousMillis26;
}
if((unsigned long)(currentMillis - previousMillis26) >= 100) {
  display.drawLine(42, 10, 32, 20, WHITE);
    display.display();
      previousMillis26 = previousMillis27;
}
if((unsigned long)(currentMillis - previousMillis27) >= 100) {
  display.drawLine(42, 10,32 ,15 , WHITE);
    display.display();
      previousMillis27 = previousMillis28;
}
if((unsigned long)(currentMillis - previousMillis28) >= 100) {
  display.drawLine(42, 10,32 ,10 , WHITE);
    display.display();
      previousMillis28 = previousMillis29;
}
if((unsigned long)(currentMillis - previousMillis29) >= 100) {
  display.drawLine(42, 10,32 ,5 , WHITE);
    display.display();
      previousMillis29 = previousMillis30;
}
if((unsigned long)(currentMillis - previousMillis30) >= 100) {
  display.drawLine(42, 10,32 ,0 , WHITE);
    display.display();
      previousMillis30 = previousMillis31;
  }
if((unsigned long)(currentMillis - previousMillis31) >= 100) {
  display.drawLine(42, 10,37 ,0 , WHITE);
    display.display();
      previousMillis1 = millis;
}
  }

kamill

Bonjour,

Il faut que tu utilises le même previousMillis pour tout les cas et faire varier la durée.
Il est plus judicieux de commencer à tester la durée la plus longue comme ceci:
Code: [Select]
void loop() {
  static unsigned long previousMillis = millis();
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= 3100) {
    display.drawLine(42, 10, 37 , 0 , WHITE);
    display.display();
    previousMillis = millis();
  }
  else if (currentMillis - previousMillis >= 3000) {
    display.drawLine(42, 10, 32 , 0 , WHITE);
    display.display();
  }

  // etc ...

  else if (currentMillis - previousMillis >= 100) {
    display.drawLine(42, 10, 42, 0, BLACK);
    display.display();
  }
}


Tu aurais tout intérêt à utiliser un index, et éventuellement un tableau pour faire évoluer ton tracé, ce qui éviterait cette série de if dupliqués.

mickynuts

Merci beaucoup.  En faite, je debut alors cette histoire de tableau...
On m'a aussi parlé sur Quora de faire une boucle for pour les mouvements également de tableau.  Et bien entendu de bien apprendre algorithmique.  Ce que je vais faire. Merci pour votre réponse qui va bien m'aider.

kamill

Il ne faut pas utiliser de boucle for. Tu vas bloquer ton programme donc dans ce cas ça ne sert à rien d'utiliser millis() autant utiliser delay()
Tu utilises un index que tu fais progresser toutes les 100ms et qui te sert à sélectionner l'élément de ton tableau.

mickynuts

Ok.
Question auriez vous un lien sur ce forum pour un tutoriel sur l'index et le tableau ?
Merci beaucoup.

kamill

Il faut que tu regardes les tableaux dans les cours C++. L'index (ou indice) est le numéro de l'élément dans le tableau.
Si tu veux je peux te donner un programme qui fait ta fonction avec un tableau, mais peut-être que tu préfères chercher plus par toi même.

mickynuts

Bah volontier si vous avez le temps  :) avec commentaire ce serai encore mieux :P pas le code complet juste quelque ligne comme ça je peux voir comment c'est structuré et je jetterais un oeil de toute facon sur le web. MERCI !

kamill

Je te mets le code complet car c'est difficile de mettre juste quelques lignes.
Code: [Select]
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 7, 6, 5, 4);

// structure qui défini une ligne
struct SLine
{
  int16_t x0;
  int16_t y0;
  int16_t x1;
  int16_t y1;
  uint16_t color;
};

// tableau des lignes
const SLine tabLine[] =
{
  42, 10, 42, 0, BLACK,
  42, 10, 47, 0, BLACK,
  42, 10, 52, 0, BLACK,
  42, 10, 52, 5, BLACK,
  42, 10, 52, 10, BLACK,
  42, 10, 52, 15, BLACK,
  42, 10, 52, 20, BLACK,
  42, 10, 47, 20, BLACK,
  42, 10, 42, 20, BLACK,
  42, 10, 37, 20, BLACK,
  42, 10, 32, 20, BLACK,
  42, 10, 32, 15, BLACK,
  42, 10, 32, 10, BLACK,
  42, 10, 32, 5, BLACK,
  42, 10, 32, 0, BLACK,
  42, 10, 37, 0, BLACK,
  42, 10, 42, 0, WHITE,
  42, 10, 47, 0, WHITE,
  42, 10, 52, 0, WHITE,
  42, 10, 52, 5, WHITE,
  42, 10, 52, 10, WHITE,
  42, 10, 52, 15, WHITE,
  42, 10, 52, 20, WHITE,
  42, 10, 47, 20, WHITE,
  42, 10, 42, 20, WHITE,
  42, 10, 37, 20, WHITE,
  42, 10, 32, 20, WHITE,
  42, 10, 32, 15, WHITE,
  42, 10, 32, 10, WHITE,
  42, 10, 32, 5, WHITE,
  42, 10, 32, 0, WHITE,
  42, 10, 37, 0, WHITE
};
const byte NBLINE = sizeof tabLine / sizeof tabLine[0];

void setup()
{
  Serial.begin(115200);

  display.begin();
  display.setContrast(60);
  display.clearDisplay();   // clears the screen and buffer
}

void loop()
{
  static byte nLine = 0;    // index dans le tableau de lignes
  static unsigned long previousMillis = millis();

  if (millis() - previousMillis >= 100)
  {
    previousMillis = millis();
    display.drawLine(tabLine[nLine].x0, tabLine[nLine].y0, tabLine[nLine].x1, tabLine[nLine].y1, tabLine[nLine].color);
    display.display();
    nLine++;    // passe à la ligne suivante
    if (nLine >= NBLINE)
      nLine = 0;
  }
}

Tu peux améliorer de code en divisant la taille de la table par 2 et en gérant la couleur indépendamment du tableau.

mickynuts

Merci infiniment. Pour ce code. Je vais tester ça demain et je te redis.  Merci pour ce temps passé à m'aider et avec ce  code documenté. 

mickynuts

Merci beaucoup ça fonctionne tip top. Je vais pouvoir avancer dans ce petit projets pour ma maman.
Voici ce que tu ma permis de réaliser jusque là.

c'est un gif que tu peux voir à l'adresse. Le code /img fonctionne pas ici url :
https://ibb.co/98N069J

Merci infiniment.  Je regarderais bien en detail ton code pour de future petit projet.


Go Up