Compteur et Timer

Suite à mon inscription, je vous soumet un petit programme qui fonctionne MAIS qui ne fait pas tout à fait ce que je voudrais.

Il vérifie 3 états de 3 entrées digitales et si elle sont respectées (les 3 entrées à LOW), le programme se poursuit et si pas on stoppe le programme après 60 secondes.

Le programme doit stopper, bloquant l'électronique et la mécanique qu'il y a derrière, et ne peut être réactivé que par un reset (ou par l'intervention du concepteur).

Si le code se poursuit normalement (3 entrées à LOW), un bouton "boot" peut être activé pendant une durée de 6 seconde cumulée (ce qui met la pin control_pin9 à HIGH),
c'est à dire que l'on additionne le temps de toutes les impulsions jusqu'à 6 secondes.

Au delà de ce temps, la sortie de la pin control_pin9 passe à LOW.

Dans ce code cela fonctionne en partie car si on appuie sans arrêt sur le bouton "boot", on ne sort pas de la 1ere boucle "if" et donc temps_accumule_Boot ne peut pas être mis à jour et comparé à la durée qui stoppe cette fonction.

Simple, non ? Sans aucun doute pour certain d'entre vous ! :slight_smile:

Une fois cela résolu, il y a une autre fonction qu'il faudra activer dans cette boucle (qui n'est pas encore écrite) qui fait l'inverse (si on appuie sur un autre bouton, le temps accumulé devra reculer et ainsi
retarder la fin de l'utilisation du bouton "boot"
Dans ce cas, je ne sais même pas par où commencer :wink:

Merci pour les pistes !

Le code sur Arduino Uno

const int switchpin1 = 2;
const int switchpin2 = 4;
const int switchpin3 = 7;
const int control_pin9 = 5;
const int control_pin32 = 6;
const int switchBoot = 12;
const int stopMart = 8;

int state_1=0;
int state_2=0;
int state_3=0;
int state_switchBoot=0;

unsigned long previous_Boot_Time=0;
long Boot_Time=6000;
unsigned long current_Boot_Time = 0;
unsigned long temps_accumule_Boot = 0;
int x=0;
bool BootStatus;

void setup() {
    
  BootStatus = true;

  pinMode(switchpin1, INPUT_PULLUP);
  pinMode(switchpin2, INPUT_PULLUP);
  pinMode(switchpin3, INPUT_PULLUP);
  pinMode(switchBoot, INPUT_PULLUP);
  pinMode(control_pin9, OUTPUT);
  pinMode(control_pin32, OUTPUT);
  pinMode(stopMart, OUTPUT);

  Serial.begin(9600);
}
  
void loop() {

  state_1=digitalRead(switchpin1);
  state_2=digitalRead(switchpin2);
  state_3=digitalRead(switchpin3);
  state_switchBoot=digitalRead(switchBoot);
  
  Serial.print("Etat 1 = ");
  Serial.println(state_1);
  Serial.print("Etat 2 = ");
  Serial.println(state_2);
  Serial.print("Etat 3 = ");
  Serial.println(state_3);
  Serial.println();

  while (state_1 == LOW && state_2 == LOW && state_3 == LOW){

  digitalWrite(control_pin32, HIGH);
  digitalWrite(stopMart, HIGH);
  
    if (temps_accumule_Boot < Boot_Time){

      if (state_switchBoot == LOW && BootStatus == false){ // Si bouton Boot pressé et le chrono arrêté alors on démarre le chrono

        digitalWrite(control_pin9, HIGH);
        current_Boot_Time = millis();        
        BootStatus = true;
        Serial.println("On démarre le chrono Boot");  
      }
            
      if (state_switchBoot == HIGH && BootStatus == true){ // Si bouton Boot relâché et le chrono en marche alors on arrête le chrono
        
        digitalWrite(control_pin9, LOW);
        previous_Boot_Time = millis() - current_Boot_Time;
        BootStatus = false;
        
        Serial.print("On suspend le chrono Boot, vous avez appuyé : " + String(previous_Boot_Time));                                                                                                        
        Serial.println(" millisecondes");                                                              
                                                                                                       
        temps_accumule_Boot = temps_accumule_Boot + previous_Boot_Time;
        
        Serial.print("Le temps total accumulé du Boot : " + String(temps_accumule_Boot));
        Serial.println(" millisecondes");
      }  
        
    }
    
    else{
      digitalWrite(control_pin9, LOW);
    }
    
  }

  digitalWrite(control_pin32, LOW);
  digitalWrite(control_pin9, LOW);
  Serial.println("On démarre le chrono stop Mart"); 

     while (x<60){
     x=x++;
     delay (1000);     
     }
        
  digitalWrite(stopMart, LOW);
  Serial.println("On stope Mart");
  while (1);
    
  }

Je n'avais pas testé le programme précédent et je me rend compte que cela ne fonctionne pas avec la boucle "while (state_1 == LOW && state_2 == LOW && state_3 == LOW)" Les conditions sont pourtant remplies pour boucler et exécuter la suite du programme, non ?

j'ai donc remanié un peu pour que cela fonctionne comme dans l'énoncé mais toujours le même souci...
Il y a aussi le chrono qui démarre tout seul lors du 1er passage mais se stabilise par la suite.

merci :wink:

const int switchpin1 = 2;
const int switchpin2 = 4;
const int switchpin3 = 7;
const int control_pin9 = 5;
const int control_pin32 = 6;
const int switchBoot = 12;
const int stopMart = 8;

int state_1=0;
int state_2=0;
int state_3=0;
int state_switchBoot=0;

unsigned long previous_Boot_Time=0;
long Boot_Time=6000;
unsigned long current_Boot_Time = 0;
unsigned long temps_accumule_Boot = 0;
unsigned long startBoot = 0;
int x=0;
bool BootStatus;

void setup() {
    
  BootStatus = true;

  pinMode(switchpin1, INPUT_PULLUP);
  pinMode(switchpin2, INPUT_PULLUP);
  pinMode(switchpin3, INPUT_PULLUP);
  pinMode(switchBoot, INPUT_PULLUP);
  pinMode(control_pin9, OUTPUT);
  pinMode(control_pin32, OUTPUT);
  pinMode(stopMart, OUTPUT);

  Serial.begin(9600);
}
  
void loop() {

  state_1=digitalRead(switchpin1);
  state_2=digitalRead(switchpin2);
  state_3=digitalRead(switchpin3);
  state_switchBoot=digitalRead(switchBoot);
  
  Serial.print("Etat 1 = ");
  Serial.println(state_1);
  Serial.print("Etat 2 = ");
  Serial.println(state_2);
  Serial.print("Etat 3 = ");
  Serial.println(state_3);
  Serial.println();

  digitalWrite(stopMart, HIGH);

  if (state_1 == LOW && state_2 == LOW && state_3 == LOW){

  digitalWrite(control_pin32, HIGH);
  
    if (temps_accumule_Boot < Boot_Time){

      if (state_switchBoot == LOW && BootStatus == false){ // Si bouton Boot pressé et le chrono arrêté alors on démarre le chrono

        digitalWrite(control_pin9, HIGH);
        current_Boot_Time = millis();        
        BootStatus = true;
        Serial.println("On démarre le chrono Boot");  
      }
            
      if (state_switchBoot == HIGH && BootStatus == true){ // Si bouton Boot relâché et le chrono en marche alors on arrête le chrono
        
        digitalWrite(control_pin9, LOW);
        previous_Boot_Time = millis() - current_Boot_Time;
        BootStatus = false;
        
        Serial.print("On suspend le chrono Boot, vous avez appuyé : " + String(previous_Boot_Time));                                                                                                        
        Serial.println(" millisecondes");                                                              
                                                                                                       
        temps_accumule_Boot = temps_accumule_Boot + previous_Boot_Time;
        
        Serial.print("Le temps total accumulé du Boot : " + String(temps_accumule_Boot));
        Serial.println(" millisecondes");
      }  
        
    }
    
    else{
      digitalWrite(control_pin9, LOW);
    }
    
  }

  else{
    
  digitalWrite(control_pin32, LOW);
  digitalWrite(control_pin9, LOW);
  Serial.println("On démarre le chrono stop Mart"); 

     while (x<60){
     x++;
     delay (1000);
     Serial.println(x);     
     }
        
  digitalWrite(stopMart, LOW);
  Serial.println("On stope Mart");
  while (1);
    
  }

}