Un de mes projets

Portrait de bd39001@gmail.com

Bonjour,

Je suis à la recherche du programme qui me servira à effectuer un système on/off avec un bouton poussoir à rebond :

Pour mieux vous l'expliquer, je programme un robot et mon but est de commencer ma boucle par l'attente du pressage du bouton. Une fois que le bouton est appuyer, j'attend cinq secondes et je suis en combat (pour le combat, mon écran affiche un texte). Pour stopper le combat, il faut que j'appuie sur le bouton et je retourne en attente et ainsi de suite..

Je n'y arrive pas et je vous demande donc de l'aide.

Pour que vous y voyer plus clair, voici mon programme le plus récent :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define RED 3
#define BLUE 4
#define GREEN 5
#define DIP_1 A0
#define DIP_2 A1
#define DIP_3 A2
#define START A3
#define RESET_ENTREE 12
#define RESET_SORTIE 11
LiquidCrystal_I2C lcd(0x27, 20, 4);
int directionrbt;
int rotation;
void directionrobot()
{
  directionrbt = analogRead(DIP_1);
  if (directionrbt > 511) // 1
  {
    lcd.setCursor(0, 0);
    lcd.print("TOURNER A ");
  }
  if (directionrbt < 511) // 0
  {
    lcd.setCursor(0, 0);
    lcd.print("AVANCER | ");
  }
}
void rotationrobot()
{
  rotation = analogRead(DIP_2);
  if (rotation > 511) // 1
  {
    lcd.setCursor(10, 0);
    lcd.print("DROITE");
  }
  if (rotation < 511) // 0
  {
    lcd.setCursor(10, 0);
    lcd.print("GAUCHE");
  }
}
void leds()
{
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, LOW);
  delay(1000);
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, HIGH);
  delay(2000);
  digitalWrite(BLUE, HIGH);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, LOW);
  delay(1000);
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, LOW);
  delay(500);
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, LOW);
  digitalWrite(RED, LOW);
  delay(500);
  digitalWrite(BLUE, LOW);
  digitalWrite(GREEN, HIGH);
  digitalWrite(RED, LOW);
}
void leds2()
{
  bool led = false;             // On cr�er une variable pour l'�tat des leds
  while (digitalRead(START) == HIGH) // Tant que le bouton poussoir est � l'�tat haut (gr�ce � la fonction PULLUP)
  {
    if (led)                     // On fait clignoter les 2 leds pour montrer qu'on attend le go
    {
      digitalWrite(RED, LOW);
      digitalWrite(GREEN, HIGH);
    }
    else
    {
      digitalWrite(RED, HIGH);
      digitalWrite(GREEN, LOW);
    }
    led = !led;                  // on inverse la variable pour inverser l'�tat des leds
    delay(200);                  // On r�p�te l'op�ration toutes les 200ms, c'est ce qui cr�er le clignotement
  }
  while (digitalRead(START) == LOW)
  {
    digitalWrite(BLUE, LOW);
    digitalWrite(RED, LOW);
    digitalWrite(GREEN, LOW);
  }
}
void combatencours()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Combat en");
  lcd.setCursor(7, 1);
  lcd.print("cours...");
}
void attente_go()
{
  bool combat = false;
  lcd.setCursor(0, 1);
  lcd.print(combat);
  while (digitalRead(START) <= 50)
  {
    combat = !combat;
  }
  if (combat)
  {
    leds2();
    combatencours();
  }
}
void attente()
{
  rotationrobot();
  directionrobot();
}
void setup()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  lcd.init();
  Serial.begin(9600);
  bool a = false;
}
void loop()
{
  bool a;
  lcd.backlight();
  if(START == HIGH)
  {
    a = !a;
    delay(50);
  }
  if (a == false) // On attend
  {
    attente();
  }
  if (a == true) // On est en combat
  leds();
  {
    combatencours();
  }
}
Portrait de bd39001@gmail.com

Merci, je vais essayer d'adapter le programme et de le tester.

Portrait de bd39001@gmail.com

En fait, ce n'est pas tout à fait ce qu'il me faut. Je vais vous expliquer maintenant plus brièvement le programme :

Ma boucle commence avec la fonction attente() ; et ma LED RGB clignote vert, rouge vert, rouge (….) toute les 200 millisecondes (grâce à leds2(); )  tant que je n’ai pas appuyer sur le bouton.

Lorsque j’appui, ma fonction leds(); s’active mais une seule fois. Après ça, la fonction combatencours() ; se met en route tant que je n’ai pas réappuyer sur le bouton.

Et si j’appui sur le bouton, la boucle retourne au début.

Si vous voulez, j’ai arrangé le programme pour vous. Ma dernière modification ce trouve en .zip.

Portrait de bd39001@gmail.com

C’est bon, j’ai réussi à avoir le résultat que je voulais. Vous m’avez aider à comprendre et j’ai réussi. Le programme fonctionne.

Je vous dit donc à la prochaine fois !

Portrait de bd39001@gmail.com

C’est bon, j’ai réussi à avoir le résultat que je voulais. Vous m’avez aider à comprendre et j’ai réussi. Le programme fonctionne.

Je vous dit donc à la prochaine fois !