bouton poussoir temporisation moteur

Bonjour à tous j'aurais besoin de votre aide.

je souhaite temporisé un moteur pas a pas l'or d'un appuie sur un bouton poussoir mon code que j'ai fait fonctionne mais seulement quelque seconde.

Pourriez vous m'aider. merci ci-dessous mon code

int latchPin = 5; //pin 12 on the 595
int dataPin = 6;  //pin 14 on the 595
int clockPin = 7; //pin 11 on the 595


const int bp = 8;

int stepper1val;
int Steps1 = 0;
boolean Direction1 = true;// gre

unsigned long last_time;
unsigned long currentMillis;
int steps_left1 = 4095;
long time;


void setup()
{
  //Serial.begin(115200);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(bp, INPUT_PULLUP);
}

void loop()
{
  int readLeft = digitalRead(bp);

  if (readLeft == 0) {
    steps_left1;
    while (steps_left1 > 0) {
      currentMillis = micros();
      if (currentMillis - last_time >= 1000) {
        stepper1(1);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, stepper1val);
        digitalWrite(latchPin, HIGH);
        time = time + micros() - last_time;
        last_time = micros();
        steps_left1--;
      }
    }
  }
}

// motor 1 is 1 2 4 8
void stepper1(int xw) {
  for (int x = 0; x < xw; x++) {
    switch (Steps1) {
      case 0:
        stepper1val = 8;
        break;
      case 1:
        stepper1val = 12;
        break;
      case 2:
        stepper1val = 4;
        break;
      case 3:
        stepper1val = 6;
        break;
      case 4:
        stepper1val = 2;
        break;
      case 5:
        stepper1val = 3;
        break;
      case 6:
        stepper1val = 1;
        break;
      case 7:
        stepper1val = 9;
        break;
      default:
        stepper1val = 0;
        break;
    }
    SetDirection1();
  }
}


void SetDirection1() {
  if (Direction1 == 1) {
    Steps1++;
  }
  if (Direction1 == 0) {
    Steps1--;
  }
  if (Steps1 > 7) {
    Steps1 = 0;
  }
  if (Steps1 < 0) {
    Steps1 = 7;
  }
}

votre while est dans votre if, donc une fois parti dans le while, il termine son exécution avec de revenir tester le bouton lors de la prochaine loop


corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

lisez comment utiliser le forum (les posts épinglés en haut du forum comme "Bien éditer son post pour les nuls" , "Faire un Nouveau Sujet ou le corriger avec les Balises..." et "Règles du forum francophone"), et faites un post "propre"

post modifié

merci - mais comme dit ci dessus

votre while est dans votre if, donc une fois parti dans le while, il termine son exécution avec de revenir tester le bouton lors de la prochaine loop

Merci

J'ai modifié le code mais lorsque je sort le while du if le moteur démarre 4 seconde des le début du programme sans appui sur le BP.

comment avez vous câblé le bouton ? quel type ? (s'il a 4 pins prenez 2 pins opposée, une va à GND, l'autre à l'Arduino)

c'est quoi ce steps_left1; tout seul ?
c'est pour quoi faire le time = time + micros() - last_time; ?
pas génial comme nom de variable... currentMillis = micros();

pour le bouton c'est bon j'ai un fil sur le bouton et un sur le GND.

programme modifié sans time et steps_left1

pour info j'utilise un registre 75HC595 et un moteur pas a pas 28BYJ-48 avec interface ULN2003.

int latchPin = 5; //pin 12 on the 595
int dataPin = 6;  //pin 14 on the 595
int clockPin = 7; //pin 11 on the 595


const int bp = 8;

int stepper1val;
int Steps1 = 0;
boolean Direction1 = true;// gre

unsigned long last_time;
unsigned long currentMillis;
int steps_left1 = 4095;
long time;


void setup()
{
  //Serial.begin(115200);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(bp, INPUT_PULLUP);
}

void loop()
{
  int readLeft = digitalRead(bp);

  if (readLeft == 0) {
    while (steps_left1 > 0) {
      currentMillis = micros();
      if (currentMillis - last_time >= 1000) {
        stepper1(1);
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, stepper1val);
        digitalWrite(latchPin, HIGH);
        last_time = micros();
        steps_left1--;
      }
    }
  }
}

// motor 1 is 1 2 4 8
void stepper1(int xw) {
  for (int x = 0; x < xw; x++) {
    switch (Steps1) {
      case 0:
        stepper1val = 8;
        break;
      case 1:
        stepper1val = 12;
        break;
      case 2:
        stepper1val = 4;
        break;
      case 3:
        stepper1val = 6;
        break;
      case 4:
        stepper1val = 2;
        break;
      case 5:
        stepper1val = 3;
        break;
      case 6:
        stepper1val = 1;
        break;
      case 7:
        stepper1val = 9;
        break;
      default:
        stepper1val = 0;
        break;
    }
    SetDirection1();
  }
}


void SetDirection1() {
  if (Direction1 == 1) {
    Steps1++;
  }
  if (Direction1 == 0) {
    Steps1--;
  }
  if (Steps1 > 7) {
    Steps1 = 0;
  }
  if (Steps1 < 0) {
    Steps1 = 7;
  }
}

combien vaut steps_left1 au début de while (steps_left1 > 0) {...} maintenant ?

int steps_left1 = 4095;

suppression de la ligne
while (steps_left1 > 0)

maintenant le moteur tourne seulement bp appuyer.

Et donc ?

Que voulez vous faire exactement ?

Je voudrais que mon moteur continue de tourner un temp définit après l'appuie sur le bouton.