Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Arduino... Activer relais avec temporisation + bouton poussoir!



  1. #1
    jmjim

    Arduino... Activer relais avec temporisation + bouton poussoir!


    ------

    Bonjour à tous et merci de me lire!

    Je voudrais activé un relais avec une temporisation, par l'intermédiaire d'un bouton poussoir!
    Matériel :
    Arduino uno
    Clavier matriciel 4X4
    4 Relais arduino 5v
    Un bouton poussoir.

    Ce que je veux :
    Une fois l'arduino alimenté,
    Je sélectionne la temporisation = (touche 1, 2 ou 3 du clavier, qui correspond chacune à une tempo différente)
    Après j'appuis sur le BP = le relais est alimenté (pendant x seconde selon la tempo sélectionné)
    Puis le relais ce ferme
    Après je reappuis sur le BP = le relais est alimenté (pendant x seconde selon la tempo sélectionné)
    Puis le relais ce ferme, ainsi de suite!

    J'ai créé ce code :
    Code:
    #include <Keypad.h>
    #define relais_1 10
    
    const int bouton_NO = 11; //le bouton NO est connecté à la broche 11 de la carte Adruino
    
    //--- Constantes utilisées avec le clavier 4x4
    const byte LIGNES = 4; // 4 lignes
    const byte COLONNES = 4; //4 colonnes
    
    const int L1=2; //declaration constante de broche 
    const int L2=3; //declaration constante de broche 
    const int L3=4; //declaration constante de broche 
    const int L4=5; //declaration constante de broche 
    const int C1=6; //declaration constante de broche 
    const int C2=7; //declaration constante de broche 
    const int C3=8; //declaration constante de broche 
    const int C4=9; //declaration constante de broche  
    
    //--- Définition des touches 
    char touches[LIGNES][COLONNES] = {
      {'1','2','3','A'},
      {'4','5','6','B'},
      {'7','8','9','C'},
      {'*','0','#','D'}
    };
    
    // tableaux de lignes et colonnes
    byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier
    byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier
    
    char touche; // variable de stockage valeur touche appuyée
    
    // création d'un objet keypad = initialisation clavier 
    Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );
    // les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé 
    // les broches de colonnes sont automatiquement configurées en SORTIE
    
    int tempo; // variable temporisation des relais 1 et 2 (lessive machine 13kg)
    long temps_relais_1; // variable temps (foncion millis() relais_1 )
    
    int etat_bouton_NO; //variable qui enregistre l'état du bouton
    int memoire_BP = HIGH; //état relâché par défaut
    int valeur_bouton; // variable memoire du bouton NO
    
    
    void setup() {
      // on initialise les sorties et on éteind les leds connectées
        pinMode(relais_1, OUTPUT);  
        digitalWrite(relais_1, HIGH);
        
        pinMode(bouton_NO, INPUT); //le bouton est une entrée
        
        valeur_bouton = 0 ; // Variable valeur_bouton est égale à 0
        tempo = 0;
    }
    
    void loop() {// debut de la fonction loop()
    
    // --- ici instructions à exécuter par le programme principal --- 
    
    etat_bouton_NO = digitalRead(bouton_NO); // lecture de l'état du bouton
    
    touche = clavier.getKey(); // lecture de la touche appuyée
    
    
    if(touche != NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée 
       
       if(touche=='1') //si les touches '1' est tapée.
        {tempo=500;} // variable tempo est à 500.
       if(touche=='2')
        {tempo=1000;}
       if(touche=='3')
        {tempo=1500;} 
      
    
    
                            }
    
     
      { 
     if((etat_bouton_NO != memoire_BP) && (etat_bouton_NO == LOW))  // Si le bouton a un état différent de celui enregistré ET
       {                                                            // que cet état est "appuyé"
        valeur_bouton = 1;                                          // Alors la variable valeur_bouton ce met à "1"
       } 
    
     memoire_BP = etat_bouton_NO;  // on enregistre l'état du bouton pour le tour suivant
       
       if(valeur_bouton == 1) // Si la variable valeur_bouton est à "1"
        {temps_relais_1 = millis() + tempo; // La variable temp_relais_1 est égale à millis() + temporisation sélectionné
         digitalWrite(relais_1, LOW);} // Le relais_1 est activé               
       }
       
     
         if (millis() >= temps_relais_1) // Si millis() est égale ou supérieur à temps_relais_1 alors 
          {digitalWrite(relais_1, HIGH); // Le relais_1 se désactive
           valeur_bouton = 0;  // Remise à "0" de la variable valeur_bouton
          }
      
      }
    Mon problème c'est que le relais ne veux pas s'éteindre! Je ne sais pas pourquoi!

    Merci d'avance pour vos réponses!

    -----

  2. Publicité
  3. #2
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Personne pour m'aider?

  4. #3
    Seb.26

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Je pense que ton pb est dans ta gestion du BP.

    Je crois comprendre que tu veux détecter l’événement "appuis sur le BP" ( if((etat_bouton_NO != memoire_BP) && (etat_bouton_NO == LOW)) ) mais tu définis la durée de la tempo ( temps_relais_1 = millis() + tempo; ) quand "valeur_bouton == 1" ... Sauf que "valeur_bouton" repasse à 0 quand la tempo sera finis ... donc ça peut pas marcher ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  5. #4
    Seb.26

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    (code non testé) Essaye :
    Code:
    if(etat_bouton_NO != memoire_BP)
    {
      memoire_BP = etat_bouton_NO;  // on enregistre l'état du bouton pour le tour suivant
      
      if(etat_bouton_NO == 1) // Si la variable valeur_bouton est à "1"
      {
        temps_relais_1 = millis() + tempo; // La variable temp_relais_1 est égale à millis() + temporisation sélectionné
        digitalWrite(relais_1, LOW);} // Le relais_1 est activé               
      }
    }
     
    if (millis() > temps_relais_1) // Si millis() est égale ou supérieur à temps_relais_1 alors 
    {
      digitalWrite(relais_1, HIGH); // Le relais_1 se désactive
    }
    PS: c'est bien d'utiliser millis() et pas un bête delay(...)

    [Edit] attention, millis() retourne à zero après un certain moment ... il faudra aussi gerer tempo_relay_1 en fin de tempo ...
    Dernière modification par Seb.26 ; 17/10/2016 à 18h03.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  6. A voir en vidéo sur Futura
  7. #5
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par Seb.26 Voir le message
    "valeur_bouton" repasse à 0 quand la tempo sera finis ... donc ça peut pas marcher ...
    Oui j'ai mis ca car quand ca n'y est pas, si j'appuis sur le bp sans avoir sélectionné de tempo le relais s'enclenche et se déclenche très rapidement!

  8. #6
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par Seb.26 Voir le message

    PS: c'est bien d'utiliser millis() et pas un bête delay(...)

    [
    oui c'est bien millis() car delay bloque le programme

  9. Publicité
  10. #7
    Seb.26

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par jmjim Voir le message
    Oui j'ai mis ca car quand ca n'y est pas, si j'appuis sur le bp sans avoir sélectionné de tempo le relais s'enclenche et se déclenche très rapidement!
    Dans ce cas, teste si la tempo est à 0 et ne fait rien dans ce cas ... ... ou initialise tempo à une valeur par defaut ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #8
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Super!!!! Le code que vous m'avez donner fonctionne!
    Le relais s'arrête bien après la tempo!
    Merci beaucoup!!!

  12. #9
    Seb.26

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Parfait, t'as eu du bol, j'ai même pas essayé de le compiler ...

    Maintenant, essayes de finaliser ce qui reste "bancal" :
    > quand millis() boucle et repasse à 0 (voir aussi juste un peu avant le RAZ)
    > "digitalWrite(relais_1, HIGH);" est exécuté à chaque fois
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #10
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par Seb.26 Voir le message
    Parfait, t'as eu du bol, j'ai même pas essayé de le compiler ...

    Maintenant, essayes de finaliser ce qui reste "bancal" :
    > quand millis() boucle et repasse à 0 (voir aussi juste un peu avant le RAZ)
    > "digitalWrite(relais_1, HIGH);" est exécuté à chaque fois
    digitlWrite(relais_1, HIGH); est exécuté toute les fois que j'appuis sur le BP (C'est bien ce que je voulais)

    millis() ? Quel est le problème

  14. #11
    Seb.26

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par jmjim Voir le message
    digitlWrite(relais_1, HIGH); est exécuté toute les fois que j'appuis sur le BP (C'est bien ce que je voulais)
    sauf erreur de ma part, "digitalWrite(relais_1, HIGH);" est exécuté à chaque appel de la boucle ( [edit] après la premiere utilisation )

    Citation Envoyé par jmjim Voir le message
    millis() ? Quel est le problème
    millis() renvoie une valeur qui comme toute variable a une valeur max, donc au bout d'un moment ça repasse à 0 ... il faut vérifier comment va se comporter ton programme dans ce cas précis (et aussi quand "millis() + tempo" sera plus grand que la valeur max )
    Dernière modification par Seb.26 ; 17/10/2016 à 18h35.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  15. #12
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par Seb.26 Voir le message


    millis() renvoie une valeur qui comme toute variable a une valeur max, donc au bout d'un moment ça repasse à 0 ... il faut vérifier comment va se comporter ton programme dans ce cas précis (et aussi quand "millis() + tempo" sera plus grand que la valeur max )
    D'accord! je ne savais pas que millis() pouvais revenir a zero! Mais dans mon cas je ne pense pas que j'irais jusqu'à la ''fin", je vais utilise que des secondes et au max 2 minutes.

  16. Publicité
  17. #13
    Seb.26

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    Citation Envoyé par jmjim Voir le message
    D'accord! je ne savais pas que millis() pouvais revenir a zero! Mais dans mon cas je ne pense pas que j'irais jusqu'à la ''fin", je vais utilise que des secondes et au max 2 minutes.
    C'est avec le temps qui passe que millis() va repasser à zero.
    https://www.arduino.cc/en/Reference/Millis

    A priori ça repasse à zéro tous les 50 jours ... à voir si c'est un souci dans ton cas ?! ...

    Bonne continuation, @+
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  18. #14
    jmjim

    Re : Arduino... Activer relais avec temporisation + bouton poussoir!

    D'accord!
    J'espère pas! Mais vu que l'arduino ne restera branché plus d'une journée je ne pense pas!
    Encore merci pour votre aide précieuse!
    Bonne continuation à vous aussi!

Discussions similaires

  1. [Programmation] Problème bouton poussoir + débitmètre Arduino [Résolu]
    Par jmjim dans le forum Électronique
    Réponses: 62
    Dernier message: 15/11/2015, 20h52
  2. arduino, servomoteur et bouton poussoir
    Par Anolis57 dans le forum Électronique
    Réponses: 68
    Dernier message: 22/07/2015, 12h53
  3. besoin d'aide bouton poussoir avec l'arduino mega
    Par joeman1 dans le forum Électronique
    Réponses: 11
    Dernier message: 20/10/2014, 20h32
  4. Problème bouton poussoir Arduino
    Par moha698 dans le forum Électronique
    Réponses: 8
    Dernier message: 27/04/2014, 17h07
  5. Relais et bouton poussoir
    Par kwakigna dans le forum Électronique
    Réponses: 8
    Dernier message: 24/11/2012, 11h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.