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 )*********** |