Fermeture de porte de garage

Bonjour, j'ai créer un projet de fermeture automatique de porte de garage électrique.
1 arduino uno, 1 relais, 1 potentiomètre, 1 SPDT, 1 Bouton poussoir, 1 buzzer et 2 LED.
Le relais sur ordre va shunté deux bornes du système du relève porte de garage.
Le potentiomètre permet un temps de pose de 15 mn à 60 mn.
Le SPDT sert a détecter que la porte de garage est fermé.
Le bouton sert a actionner la porte de garage (EX : j'ai laissé mes clés et ma commande dans la voiture la porte ce ferme, le bouton permettra d'ouvrir la porte).
Le buzzer avertira la fermeture automatique de la porte de garage.
Les LED rouge lorsqu'il est dans la routine et vert quand il en est sortie (possibilité d'appuyer sur le bouton).
Le code :

int analogPin = 0;
int pot = 0;
const int SPDT = 10; //3
int Porte = 6;
const int bouton = 11;
int RED = 7;
int GREEN = 8;
int Buzz = 9;
int Pose = 224820;
int TEMPS;
int etat;
float sinVal;
int toneVal;

void setup()
{
pinMode(SPDT, INPUT_PULLUP);
pinMode(Porte, OUTPUT);
pinMode(bouton, INPUT_PULLUP);
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(Buzz, OUTPUT);
}
void loop()
{
  digitalWrite(RED, LOW);
  digitalWrite(GREEN, HIGH);
    if(digitalRead(bouton) == HIGH) {    
    while(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (Pose);
      while(digitalRead(SPDT) == HIGH){
        delay (Pose);
        while(digitalRead(SPDT) == HIGH){
          delay (Pose);
          while(digitalRead(SPDT) == HIGH){
            delay (Pose);
            while(digitalRead(SPDT) == HIGH){
              pot = analogRead(analogPin);
              TEMPS=(pot*440);
              delay (TEMPS);
              while(digitalRead(SPDT) == HIGH){
                delay (TEMPS);
                while(digitalRead(SPDT) == HIGH){
                  delay (TEMPS);
                  while(digitalRead(SPDT) == HIGH){
                    delay (TEMPS);
                    while(digitalRead(SPDT) == HIGH){
                      delay (TEMPS);
                      while(digitalRead(SPDT) == HIGH){
                        delay (TEMPS);
                        while(digitalRead(SPDT) == HIGH){
                          digitalWrite(RED, HIGH);
                          digitalWrite(GREEN, HIGH);
                          for(int x=0; x<180; x++){
                            sinVal = (sin(x*(3.1412/180))); 
                            toneVal = 2000+(int(sinVal*1000));
                            tone(Buzz, toneVal,500);
                            delay(2); 
                          }
                          for(int x=0; x<180; x++){
                            sinVal = (sin(x*(3.1412/180))); 
                            toneVal = 2000+(int(sinVal*1000));
                            tone(Buzz, toneVal,500);
                            delay(2); 
                          }
                          delay (20000);
                          tone(Buzz,500,500);
                          digitalWrite(Porte, HIGH);
                          delay (1000);
                          digitalWrite(Porte, LOW);
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
   else {
        digitalWrite(RED, HIGH);
        digitalWrite(GREEN, HIGH);
        digitalWrite(Porte, HIGH);
        delay (1000);
        digitalWrite(Porte, LOW);}
}

Mon but était de sortir le plus souvent de la routine (3 minutes et 30 secondes) pour pouvoir appuyer sur le bouton et cas de problème, mais la led vert c'est bien allumer la rouge c'est éteinte et lorsque j'appuie sur le bouton rien ne se passe.
Pourquoi ?
Avez vous une solution?
Merci d'avance

Bonjour,

Page Les bonnes pratiques du Forum Francophoneest entre autre décrit comment présenter un code pour qu'il soit lisible.

J'adore ceci:

Un code lisible permet d'avoir une réponse.

excuser moi c'est la première fois que j'utilise ce forum.

224820 ne tient pas dans un int. Cela y met 28212 dans Pose. soit 2,8s environ
unsigned long Pose 224820; ferait bien la tempo de 22s

Pourquoi 4 ou 6 fois le même test?

Dans le programme, tant que digitalRead(SPDT) == HIGHle programme attend. delay est bloquant et on ne peut rien faire tant qu'il tourne. Pour pouvoir tenir compte des boutons, il ne faut pas que le code bloque sur les delays. J'ai l'impression que ce type de code doit bien fonctionner avec la Programmation Automate fini / Machine à état

Bonjour, Merci pour tes réponses.
Mon souhait était de pouvoir sortir assez rapidement de la routine (et revenir a à la première ligne de void loop sans finir le reste) dès que l'on ferme la porte de garage et que l'on puisse appuyer au plus vite sur le bouton pour ouvrir la porte.

merci de votre aide, mais j'ai trouvé une solution (peut être pas la bonne) et cela fonctionne
code :

int analogPin = 0;
int pot = 0;
const int SPDT = 10; //3
int Porte = 6;
const int bouton = 11;
int RED = 7;
int GREEN = 8;
int Buzz = 9;
int Pose = 224820;
int TEMPS;
int etat;
float sinVal;
int toneVal;

void setup()
{
pinMode(SPDT, INPUT_PULLUP);
pinMode(Porte, OUTPUT);
pinMode(bouton, INPUT_PULLUP);
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(Buzz, OUTPUT);
pinMode(analogPin, INPUT_PULLUP);
garage:
  digitalWrite(RED, LOW);
  digitalWrite(GREEN, HIGH);
    if(digitalRead(bouton) == HIGH) {    
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (Pose);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (Pose);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (Pose);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (Pose);}
    else
      {goto garage;}
    pot = analogRead(analogPin);
    TEMPS=(pot*440);
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (TEMPS);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (TEMPS);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (TEMPS);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (TEMPS);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (TEMPS);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
      delay (TEMPS);}
    else
      {goto garage;}
    if(digitalRead(SPDT) == HIGH){
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, HIGH);
      for(int x=0; x<180; x++){
        sinVal = (sin(x*(3.1412/180))); 
        toneVal = 2000+(int(sinVal*1000));
        tone(Buzz, toneVal,500);
        delay(2);}
      for(int x=0; x<180; x++){
        sinVal = (sin(x*(3.1412/180))); 
        toneVal = 2000+(int(sinVal*1000));
        tone(Buzz, toneVal,500);
        delay(2);}
      delay (20000);
      tone(Buzz,500,500);
      digitalWrite(Porte, HIGH);
      delay (1000);
      digitalWrite(Porte, LOW);
      goto garage;}
    else
      {goto garage;}}
   else {digitalWrite(RED, HIGH);
          digitalWrite(GREEN, HIGH);
          digitalWrite(Porte, HIGH);
          delay (1000);
          digitalWrite(Porte, LOW);
          goto garage;}}
          
void loop() {
  // put your main code here, to run repeatedly:

}

salut,
la boucle SETUP n'est en principe exécutée qu'une foi (boucle on initialise les variables par exemple). C'est la boucle LOOP qui doit contenir ton code qui s'exécute en boucle (comme son nom l'indique)
Le fait que "ça fonctionne" est une bonne chose pour toi, mais cette façon de programmer n'est pas idéal et en cas de maintenance du code cela risque d’être compliqué à suivre (en plus des goto...)

J'ai l'impression que c'est 4 fois la même chose.

Même avis. Etant vieux, je ne sais savais pas lire un code mal indenté, mais je ne sais pas lire non plus si il y a des goto

Tu n'as jamais fait du Fortran ?

Merci pour vos messages.
Le code fonctionne parfaitement.
j'ai répéter 4 fois pose et 6 fois TEMPS, pour avoir le plus de sortie de routine grâce aux Goto.
qui permettra de beaucoup moins attendre avant d'appuyer sur le bouton qui actionnera la porte de garage.
et si je ne l'ai pas mis dans loop, c'est que loop ne permet pas de sortir en cours de routine.
A+

Si, mais comme loop est une boucle infinie, il faut le gérer différemment.
Et si tu l'avais mis dans loop, sans les delay(), comme suggéré au post #4 tu aurais eu une réponse immédiate lors de l'appui sur le bouton.

Le premier but de se projet est que le mécanisme se ferme tout seul (en cas d'oubli) la porte du garage au bout de 15 Minutes a 60 minutes.
donc les delay sont très important.

Je pense que l'on se comprend mal.
On peut faire des délais sans utiliser l'instruction delay() qui bloque l'exécution du programme et le rend peut réactif.

le principal c'est que cela fonctionne TRES très très ... bien comme je le voulais.
bonne soirée.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.