Millis en remplacement de Delay pour un bouton.

Arduino - Millis

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à vous tous,

Je suis nouveau et je ne m'y connais pas du tout en programmation, mais j'essaie et j'aime ça !!!

Pour la réalisation de mon projet, j'ai pris des bouts de code à droit et à gauche et je tente vraiment de comprendre, cependant je suis arrivé à un blocage total avec la fonction millis.

Mon projet : La fonction "Play1" active un stepper moteur pendant un nombre de rotations défini, il prend une pause de 10 secondes et il recommence à l'infini à moins que j'appuie sur un bouton "(A5)" pour l'arrêter.

Mon problème : Tout fonctionne bien, cependant comme vous le savez la fonction "delay" bloque tout jusqu'à ce que son temps soit écoulé, et dans mon projet final le temps d'arrêt sera d'environ 2 minutes et je n'ai pas très envie d'appuyer sur le bouton (de type push button) pendant ces 2 minutes afin d'arrêter le processus. Voilà pourquoi j'aimerais remplacer la fonction "delay" par "millis", mais je n'y arrive tout simplement pas.

Pourriez-vous m'aider S.V.P !!!!!

Merci à l'avance

Voir : "void play1() // Sequence A"

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Requires the AFMotor library (https://github.com/adafruit/Adafruit-Motor-Shield-library)
// And AccelStepper with AFMotor support (https://github.com/adafruit/AccelStepper)
// Public domain!

#include <AccelStepper.h>
#include <AFMotor.h>

AF_Stepper moteur(100, 1);

int button = 0;

// you can change these to SINGLE or DOUBLE or INTERLEAVE or MICROSTEP!
void forwardstep() {  
  moteur.onestep(FORWARD, SINGLE);
}
void backwardstep() {  
  moteur.onestep(BACKWARD, SINGLE);
}

AccelStepper stepper(forwardstep, backwardstep); // use functions to step

void setup()
{  
   Serial.begin(9600);                       // set up Serial library at 9600 bps
   pinMode(18, OUTPUT);                      // Red Light "TASK RUN"
}

void loop()
{  
   control();                                // Buttons Keybard Set-Up     
}


void reverse() //Reverse 
{   
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, BACKWARD, SINGLE);   //Motor 300 Step, BACKWARD and Microtepping
        }
}

void reverse1frm() //Reverse 1 frame
{   
        digitalWrite(18, HIGH);               //Red light on      
        moteur.setSpeed(50);                  //Motor Speed 50 RPM
        moteur.step(1, BACKWARD, MICROSTEP);  //Motor 1 Step, Backward and Microtepping
        delay(250);                           //Repeat delay
        digitalWrite(18, LOW);                //Red light off  
}

void pause() //Free Motor
{
       digitalWrite(18, HIGH);                //Red light on           
       moteur.release();                      //Motor Free spin
       delay(250);                            //Repeat delay
       digitalWrite(18, LOW);                 //Red light off  
}

void play1() // Sequence A
{   
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(200);                 //Motor Speed 200 RPM
        moteur.step(300, FORWARD, SINGLE);    //Motor 300 Step, Forward and Microtepping
        delay(10000);                          //Stop 10 second
        }
}

void play2() // Sequence B
{
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, FORWARD, SINGLE);    //Motor 300 Step, Forward and Microtepping
        delay(10000);                          //Stop 10 second
        }
}

void forward1frm() //Forward 1 frame
{   
        digitalWrite(18, HIGH);               //Red light on      
        moteur.setSpeed(50);                  //Motor Speed 50 RPM
        moteur.step(1, FORWARD, MICROSTEP);   //Motor 1 Step, Forward and Microtepping
        delay(250);                           //Repeat delay
        digitalWrite(18, LOW);                //Red light off  
}

void forward() //Forward
{   
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, FORWARD, SINGLE);    //Motor 300 Step, Forward and Microtepping
        }
}

void error() //Wrong way !
{
       while(1)       //Infinite loop
       {
       digitalWrite(18, HIGH);                //Red light on           
       delay(250);                            //Repeat delay
       digitalWrite(18, LOW);                 //Red light off  
       delay(250);       //Repeat delay
       }
}

// Buttons Keyboard
int control()
{
  button = analogRead(14); 
  // Buttons values (10k Resistance): 509, 681, 766, 818, 852, 878, 895, 910 (1023 no button).
  if (button > 950) error; 
  if (button < 529 && button > 500) reverse();
  if (button < 700 && button > 650) reverse1frm();
  if (button < 790 && button > 750) pause();
  if (button < 835 && button > 800) play1();
  if (button < 865 && button > 840) play2();
  if (button < 883 && button > 870) forward1frm();
  if (button < 905 && button > 885) forward();
  else error; // when all others fail, return this...
}


//*********( THE END )***********

