détection appui long ou court avec arduino

a marqué ce sujet comme résolu.

Bonjour,

Je souhaite réaliser un programme qui détecte un appui long (long après 1.5s)ou court. selon le type de d'appui, une action différente se produit. appui court , led verte allumée, appui long led rouge allumé le tout pendant 10s. j' ai réalisé un programme, mais en simulation il ne marche pas. et je ne vois pas pourquoi. je n'ai pas la possibilité de le tester autrement. Voici mon programme.

 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
int compt=0;
int etat=LOW;
const int Bouton = 2;
const int ledV = 3;
const int ledR = 4;

void setup() 
{
 pinMode(Bouton, INPUT); 
 pinMode(ledR, OUTPUT);
 pinMode(ledV, OUTPUT);
}

void loop() {


if (appuieLong()==1)
{
  digitalWrite(ledV, HIGH);//allume led verte
  delay(10000);
  digitalWrite(ledV, LOW);//allume led verte
}
else
{
  digitalWrite(ledR, HIGH); //allume led rouge
  delay(10000);
  digitalWrite(ledR, LOW);  // eteint led rouge
}

}



int appuieLong()
{
etat = digitalRead(Bouton); //lecture de l'etat du bouton. si il est pressé etat = high
while (etat == HIGH ) // tant que le bouton est appuyé
{

    delay(750); // delai de 750ms
    compt=compt+1;  //
}   
    if ( compt >= 2 ) // si superieur a 1.5s appui long
         {
          return (1);

         }
    else 
        {
        return (0);
        }
}

Si vous pouviez me faire un retour. merci.
Je débute 

Salut,

Dans la boucle while, tu ne modifie jamais la valeur de la variable etat.

De plus, tu ne remet jamais la variable compt à 0

Je te laisse chercher pour corriger ces deux erreur. En espérant que ma réponse peux t'aider

+1 -0

Voici une solution (testée) utilisant une interruption matérielle : (nouveau membre, je ne sais pas encore mettre le code dans un cadre…)

 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
/* 
 *  appui_court_ou_long.ino
 *  uses hardware interrupt 0
 *  at power On, "lamp test"
 *  leds off as long as the button is pressed
 *  short push green on, long red on
 *  state maintained up to next push
 */
#define int0PushButton 2

#define redLed 3
#define greenLed 4
#define THRESHOLD 1000 //ms
int state = -1; //-1 idle, 0 just pushed, 1 just released
unsigned long millisStart;
boolean longPush;
void Reagir() {
  state = digitalRead(int0PushButton);
  digitalWrite(greenLed, LOW);
  digitalWrite(redLed, LOW);
}
void setup() {

  attachInterrupt(0, Reagir, CHANGE);
  pinMode(int0PushButton, INPUT_PULLUP);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  digitalWrite(greenLed, HIGH);
  digitalWrite(redLed, HIGH);
}

void loop() {

  if (state == 0) {
    state = -1;
    millisStart = millis();
  }
  if  (state == 1) {
    state = -1;
    longPush = (millis() - millisStart) > THRESHOLD;
    digitalWrite(redLed, longPush);
    digitalWrite(greenLed, !longPush);

  }
}

Edit Ymox : déplacé le début du bloc de code pour englober les 8 premières lignes

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte