Forum Électro-Bidouilleur

Merci de vous connecter ou de vous inscrire.

Connexion avec identifiant, mot de passe et durée de la session
Recherche avancée  

Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Auteur Sujet: Programmation condition Arduino  (Lu 3245 fois)

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #15 le: Janvier 29, 2023, 04:31:21 pm »

Ca me parait compliqué comme programme.
De plus j'ai l'impression que boutonA et boutonB sont inversés.
IP archivée

Etienne_74

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #16 le: Février 13, 2023, 07:17:30 pm »

La proposition de ChatGPT n'est pas si mal, je m'en suis inspiré pour obtenir ça :

const byte buttonA = 2;    // déclarer la broche du bouton A
const byte buttonB = 3;    // déclarer la broche du bouton B
const byte led = 13;       // déclarer la broche de la LED

byte buttonAState;         // variable pour stocker l'état actuel du bouton A
byte buttonBState;         // variable pour stocker l'état actuel du bouton B
byte lastButtonBState = 0; // variable pour stocker l'état précédent du bouton B
bool LedState = false;        // mémoriser l'état de la LED

void setup()
{
   pinMode(buttonA, INPUT);    // configurer la broche du bouton A comme entrée
   pinMode(buttonB, INPUT);    // configurer la broche du bouton B comme entrée
   pinMode(led, OUTPUT);       // configurer la broche de la LED comme sortie
}

void loop()
{
  buttonAState = digitalRead(buttonA); // lire l'état actuel du bouton A
  buttonBState = digitalRead(buttonB); // lire l'état actuel du bouton B

  // vérifier si le bouton B est pressé (passe de LOW à  HIGH) ET si le bouton A est déjà  pressé
  if (lastButtonBState == LOW && buttonBState == HIGH && buttonAState == HIGH)
  {
    // C'est ICI que tu mets ton code utile
    // Moi, j'ai mis "allume ou éteins la LED"
    LedState = !LedState;     // inverser l'état (virtuel) de la LED
    digitalWrite(led, LedState); // commuter la LED
    // Fin du code utile
   
    delay(100);                  // Delai de 100ms pour laisser passer les rebonds de contact
  }
  lastButtonBState = buttonBState; // mettre à  jour l'état précédent du bouton B
}

J'utilise des byte plutôt des int car 8 bits suffisent pour ce genre de variables.
Le fonctionnement est simple : lorsque le bouton B est enfoncé (passe de LOW à  HIGH), je vérifie que le bouton A est à  HIGH. Si c'est le cas, j'exécute mon code "utile" puis je fais une pause de 100ms (à  ajuster en fonction de la qualité des boutons) pour qu'un rebond ne déclenche pas une deuxième exécution.
Ensuite, je mets à  jour la variable "lastButtonBState" qui permet de détecter un changement d'état du bouton B.

La ligne if (lastButtonBState == LOW && buttonBState == HIGH && buttonAState == HIGH) aurait pu s'écrire
if (!lastButtonBState && buttonBState && buttonAState) mais c'est moins facile à  comprendre pour un débutant et, bizarrement, ça crée un code plus long!  :o
Idem si j'utilise des bool plutôt que des byte pour les boutons, le code est plus long...
IP archivée

Etienne_74

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #17 le: Février 13, 2023, 09:09:02 pm »

Si, comme papyblue, je connectais mes boutons à  la masse et utilisais les PullUp internes, mon code deviendrait :

const byte PRESSED = LOW;        // Définir un nom parlant pour l'état pressé
const byte RELEASED = HIGH;      // et pour l'état relâché
const byte buttonA = 2;          // déclarer la broche du bouton A
const byte buttonB = 3;          // déclarer la broche du bouton B
const byte led = 13;             // déclarer la broche de la LED

byte buttonAState;         // variable pour stocker l'état actuel du bouton A
byte buttonBState;         // variable pour stocker l'état actuel du bouton B
byte lastButtonBState = 0; // variable pour stocker l'état précédent du bouton B
bool LedState = false;     // mémoriser l'état de la LED

void setup()
{
   pinMode(buttonA, INPUT_PULLUP);    // configurer la broche du bouton A comme entrée
   pinMode(buttonB, INPUT_PULLUP);    // configurer la broche du bouton B comme entrée
   pinMode(led, OUTPUT);              // configurer la broche de la LED comme sortie
}

void loop()
{
  buttonAState = digitalRead(buttonA); // lire l'état actuel du bouton A
  buttonBState = digitalRead(buttonB); // lire l'état actuel du bouton B

  // vérifier si le bouton B est pressé (passe de RELEASED à  PRESSED) ET si le bouton A est déjà  pressé
  if (lastButtonBState == RELEASED && buttonBState == PRESSED && buttonAState == PRESSED)
  {
    // C'est ICI que tu mets ton code utile
    // Moi, j'ai mis "allume ou éteins la LED"
    LedState = !LedState;        // inverser l'état (virtuel) de la LED
    digitalWrite(led, LedState); // commuter la LED
    // Fin du code utile
   
    delay(100);                  // Délai de 100ms pour laisser passer les rebonds de contact
  }
  lastButtonBState = buttonBState; // mettre à  jour l'état précédent du bouton B
}

J'ai donc défini deux nouvelles constantes, PRESSED et RELEASED, qui valent respectivement LOW et HIGH pour que mon code reste facile à  lire malgré l'inversion des états logiques sur les boutons. J'ai aussi ajouté _PULLUP sur les pinMode() des boutons A et B. Pour le reste, rien n'a changé...  à  tort d'ailleurs car la déclaration-initialisation de lastButtonBState (byte lastButtonBState = 0;) aurait dû devenir byte lastButtonBState = RELEASED; mais ça coûte 24 octets (une fortune dans le monde du 8 bit) et je suis un radin !    Donc ma justification sera : ça permet de ne pas lancer la routine si les boutons sont appuyés à  la mise sous tension ;)  Et si j'assumais complètement, j’aurais dû écrire byte lastButtonBState = PRESSED;  ::)

Par contre, mon éditeur de texte Arduino (V1.8.19) colore (syntaxique) les mots PRESSED et RELEASE en bleu-vert comme comme s'il s'agissait de mots réservés...  ???

Pour ceux qui ne sont pas déjà  tombé dessus, voici une page qui semble intéressante : Arduino Push Button – Complete Tutorial (mais je n'ai pas encore tout lu...)
« Modifié: Février 13, 2023, 09:44:48 pm par Etienne_74 »
IP archivée