Édité par yahve

+0 -0
Auteur du sujet

Bonjour Eskimon !

Tout d'abord, félicitations pour ton livre sur Arduino (Premiers pas…), il est vraiment super, tellement d'heures de travail ! Une référence vraiment précieuse, merci beaucoup de l'avoir réalisé. (Pour ceux qu'il l'aurait manqué, voici le lien : Ebook Tutoriel Arduino )

Merci aussi pour ton lien, j'ai enfin réussi à faire faire une pause à mon moteur, pourtant j'avais regardé déjà plusieurs exemples, mais celle-ci m'a vraiment aidé. Il ne me manque plus qu'à trouver comment faire arrêter la séquence avec mon "push button". Probablement qu'il faudrait que je regarde du côté "Button State".

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Requires the AFMotor library (https://github.com/adafruit/Adafruit-Motor-Shield-library)
// And AccelStepper with AFMotor support (https://github.com/adafruit/AccelStepper)
// Public domain!

#include <AccelStepper.h>
#include <AFMotor.h>

AF_Stepper moteur(100, 1);

int button = 0;
long mytime = 0;

// you can change these to SINGLE or DOUBLE or INTERLEAVE or MICROSTEP!
void forwardstep() {  
  moteur.onestep(FORWARD, SINGLE);
}
void backwardstep() {  
  moteur.onestep(BACKWARD, SINGLE);
}

AccelStepper stepper(forwardstep, backwardstep); // use functions to step

void setup()
{  
   Serial.begin(9600);                       // set up Serial library at 9600 bps
   pinMode(18, OUTPUT);                      // Red Light "TASK RUN"
}

void loop()
{  
   control();                                // Buttons Keybard Set-Up
}


void reverse() //Reverse 
{   
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, BACKWARD, SINGLE);   //Motor 300 Step, BACKWARD and Microtepping
        }
}

void reverse1frm() //Reverse 1 frame
{   
        digitalWrite(18, HIGH);               //Red light on      
        moteur.setSpeed(50);                  //Motor Speed 50 RPM
        moteur.step(1, BACKWARD, MICROSTEP);  //Motor 1 Step, Backward and Microtepping
        delay(250);                           //Repeat delay
        digitalWrite(18, LOW);                //Red light off  
}

void pause() //Free Motor
{
       digitalWrite(18, HIGH);                //Red light on           
       moteur.release();                      //Motor Free spin
       delay(250);                            //Repeat delay
       digitalWrite(18, LOW);                 //Red light off  
}

void play1() // Sequence A
{   
        while(1)                              //Infinite loop
        if(millis()-mytime > 2000) {            //Set repeat time 
        mytime = millis();                    //After this line, loop sequence every "X" second
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, BACKWARD, SINGLE);   //Motor 300 Step, BACKWARD and Microtepping
        }  
}

void play2() // Sequence B
{
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, FORWARD, SINGLE);    //Motor 300 Step, Forward and Microtepping
        delay(10000);                          //Stop 10 second
        }
}

void forward1frm() //Forward 1 frame
{   
        digitalWrite(18, HIGH);               //Red light on      
        moteur.setSpeed(50);                  //Motor Speed 50 RPM
        moteur.step(1, FORWARD, MICROSTEP);   //Motor 1 Step, Forward and Microtepping
        delay(250);                           //Repeat delay
        digitalWrite(18, LOW);                //Red light off  
}

void forward() //Forward
{   
        while(1)                              //Infinite loop
        {
        if ( analogRead(A5) == LOW ){         //Stop button
        digitalWrite(18, LOW);                //Red light off
        break;                                //Stop while loop
        }    
        digitalWrite(18, HIGH);               //Red light on
        moteur.setSpeed(250);                 //Motor Speed 250 RPM
        moteur.step(300, FORWARD, SINGLE);    //Motor 300 Step, Forward and Microtepping
        }
}

void error() //Wrong way !
{
       while(1)       //Infinite loop
       {
       digitalWrite(18, HIGH);                //Red light on           
       delay(250);                            //Repeat delay
       digitalWrite(18, LOW);                 //Red light off  
       delay(250);       //Repeat delay
       }
}

// Buttons Keyboard
int control()
{
  button = analogRead(14); 
  // Buttons values (10k Resistance): 509, 681, 766, 818, 852, 878, 895, 910 (1023 no button).
  if (button > 950) error; 
  if (button < 529 && button > 500) reverse();
  if (button < 700 && button > 650) reverse1frm();
  if (button < 790 && button > 750) pause();
  if (button < 835 && button > 800) play1();
  if (button < 865 && button > 840) play2();
  if (button < 883 && button > 870) forward1frm();
  if (button < 905 && button > 885) forward();
  else error; // when all others fail, return this...
}


//*********( THE END )***********
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte