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 2711 fois)

welderben

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Programmation condition Arduino
« le: janvier 22, 2023, 11:04:51 am »

Bonjour les bidouilleurs !!

Je cherche à  programmé 2 bouttons sur arduino de façon à  ce que si jappuie sur A  (je jarde Appuyé) Et jappuie sur B ça fait une action
mais que si jappuie dans le désordre   B  (je jarde Appuyé) ensuite jappuie sur le A aucune accion doit se produire.
Voila des jours que je recherche comment faire je suis débutant en programmation et je ne trouve rien.

à  date la seule façon que j'y Arrive ces en utilisant une bascule D-Latch il doit bien avoir un moyen de programmer ça ??

Quelqu'un à  une idée ?

Merci
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #1 le: janvier 22, 2023, 01:03:12 pm »

Bonjour welderben,
En fait, vous avez la solution! La basule D mémorise l'action sur A. Il n'y a pas de solution en logique combinatoire mais en logique séquentielle. Dans ce cas en général on utilise les tableaux de Karnaugh.
PB
IP archivée

welderben

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Re : Re : Programmation condition Arduino
« Réponse #2 le: janvier 22, 2023, 07:19:10 pm »

Bonjour welderben,
En fait, vous avez la solution! La basule D mémorise l'action sur A. Il n'y a pas de solution en logique combinatoire mais en logique séquentielle. Dans ce cas en général on utilise les tableaux de Karnaugh.
PB

Oui après tout les recherche que j'ai fait je crois que j'aurai pas le choix d'y allé avec la bascule D-Latch
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #3 le: janvier 23, 2023, 03:10:26 am »

Bonjour Welderben,
La bascule D c'est une image, je ne voulais pas dire qu'il faut ajouter du hardware. Il faut ajouter une fonction de mémorisation d'un état, un booléen fera l'affaire !
Ce que vous devez coder c'est une machine d'état même si elle est extremement simple puisqu'elle n'a que deux entrées et une sortie. Faites des recherches sur : machine d'état, machine à  état finis, graphes d'états, grafcets,...
Dans la pratique comment faire ?
C'est plutôt simple, vous identifiez le nombre d'états stables du système puis vous regardez les conditions à  remplir pour passer d'un état à  l'autre.
Pour la programmation, en C on utilise en général un "switch case" , mais dans un cas simple une bonne paire de "if" fera l'affaire.

PB
« Modifié: janvier 23, 2023, 03:30:38 am par papyblue »
IP archivée

welderben

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #4 le: janvier 23, 2023, 11:31:45 am »

ok Merci je vais faire des rechercher ladessus
IP archivée

welderben

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Re : Re : Programmation condition Arduino
« Réponse #5 le: janvier 23, 2023, 01:42:26 pm »

Bonjour Welderben,
La bascule D c'est une image, je ne voulais pas dire qu'il faut ajouter du hardware. Il faut ajouter une fonction de mémorisation d'un état, un booléen fera l'affaire !
Ce que vous devez coder c'est une machine d'état même si elle est extremement simple puisqu'elle n'a que deux entrées et une sortie. Faites des recherches sur : machine d'état, machine à  état finis, graphes d'états, grafcets,...
Dans la pratique comment faire ?
C'est plutôt simple, vous identifiez le nombre d'états stables du système puis vous regardez les conditions à  remplir pour passer d'un état à  l'autre.
Pour la programmation, en C on utilise en général un "switch case" , mais dans un cas simple une bonne paire de "if" fera l'affaire.

PB


Bon ben après des heures de recherche sur les boolen machine d'état et tout je ne trouve toujours comment faire l'équivalent de la Bascule D-Latch
sur Arduino ces à  croire que personne na jamais fait ça comme moi je veut le faire.
alors je pense que je vais acheté une Bascule D-Latch tout fait et je vais arrêté de me cassé la tête avec de la programmation !
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #6 le: janvier 23, 2023, 02:26:27 pm »

Bonsoir,
Voici un exemple ( à  vérifier que les transistions sont celles que vous souhaitez.

#include <stdio.h>

void main() {

int etat = 0 ;
   int A,B ,S;
while(1)
{
printf("\n A = ");
scanf("%d",&A);
printf("\n B = ");
scanf("%d",&B);   
switch (etat){

case 0 : if (A &&!B)
   {
      etat    = 1 ;
      S= 0 ;
   }
   printf("\n Sortie = %d",S);
      break;
case 1 : if (A=0) etat = 0 ;
        else if ( B)
          {
          etat= 2 ;
          S= 1 ;          
          }
          printf("\n Sortie = %d",S);
          break;
case 2 : if ( !B)
                {
      etat = 1 ;
      S= 0 ;
      };
      if (!A)
       {
       etat = 0 ;
       S=0;
       }
       printf("\n Sortie = %d",S);
       break;
     }   
 }     
}
IP archivée

welderben

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
Re : Re : Programmation condition Arduino
« Réponse #7 le: janvier 23, 2023, 04:54:19 pm »

Bonsoir,
Voici un exemple ( à  vérifier que les transistions sont celles que vous souhaitez.

#include <stdio.h>

void main() {

int etat = 0 ;
   int A,B ,S;
while(1)
{
printf("\n A = ");
scanf("%d",&A);
printf("\n B = ");
scanf("%d",&B);   
switch (etat){

case 0 : if (A &&!B)
   {
      etat    = 1 ;
      S= 0 ;
   }
   printf("\n Sortie = %d",S);
      break;
case 1 : if (A=0) etat = 0 ;
        else if ( B)
          {
          etat= 2 ;
          S= 1 ;          
          }
          printf("\n Sortie = %d",S);
          break;
case 2 : if ( !B)
                {
      etat = 1 ;
      S= 0 ;
      };
      if (!A)
       {
       etat = 0 ;
       S=0;
       }
       printf("\n Sortie = %d",S);
       break;
     }   
 }     
}



Je dois téléchargé une bibliotheque pour ce code ?  (#include <stdio.h>)
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #8 le: janvier 24, 2023, 04:55:37 am »

Bonjour welderben,
Le code que j'ai écrit sous Linux était destiné à  illustrer le fonctionnement d'une machine d'état, pas à  être recopié tel quel.
Les instructions scanf et printf ne fonctionnent pas dans l'environnement Arduino et elles ne sont là  que pour la vérification du bon fonctionnement du code.
Dans le code j'ai mis 3 états (ce qui nécessite 2 bits) or vous, vous obtenez un fonctionnement correct avec une seule bascule (donc 1 seul bit).
Comme dit précedemment, une paire de "if" suffit :
votre code Arduino pourrait ressembler à  ça :

bool A,B,M,S ;

// dans la boucle infinie

// lecture des états A et B
// puis
if (A && !B ) {M=true;}
if( !A) {M=false ;}
S = M && B ;
« Modifié: janvier 24, 2023, 05:03:06 am par papyblue »
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino chatgpt !!!
« Réponse #9 le: janvier 26, 2023, 03:57:26 pm »

Bonjour à  tous,

On peut aussi demander à  chatGPT d'écrire le code ...

peux-tu écrire un programme pour arduino qui quand j'appuie sur le bouton A puis sur le bouton B allume une led mais qui n'allume pas la led si j'appuie d'abord sur B ?
Voici un exemple de code pour Arduino qui allume une LED lorsque le bouton A est appuyé, puis le bouton B est appuyé, mais qui n'allume pas la LED si le bouton B est appuyé en premier :

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

int buttonAState = 0;   // variable pour stocker l'état actuel du bouton A
int buttonBState = 0;   // variable pour stocker l'état actuel du bouton B
int lastButtonAState = 0; // variable pour stocker l'état précédent du bouton A
int lastButtonBState = 0; // variable pour stocker l'état précédent du bouton B
bool buttonABPress = false; // variable pour indiquer si les boutons A et B ont été pressés

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 A est pressé
  if (buttonAState == HIGH && lastButtonAState == LOW) {
    lastButtonAState = buttonAState; // mettre à  jour l'état précédent du bouton A
    buttonABPress = true; // indiquer que le bouton A a été pressé
  }
  // vérifier si le bouton B est pressé
  if (buttonBState == HIGH && lastButtonBState == LOW) {
lastButtonBState = buttonBState; // mettre à  jour l'état précédent du bouton B
if (buttonABPress) { // vérifier si le bouton A a été pressé avant B
digitalWrite(led, HIGH); // allumer la LED
buttonABPress = false; // remettre la variable à  false pour la prochaine utilisation
} else {
buttonABPress = false; // remettre la variable à  false pour la prochaine utilisation
}
}
lastButtonAState = buttonAState; // mettre à  jour l'état précédent du bouton A
lastButtonBState = buttonBState; // mettre à  jour l'état précédent du bouton B
}

Copy code
Il faut noter que les broches 2 et 3 sont utilisées ici pour les boutons A et B, il faut donc vérifier si ces broches sont disponibles sur votre carte Arduino. Il faut également vérifier si la broche 13 est disponible pour la LED.


Je n'ai pas vérifié le fonctionnement mais c'est bluffant !
« Modifié: janvier 27, 2023, 02:17:15 pm par papyblue »
IP archivée

F1PNX

  • Full Member
  • ***
  • Messages: 160
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #10 le: janvier 28, 2023, 03:11:40 am »

Bonjour Papyblue,

Si j'ai un moment je vais tester le sketch de ChatGpt, c'est bluffant en effet mais uniquement s'il fonctionne...

Bon week-end.

Jack
« Modifié: janvier 28, 2023, 03:34:00 am par F1PNX »
IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #11 le: janvier 28, 2023, 05:41:58 am »

Bonjour,

Le sketch de chgpt mémorise si la touche A a été pressée et non si la touche A est pressée
Donc tu appuies sur A, tu le relâches et 1/2 heure plus tard tu appuies sur B et ça allume la led.
Apparemment tu demandes que A  reste appuyé pour déclencher l'action.

Pour faire ça je propose de modifier le code comme ça
const int buttonA = 2;  // déclarer la broche du bouton A
const int buttonB = 3;  // déclarer la broche du bouton B
const int led = 13;     // déclarer la broche de la LED

int lastButtonBState = 0;    // variable pour stocker l'état précédent du bouton B

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() {
  int buttonAState = digitalRead(buttonA);  // lire l'état actuel du bouton A
  int buttonBState = digitalRead(buttonB);  // lire l'état actuel du bouton B

  // vérifier si le bouton B est pressé
  if (buttonBState == HIGH && lastButtonBState == LOW && buttonAState== HIGH) {
    digitalWrite(led, !digitalRead(led));  // inverse état led
  }
  lastButtonBState = buttonBState;  // mettre à  jour l'état précédent du bouton B
 
  delay(20);  // pour anti-rebond
}
« Modifié: janvier 28, 2023, 06:42:52 am par kamill »
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #12 le: janvier 28, 2023, 11:09:39 am »

Bonjour kamill,
Ma demande à  ChatGpt n'était pas assez contrainte, le jeu maintenant consiste à  trouver la bonne demande pour qu'il nous fasse directement le bon code.Ou bien en lui demandant un correctif après coup ?
Je pense qu'il y a de quoi s'amuser avec ce truc en en cherchant les limites.

PB
IP archivée

kamill

  • Jr. Member
  • **
  • Messages: 55
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #13 le: janvier 28, 2023, 11:52:12 am »

Bonjour papyblue,

Oui, mais quand on voit ça par exemple, on se dit que chatgpt a encore quelques progrès à  faire en programmation  :)
    if (buttonABPress) {              // vérifier si le bouton A a été pressé avant B
      digitalWrite(led, HIGH);        // allumer la LED
      buttonABPress = false;          // remettre la variable à  false pour la prochaine utilisation
    } else {
      buttonABPress = false;  // remettre la variable à  false pour la prochaine utilisation
    }
IP archivée

papyblue

  • Administrator
  • Hero Member
  • *****
  • Messages: 747
    • Voir le profil
Re : Programmation condition Arduino
« Réponse #14 le: janvier 29, 2023, 05:05:56 am »

Bonjour,

Le résultat est très dépendant de la façon que la question est posée. Des corrections sont possibles également exemple :

peux tu écrire un programme Arduino qui quand j'appuie et maintiens un bouton A et puis appuie sur un bouton B allume une led mais qui n'allume pas la led si j'appuie sur B en premier ?
Oui, voici un exemple de code Arduino qui répond à  ce critère :

scss
Copy code
const int buttonA = 2;
const int buttonB = 3;
const int led = 13;
bool buttonBPressed = false;

void setup() {
  pinMode(buttonA, INPUT_PULLUP);
  pinMode(buttonB, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  if (digitalRead(buttonA) == LOW) {
    while (digitalRead(buttonA) == LOW);
    if (digitalRead(buttonB) == LOW) {
      buttonBPressed = true;
      while (digitalRead(buttonB) == LOW);
    }
  } else if (digitalRead(buttonB) == LOW && buttonBPressed) {
    digitalWrite(led, HIGH);
    delay(1000);
    digitalWrite(led, LOW);
    buttonBPressed = false;
  }
}
Ce code utilise les constantes buttonA, buttonB et led pour définir les broches reliées aux boutons et à  la LED. La variable buttonBPressed est utilisée pour mémoriser si le bouton B a déjà  été appuyé pendant que le bouton A est enfoncé. La fonction setup configure les broches en entrée ou en sortie, avec une résistance de pull-up pour les boutons. La fonction loop contrôle l'état des boutons et allume la LED en conséquence.




Papy Blue
peux-tu refaire le programme sans l'instruction "while" ?
Oui, voici un exemple de code sans utiliser la boucle while :

csharp
Copy code
const int buttonA = 2;
const int buttonB = 3;
const int led = 13;
bool buttonBPressed = false;
bool buttonAReleased = true;

void setup() {
  pinMode(buttonA, INPUT_PULLUP);
  pinMode(buttonB, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  if (digitalRead(buttonA) == LOW && buttonAReleased) {
    buttonAReleased = false;
    if (digitalRead(buttonB) == LOW) {
      buttonBPressed = true;
    }
  } else if (digitalRead(buttonA) == HIGH) {
    buttonAReleased = true;
  } else if (digitalRead(buttonB) == LOW && buttonBPressed) {
    digitalWrite(led, HIGH);
    delay(1000);
    digitalWrite(led, LOW);
    buttonBPressed = false;
  }
}
Dans ce code, la variable buttonAReleased est utilisée pour mémoriser l'état du bouton A, et la condition buttonAReleased est vérifiée pour déterminer si le bouton A vient d'être appuyé. La boucle while a été remplacée par une vérification de l'état du bouton A à  chaque tour de boucle.
IP archivée