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

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 19
    Points : 9
    Points
    9

    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 actif Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatique
    Inscrit en
    février 2013
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : février 2013
    Messages : 130
    Points : 242
    Points
    242

    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
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

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

    Informations forums :
    Inscription : avril 2004
    Messages : 7 052
    Points : 9 806
    Points
    9 806

    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
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : septembre 2008
    Messages : 733
    Points : 2 296
    Points
    2 296

    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 19
    Points : 9
    Points
    9

    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 habitué
    Avatar de ryankarl65
    Homme Profil pro
    DIRECTEUR GENERAL
    Inscrit en
    juillet 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : DIRECTEUR GENERAL

    Informations forums :
    Inscription : juillet 2013
    Messages : 71
    Points : 155
    Points
    155

    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);
    }
    Shakespeare: "Je me sens toujours heureux, vous savez pourquoi...?
    Parce que je n'attends rien de personne... Les attentes font toujours mal, la vie est courte. Aimez votre vie, soyez heureux, gardez le sourire et souvenez vous: Avant de parler écoutez, Avant d'écrire réfléchissez, Avant de prier pardonnez, Avant de blesser considérez l'autre, Avant de déteste aimez... Et avant de mourir vivez"

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 19
    Points : 9
    Points
    9

    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, 10h27
  2. Réponses: 7
    Dernier message: 21/11/2014, 15h02
  3. appel de fonction par bouton poussoir
    Par celtic29 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 02/05/2012, 12h51
  4. Réponses: 2
    Dernier message: 11/05/2009, 16h25
  5. Fonction qui rend nul le bouton d'alimentation ?
    Par rpoulin dans le forum Langage
    Réponses: 7
    Dernier message: 09/10/2005, 06h03

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