gestion d'une bascule GO/STOP après ajout d'un timer

Bonjour,

Je viens de modifier un programme de gestion d’une pompe péristaltique que j’ai mis au point il y a quelques semaines. (c’est un simple moteur DC piloter avec un Pololu Max14870 plus une arduino Metro Mini.

Le programme originel attend la monté à 1 un signal extérieur (une centrale avec un UNO, et divers poussoirs qui ne font que des bascules GO/STOP) .

C’est donc un de ces signaux qui rentre dans le Mini de la pompe ( sur “int cmdpin = 3”) et déclenche un cycle de pompage (x secondes dans un sens, y sec. de pause, z secondes de pompage inversé).
ou bien le stop/relance à chaque nouvelle impulsion sur le poussoir.

Tout ceci marche très bien mais j’ai voulu ajouter un timer pour que le cycle de la pompe ne dure pas plus de 20 minutes sans que l’on ait à appuyer sur le poussoir pour faire un ‘STOP’ forcément.

Je gère donc le signal venant du poussoir extérieur && un temps calculé grâce à millis();

Là aussi ca marche (voir code ici avec seulement 12 secondes de timer pour les tests).

Sauf que les rebascules de poussoir ne font plus rien une fois le temps écoulé et la pompe stoppée. un ré-appui sur le poussoir reapasse le signal à 0, et un 3ème appui devrait en le repassant à 1 relancer la pompe… (voir à partir de ligne 58)

C’est quoi donc que j’ai foiré ??
Merci

/*
* Gestion par Arduino Metro Mini d'une pompe péristaltique (moteur DC 12v)
* pilotée par module driver Polulu Max14870
* Le Metro Mini est lui-même piloté par une commande centrale à base d'Arduino UNO qui envoie
* sur un fil un LOW (la pompe est OFF) ou un HIGH ( la pompe est activée ) - reçu sur pin 3 du Mini
*
* Le Max14870 nécessite un PWM sur son entrée 'PWM', un HIGH/LOW sur son entrée 'DIR', le GND
* un +12V sur son Vin et se raccorde au moteur par ses sorties M1 et M2.
*
* But: faire tourner la pompe pendant t1 dans un sens (pomper), stopper durant t2, puis pendant t3 tourner dans l'autre sens (refouler).
* On va ajouter un potar lu sur A0 du Mini pour faire varier la vitesse de la pompe.
  

*/
unsigned long millis_ON = millis();
unsigned long ThisMillis = millis_ON;   // 32bits : environ 50 j max avant retour zéro
long dTrun = 0;                       // delta T calcul du temps de pompage à base de millis()
unsigned long maxTimer = 12000;   // 1200000
const int cmdPin = 3;               // stop/go 3 en vrai depuis la centrale, 2 interne pullup pour le test
const int PWM_drive= 9;             // PWM du driver moteur
int PWM_Value = 0;                  //mise à 0 par défaut - valeur de vitesse moteur
const int DIRControl = 7;           // DIR du driver moteur
// const int Out5VPin = 12; // test

int valPota8b = 0;
int mapPota8b = 0;
float pause_cycle = 0;
int wait_cycle = 2000;
int ThiscmdPin;
int prevGo = 0;

void setup() {
  //start serial connection
  Serial.begin(15200);

  //configure pin 3 as an input and enable the internal pull-up resistor
  // pinMode(cmdPin, INPUT_PULLUP);   // pseudo signal 2 GO/STOP pour le test
  pinMode(cmdPin, INPUT);           // recevra le signal GO/STOP en vrai
  pinMode(13, OUTPUT);            // test led interne
  // pinMode(Out5VPin, OUTPUT); // sortie permanente 5V  HIGH pour test
  // digitalWrite(Out5VPin, HIGH);
  pinMode(DIRControl, OUTPUT);      // DIR du driver moteur
  pinMode(PWM_drive, OUTPUT);       // PWM du driver moteur

  // init tout est stoppé
  digitalWrite(LED_BUILTIN, LOW);
  analogWrite(PWM_drive, PWM_Value);
  ThiscmdPin=digitalRead(cmdPin);
  prevGo = ThiscmdPin;          // en principe à LOW au démarrage
  Serial.println("cmdPin ");
  Serial.println(digitalRead(cmdPin));
  Serial.println("------------");

}

void loop() {
  ThiscmdPin=digitalRead(cmdPin);
  Serial.println("ThiscmdPin");
  Serial.println(ThiscmdPin);
  Serial.println("------------ prevGo : ");Serial.println(prevGo); Serial.println("------------");
  if (ThiscmdPin != prevGo) {
    // le poussoir de commande a changé d'état
    prevGo=ThiscmdPin; // memo de cet état
    if (ThiscmdPin == 1) { 
      // go
      millis_ON=millis(); // temps de départ
      
    }
    
  } /*else {
  // le poussoir de commande n'a pas changé d'état
}*/


  while ((ThiscmdPin) == 1 && dTrun < maxTimer){  // on stop automatiquement la pompe au bout de 20 minutes
    // si le signal GO venant de l'unité de commande est haut on active sinon, stop. 
    // calcul du temps de pompage
    ThisMillis = millis();
    dTrun=ThisMillis-millis_ON;
    
    Serial.println("cmdPin");
    Serial.println(digitalRead(cmdPin));
    Serial.println("------------");

    // gestion potar de 'vitesse' moteur
    valPota8b=analogRead(A0)+1;
    mapPota8b=map(valPota8b,1,1024,30,400);
    // les paramètres du driver du moteur acceptent de [0, 400]
    Serial.println("valPota8b");
    Serial.println(valPota8b);
    Serial.println("  mapPota8b");
    Serial.println(mapPota8b);
    Serial.println("------------");
    digitalWrite(LED_BUILTIN, HIGH);   // turn internal LED on 
    // faire tourner moteur
    // sens 1
    PWM_Value = mapPota8b; // cette valeur vient du potar A0
    //
    digitalWrite(DIRControl, 1); 
    Serial.println("PWM dir1");
    Serial.println(PWM_Value);
    Serial.println("------------");
    analogWrite(PWM_drive, PWM_Value);
    delay(3000); //durée du pompage t1
    
    // stop - repos attente  
    analogWrite(PWM_drive, 0);
    digitalWrite(LED_BUILTIN, LOW); 
    Serial.println("PWM stop");
    Serial.println("------------");
    delay(2000); // stop durant un t2
    
    // reprise en sens inverse
    digitalWrite(DIRControl, 0); 
    digitalWrite(LED_BUILTIN, HIGH); 
    Serial.println("PWM  dir2");
    Serial.println(PWM_Value);
    Serial.println("------------");
    analogWrite(PWM_drive, PWM_Value);
    delay(3000); //durée du pompage t3 inversé

    analogWrite(PWM_drive, 0);
    digitalWrite(LED_BUILTIN, LOW); 
    Serial.println("PWM stop");
    Serial.println(PWM_Value);
    Serial.println("------------");
    delay(2000); // stop durant un t2    
    ThiscmdPin=digitalRead(cmdPin);
  }
  // on stoppe tout
  ThiscmdPin=digitalRead(cmdPin);
  digitalWrite(LED_BUILTIN, LOW);
  PWM_Value = 0;
  analogWrite(PWM_drive, PWM_Value);
  Serial.println("cmdPin");
  Serial.println(digitalRead(cmdPin));
  Serial.println("------------");

}

faut remettre dTrun à 0 sinon vous ne re-rentrerez plus jamais dans le while()

Bien vu!

Merci

tout est ok maintenant...

de rien - bonne continuation