IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Fonction interrupteur ON/OFF depuis bouton poussoir


Sujet :

Arduino

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 46
    Par défaut Fonction interrupteur ON/OFF depuis bouton poussoir
    Bonsoir,
    J'ai ce code pour faire d'un bouton poussoir un interrupteur ON / OFF
    Il est fonctionnel et marche nickel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    const int buttonPin = 2;    //pin pour le bouton
    const int ledPin =  13;     //pin pour la lED
     
    int interrupteur = LOW;       //valeur de l'interrupeteur
    int toggle = 0;             //valeur pour changement d'état du bouton
    int buttonState = 0;        //etat fugitif du bouton    
     
     
    void setup() {
      Serial.begin(9600);
      // Initialisation de la LED en sortie
      pinMode(ledPin, OUTPUT);     
      // Initialisation du bouton en entrée
      pinMode(buttonPin, INPUT);    
    }
     
    void loop(){
      // Lecture de l'état du bouton
      buttonState = digitalRead(buttonPin);
     
      //On regarde si le bouton est pressé
      if (buttonState == HIGH) {    
        //on regarde si il y a un changement d'état
        if (toggle == 1) {
          // on change l'état du bouton
          interrupteur=!interrupteur;
          // on reinitialise le toggle
          toggle=0;
          // on affiche l'état de l'interupteur virtuel sur la led
          digitalWrite(ledPin, interrupteur); 
        }  
      }   else {
        //le bouton n'est pas pressé, on active le toggle
        toggle=1;
      }
    }
    Ce que je voudrais c'est faire de ce code c'est une fonction afin de simplifier la vie si je manipule plusieurs boutons poussoirs en interrupteurs ON/OFF.

    J'ai donc essayé de créer une fonction et ça me donne le code suivant, malheureusement, ça ne marche pas.
    D'après le Serial.print, la valeur interrupteur reste bloquée sur 0.
    Je dois avoir un problème de return (d'ailleurs elle ne retourne rien cette fonction...)
    Donc si quelqu'un avait une petite idée elle serait bien venue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    const int buttonPin = 2;    //pin pour le bouton
    const int ledPin =  13;     //pin pour la lED
     
    int interrupteur = LOW;       //valeur de l'interrupeteur
    int toggle = 0;             //valeur pour changement d'état du bouton
    int buttonState = 0;        //etat fugitif du bouton    
     
     
    void setup() {
      Serial.begin(9600);
      // Initialisation de la LED en sortie
      pinMode(ledPin, OUTPUT);     
      // Initialisation du bouton en entrée
      pinMode(buttonPin, INPUT);    
    }
     
    void loop(){
      onOffSwitch(ledPin, buttonPin, toggle, interrupteur);   
    }
     
     
    int  onOffSwitch(int ledPin, int buttonPin, int toggle, int interrupteur) {
        buttonState = digitalRead(buttonPin);
     
       // DEBUG
        Serial.print("buttonState: ");
        Serial.println(buttonState);
     
        //On regarde si le bouton est pressé
          if (buttonState == HIGH) {           
        //on regarde si il y a un changement d'état
          if (toggle == 1) {
            // on change l'état du bouton
              interrupteur=!interrupteur;
            // on reinitialise le toggle
              toggle=0;
          // on affiche l'état de l'interupteur virtuel sur la led
          digitalWrite(ledPin, interrupteur); 
        }     
      } else {
        //le bouton n'est pas pressé, on active le toggle
        toggle=1;
      }
     
    // DEBUG
    Serial.print("ledPin : ");
    Serial.println(ledPin) ;
    Serial.print("buttonPin : ");
    Serial.println(buttonPin) ;
    Serial.print("toogle : "); 
    Serial.println(toggle) ;
    Serial.print("interrupteur : ");
    Serial.println(interrupteur) ;
    }
    PS : je débute ....

  2. #2
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour cyrille_b
    Citation Envoyé par cyrille_b Voir le message
    Je dois avoir un problème de return (d'ailleurs elle ne retourne rien cette fonction...)
    Pour que ta fonction int onOffSwitch retourne quelque chose il faut le lui dire par, si tu veux la valeur de toggle, par un:

    Il faut savoir que, où que tu sois dans ta fonction, avec return, tu la quittes.

    Et pour l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     void loop(){
    	 int toggleState = onOffSwitch(ledPin, buttonPin, toggle, interrupteur);
    	 Serial.println(toggleState);
     }
    Si j'ai bien compris, tu veux une fonction qui fasse On/Off sur une sortie passée en argument, cette fonction retourne l'état de la sortie traitée?

    Cordialement
    jpbbricole

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    j'ajouterais également dans le code un petit delay() de quelques millisecondes pour supprimer les rebonds du bouton

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 279
    Par défaut
    Bonsoir

    Le problème du pourquoi cela ne fonctionne plus quand tu implémentes la fonction est un problème de portée des variables.

    Lorsque tu écris int onOffSwitch(int ledPin, int buttonPin, int toggle, int interrupteur) tu définis 4 variables locales à la fonction dont la valeur est initialisée à chaque appel de la fonction par les paramètres de l'appel. Ces 4 variables sont différentes des 2 variables et 2 constantes globales définie au début bien que ayant les mêmes noms .
    De ce fait les éventuelles modifications apportées aux deux variables globales dans le premier code interrupteur=!interrupteur;, toggle=0; et toggle=1; le sont dans le deuxième code uniquement aux variables locales de la fonction et sont perdu à la fin de la fonction. A l'appel suivant c'est à nouveau les valeurs par défaut des variables globales qui sont prises en compte.

    Une des méthodes de résoudre cela c'est de passer les variables par référence à la fonction (principe du langage C). Mais la LedPin n'a pas d’intérêt d'être géré par la fonction. La fonction devrait renvoyer l'état de interrupteur, ou même carrément renvoyer un bool indiquant si il faut toggeler interrupteur (dans ce cas la fonction n'aurait que 2 arguments: buttonPin et toggle dont je trouve le nom mal défini, previousState serait un meilleur choix à condition que le code corresponde à cela).

    L'une des possibilité en méthode C++: on crée une classe gérant une entrée, avec un constructeur pour initialisation, trois variables internes et une fonction qui doit être appelée dans la boucle (et qui renverrait l'état d'interrupteur.)

    Mais là je pense que faire un tuto sur les bases du C/C++ ne serait pas si mal.

    Bonne suite

    Delias

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 46
    Par défaut
    Merci pour ces précisions
    J'ai récupéré de la doc sur les variables par référence et les fonctions
    Je vais potasser tout cela et reviens vers vous si nécessaire
    Merci

  6. #6
    Membre très actif
    Avatar de ryankarl65
    Homme Profil pro
    Data Engineer
    Inscrit en
    Juillet 2013
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Data Engineer

    Informations forums :
    Inscription : Juillet 2013
    Messages : 104
    Par défaut
    Je peux te depanner avec un bout de code
    Si ca te dis.

    Ta logique actuelle n'est pas tres bonne.

    pour switcher un etat a partir d'une function, tu as uniquement besoin du PIN en question.
    Dans la fonction tu peux reccuperer son etat et l'inverser. De plus, un bouton est liee a un interrupteur, toujours gerable dans la function


    EXEMPLE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void switchValueOfInteruptor(int pinInterrupteur){
     
    //Tu defines ICI, les constants et variables locales   du style :    int etatActuel;
    //Nous connaisons la led et lnterrupteur lie au bouton presse)
     
    // On reccupere l'etat actuel de l'interrupteur 
    //  etatActuel  recoit != etatActuel
     
    delay(100);
    }

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 46
    Par défaut
    OK merci bien,
    j'ai avancé dans mes lectures,
    je teste bientôt et donne un retour

Discussions similaires

  1. [Débutant] Lancement d'une fonction avec un bouton poussoir
    Par michelmich dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 09/10/2015, 09h27
  2. Réponses: 7
    Dernier message: 21/11/2014, 14h02
  3. appel de fonction par bouton poussoir
    Par celtic29 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 02/05/2012, 11h51
  4. Réponses: 2
    Dernier message: 11/05/2009, 15h25
  5. Fonction qui rend nul le bouton d'alimentation ?
    Par rpoulin dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2005, 05h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo