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 !
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
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);
}