comment demarrer programme avec bouton poussoir

Bonjour amis de l'arduino

je suis novice dans ce domaine ,mais je suis en train de faire un robot à partir d'un arduino UNO et je souhaiterai de mettre un bouton poussoir pour démarrer ou stopper le programme.
Sauf que je ne sais pas comment faire ce code si quelqu'un pourrait m’éclairer sur ce point.
merci d'avance

void setup() {
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  while(!digitalRead(2))
  {
     /* Ton programme */
  }

Et tu branches ton bouton en 2.

Si tu as d'autres question n'hésites pas.

Tuto d' Eskimon !
À lire en urgence !

Dans le cas d'un robot, bloquer le programme ne mettra pas forcément à l'arrêt les systèmes électriques autour de l'arduino.

Oui tu peux faire avec un bouton poussoir, mais il te faut aussi coder des fonctions qui permettent d'arrêter /démarrer proprement tous les systèmes.

merci pour vos réponse cela ma fortement aider

Bonjour à tous,

J'annonce je suis suis un gros débutant, j’espère avoir une réponse pédagogique sur mon problème.
Je cherche à lancer un programme en appuyant sur un bouton. car quand je connecte l'Arduino il fait ça vie tout seul. J aimerai lui dire là, maintenant, tu lances la Loop à l'aide d'un bouton.
J'ai essayé le code de maxpeigne plus haut mais cela ne fonctionne pas. quand je lance mon programme se met en route directement.
.

L'INSTALLATION :
J'utilise 1 moteur avec un mosfet L298N, avec une alim 12v. et j'ai un bouton poussoirs.Tout semble relié correctement. le programme lance bien le moteur.
Pour le bouton je pars du 5v arduino, ensuite R de 10k , je vais sur pin 2 et sur bouton (bouton protégé par condensateur 10uF et enfin sur le ground.
Shema inspiré. j ai utilisé les pin 10-8-9 pour mon moteur. ci dessous.

PROGRAMME
J'ai essayé d'autre solution voici la dernière :
Etant mauvais, je me suis servis de plusieurs tuto pour assembler ce code. Dons celui d'Eskimon.
A la fin pour couper le programme j'ai cracké sur le delay...

int enA = 10;                   // crée une variable de type "int", nommée "enA" et attachée à la Broche 10, qui permet de gérer la vitesse du moteur.
int in1 = 9;                    // crée une variable de type "int", nommée "in1" et attachée à la Broche 9, qui permet de gérer le sens de rotation.
int in2 = 8;                    // crée une variable de type "int", nommée "in2" et attachée à la Broche 8, qui permet de gérer l'autre sens de rotation.
const int bouton = 2;           // un bouton sur la broche 2
int etatBouton;                 // variable qui enregistre l'état du bouton

void setup() {              // Void Setup ------------------------------------------------------------------------------------------------------------------------------------------
pinMode(2, INPUT); 
pinMode(enA, OUTPUT);         // indique que la broche de la variable "enA" donc ici la PIN 10, est une sortie.
  pinMode(in1, OUTPUT);         // indique que la broche de la variable "in1" donc ici la PIN 9, est une sortie.
  pinMode(in2, OUTPUT);         // indique que la broche de la variable "in2" donc ici la PIN 8, est une sortie.
pinMode(bouton, INPUT);
etatBouton= HIGH;
}


void loop() {               // Void Loop -------------------------------------------------------------------------------------------------------------------------------------------
  
etatBouton = digitalRead(bouton); // Rappel : bouton = 2

    if (etatBouton == HIGH) // test si le bouton a un niveau logique HAUT
    {
  digitalWrite(in1,HIGH);      // envoie l'électricité dans la broche in1 (donc la PIN 9)ce qui fait donc tourner le moteur dans le sens de rotation de in1.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur peut donc continuer à tourner dans le sens de in1.
  analogWrite(enA,200);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2500);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes.

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes. 
 
  digitalWrite(in1,LOW);       // met la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur ne tourne pas dans le sens de in1.
  digitalWrite(in2,HIGH);      // envoie l'électricité dans la broche in2 (donc la PIN 8)ce qui fait donc tourner le moteur dans le sens de rotation de in2.
  analogWrite(enA,70);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2500);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes. 

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes. 
}
else  // test si le bouton a un niveau logique différent de HAUT (donc BAS)
    delay(100000000000000000000000);
}

J’espère avoir de l'aide,

Merci 'avance Duocalment.

C'est normal, voici une version qui devrait marcher:

void setup() {
 pinMode (2, INPUT_PULLUP);
 while (digitalRead(2)); // On ne fait rien tant que le bouton n'est pas appuyé
}

void loop() {
     /* Ton programme */
 }

Le bouton doit être branché comme ceci : GND -- Bouton -- pin D2

Arkhyne:
, ensuite R de 10k , je vais sur pin 2 et sur bouton (bouton protégé par condensateur 10uF et enfin sur le ground.

Le condensateur de 10uf(micro farad) c'est ce que tu as mis? Si oui, cest trop important.. faut baisser a quelques centaines de nano farad. Avec 10 micro farad, le temps de réaction de l'entrée pourrais passer de quelque micro secondes a... quelques secondes ou plus..

Bonjour merci pour vos réponses,

Arzou:
Le condensateur de 10uf(micro farad) c'est ce que tu as mis?

Erreur de frappe j'ai mi du 10nf. condensateur céramique.

lesept:
C'est normal, voici une version qui devrait marcher:

void setup() {

pinMode (2, INPUT_PULLUP);
while (digitalRead(2)); // On ne fait rien tant que le bouton n'est pas appuyé
}

void loop() {
    /* Ton programme */
}

J'ai testé ça dans le setup , rien ne fonctionne. aucune réaction du bouton.
Au sujet du bouton je suis étonné de ton branchement.

lesept:
-programmez-vos-premiers-montages-avec-arduino/3285224-le-bouton-poussoir#/id/r-3285216]branché comme ceci[/url] : GND -- Bouton -- pin D2

Il n'y à pas de 5v ? Comment je justifie l'etat LOW ou HIGH de ma pin2 dans ce cas?

Je ne trouve toujours pas de solution ,
si jamais vous avez des pistes.

Duinocalement.

Arkhyne:
Il n'y à pas de 5v ? Comment je justifie l'etat LOW ou HIGH de ma pin2 dans ce cas?

Bonjour,

Comme ça

pinMode (2, INPUT_PULLUP);

Ça active une résistance de pullup interne (entre la pin et le 5V).

kamill:
Bonjour,

Comme ça

pinMode (2, INPUT_PULLUP);

Ça active une résistance de pullup interne (entre la pin et le 5V).

ok merci, il me reste à comprendre ce qui ne va pas dans le programme.

J'ai donc changé ma connexion bouton en suivant vos conseil, j'ai également changé le code.
Malheureusement j'en suis toujours au même point.
Si quelqu'un se sent jeter un œil sur ce code, pour voir l'erreur.

int enA = 10;                   // crée une variable de type "int", nommée "enA" et attachée à la Broche 10, qui permet de gérer la vitesse du moteur.
int in1 = 9;                    // crée une variable de type "int", nommée "in1" et attachée à la Broche 9, qui permet de gérer le sens de rotation.
int in2 = 8;                    // crée une variable de type "int", nommée "in2" et attachée à la Broche 8, qui permet de gérer l'autre sens de rotation.
int bouton = 2;                 // crée une variable D2,démarrage programe.

void setup() {              // Void Setup ------------------------------------------------------------------------------------------------------------------------------------------
  pinMode(enA, OUTPUT);         // indique que la broche de la variable "enA" donc ici la PIN 10, est une sortie.
  pinMode(in1, OUTPUT);         // indique que la broche de la variable "in1" donc ici la PIN 9, est une sortie.
  pinMode(in2, OUTPUT);         // indique que la broche de la variable "in2" donc ici la PIN 8, est une sortie.
  pinMode (bouton, INPUT_PULLUP);
  while (digitalRead(bouton));       // On ne fait rien tant que le bouton n'est pas appuyé
}


void loop() {               // Void Loop -------------------------------------------------------------------------------------------------------------------------------------------
  digitalWrite(in1,HIGH);      // envoie l'électricité dans la broche in1 (donc la PIN 9)ce qui fait donc tourner le moteur dans le sens de rotation de in1.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur peut donc continuer à tourner dans le sens de in1.
  analogWrite(enA,200);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2000);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes.

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes. 
 
  digitalWrite(in1,LOW);       // met la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur ne tourne pas dans le sens de in1.
  digitalWrite(in2,HIGH);      // envoie l'électricité dans la broche in2 (donc la PIN 8)ce qui fait donc tourner le moteur dans le sens de rotation de in2.
  analogWrite(enA,200);        // défini la vitesse du moteur, ici 200 sur un maximum de 255 (échélle comprise entre 0 et 255, car cela correspond à 8 bits soit 1 octet).
  delay(2000);                 // créer un delais de 5 secondes, donc le moteur tourne pendant 5 secondes. 

  digitalWrite(in1,LOW);       // en mettant la broche in1 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  digitalWrite(in2,LOW);       // en mettant la broche in2 à l'état bas, la carte n'injecte pas d'électricité, le moteur est donc à l'arrêt.
  delay(1000);                 // créer un delais où le moteur ne tourne pas pendant 2 secondes. 
 
}

Merci d'avance,

Duinocalement.

Vérifies que ton bouton est bien cablé.

Affiches son état sur le moniteur série avec ce petit programme

const byte pinBouton=2;

void setup()
{
  Serial.begin(115200);
  pinMode(pinBouton,INPUT_PULLUP);
}

void loop()
{
  Serial.println(digitalRead(pinBouton));
  delay(300);
}

Effectivement Kamill, j'avais un faux contact avec mon condensateur céramique, la vérification ma permit de voir un problème de câblage.
Jusqu'ici vous m'avez été d'une grande aide et je vous en remercie chaleureusement.

Dernière question à ce sujet, si je veus maintenant éteindre le programme avec le même bouton ?

Duinocalement.

Ça dépend ce que veut dire éteindre le programme. Un programme ne s'éteint pas...

Si tu veux éteindre l'arduino, il faut le mettre en veille ou couper l'alimentation. Si tu veux stopper l'exécution du programme, tu peux faire dans la loop

if (! digitalRead (bouton)) while () ;

Il se mettra dans une boucle infinie au moindre appui sur le bouton

Salut Le sept,

Merci pour ta réponse, je comprend.
J'ai trouvé une solution qui ne doit pas être conventionnel mais cela fonctionne

J'avais besoin sur l'appuis d'un bouton que mes moteurs exécutent une suite d'action puis ce stop.
Et qu'en appuyant de nouveau sur le bouton que cela recommence.

j'ai essayé de replacer la commande PULLUP à la fin mais cela ne fonctionne pas.
J'ai alors placé 1 fois dans le Setup et ensuite à la fin de ma Loop et là tout fonctionne.

void setup() {
 pinMode (2, INPUT_PULLUP);
 while (digitalRead(2)); // On ne fait rien tant que le bouton n'est pas appuyé
}

Je vous remercie encore pour le partage de votre savoir. Sans vous j'y serai encore !
Le problème est RESOLU.

Duinocalement.