Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire pareil avec plusieurs relais

Sujet résolu
    8 février 2016 à 18:26:03

    Bonjour à tous,

    J'ai un petit problème c'est pour cela que je viens vers vous aujourd'hui.

    Je vous explique le circuit et le problème.

    J'ai un Bouton Poussoir qui permet d'ouvrir et de fermer un relai. Jusque la rien de compliquer. ce relai (si on appuie pas de nouveau sur le bouton) se coupe automatiquement après 3 secondes ici.

    Le problème j'aimerai mettre 8 boutons et 8 relais. mais je ne sais pas comment m'y prendre pour que ca marche sur les 8 relais de la même façon..

    int B_POUSSOIR1= 3;
    int RELAIS1 =1;
    
     
    // Déclaration des variables
    int memoireBp1 = LOW; //Mémoire du bouton poussoir
    int etatBp1 = LOW; //Etat actuel du PB
    int etatRelais1 = HIGH; //Etat du relais
    
    
    // État d'activation de la tempo
    int tempoActive1 = 0;
    
    
    // Temps à l'activation de la tempo
    unsigned long tempoDepart1 = 0;
    
     
    void setup() {
        // On initialise les entrées/sorties
        pinMode(B_POUSSOIR1, INPUT);
        pinMode(RELAIS1, OUTPUT);
        digitalWrite(RELAIS1, etatRelais1); // On écrit l'état du relais
    }
     
    void loop() {
     
        // Récupération de l'état actuel du BP
        etatBp1 = digitalRead(B_POUSSOIR1);
     
        //Si l'état est différent de la mémoire et qu'il est à HIGH (Front montant)
        if(etatBp1 != memoireBp1 && etatBp1 == HIGH) {
     
            delay(500);
     
            //Si relais est HIGH
            if(etatRelais1 == HIGH) {
     
                //On demande à le passer à LOW
                etatRelais1 = LOW;
     
                // Et on lance la temporisation
                tempoActive1 = 1;
                tempoDepart1 = millis();
     
            // Sinon
            } else {
     
                //On demande à le passer à HIGH
                etatRelais1 = HIGH;
     
                //Et on annule la temporisation
                tempoActive1 = 0;
     
            }
     
            //On écrit l'état du relais
            digitalWrite(RELAIS1, etatRelais1);
     
        } 
     
        // Si la temporisation est active,
        if ( tempoActive1==1 ) {
     
            // Et si il s'est écoulé 3 secondes,
            if ( ( millis() - tempoDepart1 ) >= 3000 ) {
             
                //On demande à passer le relais à HIGH
                etatRelais1 = HIGH;
                //On écrit l'état du relais
                digitalWrite(RELAIS1, etatRelais1);
     
                // Et on désactive la temporisation puisque l'action a été faite
                tempoActive1 = 0;
     
            }
     
        }
     
        //On conserve l'état du bouton
        memoireBp1 = etatBp1;
     
    }



    Je vous remercie d'avance énormément

    Cordialement

    P.Olivier

    -
    Edité par P.Olivier 8 février 2016 à 18:31:07

    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2016 à 23:47:26

      Bonsoir,

      J'ai aperçu ton post et j'ai ouvert le Bloc-Notes de WIndows (car sur le pc ou je suis je ne peux pas utiliser le logiciel d'Arduino.....).

      Le code que je te propose comporte donc surement des erreurs car je ne l'est pas essayé, mais voici un croquis qui me semble pas trop mal mais avant, deux trois petits conseils et détails;

      - A tu plus de 14 Pin (de 0 à 13) ? Car si non tu va être limité à 7 Bp + 7 Relais...

      - Dans le code que je te propose, j'ai mis les 8 relais sur les broches de 1 à 7, leurs états peuvent être visualisés grâce à un registre, le registre PIND, permettant de supprimer quelque variables

      // Relais 1
      int B_POUSSOIR1= 8;
      int RELAIS1 =0;
      
      // Relais 2
      int B_POUSSOIR2= 9;
      int RELAIS2 =2;
      
      // Relais 3
      int B_POUSSOIR3= 10;
      int RELAIS3 =6;
      
      // Relais ...
      // Relais ...8
      
      // Tableau des temps d'activations des relais
      int TempsActivation[7];
      
      //....
      // PORTD : Pin de 0 à 7
      // PORTB : Pin de 8 à 13
      //
      void setup() {
       
          // On initialise les entrées/sorties
      
          pinMode(B_POUSSOIR1, INPUT);
          pinMode(RELAIS1, OUTPUT);
          digitalWrite(RELAIS1, 0); // On écrit l'état du relais
      
          pinMode(B_POUSSOIR2, INPUT);
          pinMode(RELAIS2, OUTPUT);
          digitalWrite(RELAIS2, 0); // On écrit l'état du relais
      
          pinMode(B_POUSSOIR3, INPUT);
          pinMode(RELAIS3, OUTPUT);
          digitalWrite(RELAIS3, 0); // On écrit l'état du relais
      }
      void loop()
      {
      	for (int i=0 ; i<7 ; i++)
      	{
      		CmdRelais(i,i+8) ;
      		delay(1); // Pour ne pas s'emballer dans la boucle
      	}
      
      }
      
      
      bool CmdRelais (int BrocheBP, int BrocheRelais)
      {
      int EtatBrocheRelais = 0 ;
      
      if(BrocheRelais <= 7)
      {	
      	// Broche du relais sur le port D
      	EtatBrocheRelais = PIND>>BrocheRelais & 1 ;
      
      }
      else if ( (BrocheRelais > 7) & (BrocheRelais <= 13) )	
      {
      	// Broche du relais sur le port B, pas ton cas ici car ton 8ème relais est sur le pin 7 !
      	EtatBrocheRelais = PINB>>(BrocheRelais-7) & 1 ;
      }
      
      if ( (digitalRead(BrocheBP) )
      {
      	// Poussoir à 1 
      	// On inverse l'état de la brocheRelais
      	EtatBrocheRelais = !EtatBrocheRelais ;
      	digitalWrite (BrocheRelais, EtatBrocheRelais); // On écrit l'état du relais
      	if (EtatBrocheRelais)
      	{
      		// Si mise à 1, on enregistre le moment de la mise à 1 du relais
      		TempsActivation[BrocheRelais] = millis() ;
      	}
      }
      else 
      {
      	// Poussoir à 0
      	// On vérifie si la broche relais est active, et depuis combien de temps
      	if (EtatBrocheRelais)	
      	{
      		// Broche Active
      		if ( (millis() - TempsActivation[BrocheRelais]) < 3000 )
      		{	
      			// Décompte en cours
      		}
      		else if (millis()TempsActivation[BrocheRelais] >= 3000)
      		{
      			// Mise à 0
      			EtatBrocheRelais = false ;
      			digitalWrite (BrocheRelais, EtatBrocheRelais); // On écrit 0 dans la broche du relais	
      		}
      	else
      	{
      	// Broche Inactive
      	}
      }
      
      // On retourne l'état de la BrocheRelais
      Return EtatBrocheRelais ;
      }
      



      -
      Edité par Blunt_shooter 9 février 2016 à 1:31:30

      • Partager sur Facebook
      • Partager sur Twitter
        9 février 2016 à 0:11:18

        bonsoir,

        Merci pour votre réponse. Effectivement j'ai un arduino MEGA donc pas de problème de PIN.

        Faudra que je test demain soir, je n'ai pas tout compris au premier coup d'oeil, mais je vais essayer de comprendre.

        Cdt

        -
        Edité par P.Olivier 9 février 2016 à 0:24:58

        • Partager sur Facebook
        • Partager sur Twitter
          9 février 2016 à 1:45:45

          Bien pour la Mega ^^

          Par contre je ne suis pas du tout sûr que d'interroger le port D : "PIND" soit compatible avec une MEGA pour visualiser l'état des tes sorties broches, a suivre demain !

          Alex.

          • Partager sur Facebook
          • Partager sur Twitter
            9 février 2016 à 9:19:13

            Tient, c'est marrant ça, j'ai l'impression d'avoir déjà vu ce code :-°

            Probablement honteusement copié sur l'un de mes posts :p

            D'ailleurs, j'avais du expliquer que faire des delay pour des action asynchrone est une très mauvaise idée.

            Du coup, je propose tout d'abord de supprimer la ligne 34.

            Ensuite, il suffit simplement de dupliquer ce code pour gérer les boutons les un après les autres.

            • Partager sur Facebook
            • Partager sur Twitter
              9 février 2016 à 10:53:50

              Ce code viens de toi et c'était pour moi si tu te souviens, a cause d'un problème je n'avais pas pu continuer et voila que je m'y remet sérieusement aujourd'hui.

              La restauration de ma voiture avance, (mais qu'est ce que ça viens faire là ? :p ) C'est pour la réalisation d'une électrolyse. (Dé-rouillage des pièces)

              Tu proposes tout simplement de dupliquer les "if" ?

              -
              Edité par P.Olivier 9 février 2016 à 10:56:34

              • Partager sur Facebook
              • Partager sur Twitter
                9 février 2016 à 18:07:26

                Blunt_shooter a écrit:

                Bien pour la Mega ^^

                Par contre je ne suis pas du tout sûr que d'interroger le port D : "PIND" soit compatible avec une MEGA pour visualiser l'état des tes sorties broches, a suivre demain !

                Alex.


                Il y a quelques petites erreurs dans ton code :

                ligne 66 :

                if ( (digitalRead(BrocheBP) ){

                j'ai changé en je suppose :

                if ( (digitalRead(BrocheBP) )){

                ligne 89 :

                else if (millis()TempsActivation[BrocheRelais] >= 3000)

                je ne sais pas quoi mettre la j'ai le message : "exit status 1
                expected ')' before 'TempsActivation'" il y a t-il un "-" à mettre ?

                et dernière ligne :

                return EtatBrocheRelais ;

                j'ai le message : j'ai rajouté un } derrière.

                Si je balance le code avec ces petites modification, les relais s'allume sans aucune action sur le bouton. Si j'appuie rien ne se passe.

                merci





                -
                Edité par P.Olivier 9 février 2016 à 18:13:32

                • Partager sur Facebook
                • Partager sur Twitter
                  9 février 2016 à 20:09:23

                  P.Olivier a écrit:

                  Tu proposes tout simplement de dupliquer les "if" ?

                  Oui, je te conseille de dupliquer le code, tout simplement.

                  Mais c'est vrai que l'on va rapidement se retrouver avec un code loop énorme...

                  Donc mieux vaut créer des fonctions.

                  Ce qui nous donne quelque chose de ce genre :

                  // Fonction de gestion du bouton 1
                  void gererBP1() {
                  
                      // ICI: copier/coller l'ensemble de ce que contient la fonction loop.
                  
                  }
                  
                  
                  
                  // Fonction de gestion du bouton 2
                  void gererBP2() {
                  
                      // ICI: mettre exactement la même chose mais en replacant les '1' par des '2'
                      // Ne pas oublier non plus de dupliquer les variables globales en début de programme
                  
                  }
                  
                  
                  
                  // Fonction de gestion du bouton 3
                  void gererBP3() {
                  
                      [...]
                  
                  }
                  
                  
                  
                  [...]
                  
                  
                  
                  // Fonction loop
                  void loop() {
                  
                      // Appel de toutes les fonction de gestion, les unes après les autres
                      gererBP1();
                      gererBP2();
                      gererBP3();
                      [...]
                  
                  }

                  P.Olivier a écrit:

                  ligne 89 :

                  else if (millis()TempsActivation[BrocheRelais] >= 3000)

                  je ne sais pas quoi mettre la j'ai le message : "exit status 1
                  expected ')' before 'TempsActivation'" il y a t-il un "-" à mettre ?

                  Tu devrais chercher à comprendre le code avant de copier/coller.

                  3 lignes au dessus de cette ligne erronée, on peut voir cette ligne :

                  if ( (millis() - TempsActivation[BrocheRelais]) < 3000 )

                  En comparant ces 2 lignes tout en lisant les commentaires, on comprend rapidement qu'il manque tout simplement la soustraction.

                  Du coup, il faudrait avoir :

                  else if ( millis() - TempsActivation[BrocheRelais] >= 3000 )

                  Par contre, j'avoue ne pas trop comprendre pourquoi faire un if ( x < 3000 ) suivi d'un else if ( x >= 3000 )

                  Autant remplacer le else if ( x >= 3000 ) par un else, tout simplement ;)

                  -
                  Edité par lorrio 9 février 2016 à 20:10:35

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 février 2016 à 14:56:06

                    Bonjour Lorrio,

                    Hier j'ai fait le test en dupliquant le code que tu avais fait un il a qq mois. sa marche parfaitement bien et je t'en remercie.

                    D'ailleurs je prend la petite astuce de la création de function. je vais mettre à jour ce soir.

                    je vous remercie tous les deux pour votre aide.

                    Merciiii !!

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Faire pareil avec plusieurs relais

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown