Go Down

Topic: Problème de récupération d'input pendant une boucle FOR (Read 956 times) previous topic - next topic

minooye

Nov 27, 2012, 07:39 am Last Edit: Nov 27, 2012, 09:56 am by minooye Reason: 1
Salut,
J'ai fait une boucle qui allume des LEDS sans aucune condition.
La boucle ressemble à ça :
Code: [Select]
For (i = 1 ;i<=10;i++)
{
digitalWrite(led[i], HIGH);         // J'allume la led i
EtatInput1 = digitalread(Input1); // je récupère l'état du push bouton (ouvert ou fermé)
Serial.print(EtatInput1);
delay (200)                            // J'attends 200 ms
digitalWrite(led[i], LOW);        // J'éteins la led i
}

For (i = 9 ;i>=1;i--)
{
digitalWrite(led[i], HIGH);         // J'allume la led i
EtatInput1 = digitalread(Input1); // je récupère l'état du push bouton (ouvert ou fermé)
Serial.print(EtatInput1);
delay (200)                            // J'attends 200 ms
digitalWrite(led[i], LOW);        // J'éteins la led i
}

Voilà mon souci :
Quand j'appuie sur le bouton, ma valeur EtatInput1 passe à 0.
Même si j'appuie et relache le bouton très rapidement, cette valeur reste à 0 pendant plusieurs tours de boucle aulieu de revenir à 1 (valeur quand il est relaché).
Auriez vous une idée du pourquoi de la chose ?

Merci pour votre aide !

fdufnews

Quote
Même si j'appuie et relache le bouton très rapidement,

La notion de rapidement est très subjective. Avec une temporisation de 100ms par boucle un appui rapide peut facilement durer 2 ou 3 tours de boucle voir plus si on compte le temps de rebond des contacts.

minooye

Je viens de compléter mon code (mes leds s'allument dans un sens, puis dans l'autre).
Concernant les délais, je suis monté à 200 ms pour l'allumage des leds et rajouté un delai de 10 secondes pour la lecture de l'état de mon bouton, mais ça ne change rien.

fdufnews

#3
Nov 27, 2012, 09:38 am Last Edit: Nov 27, 2012, 09:41 am by fdufnews Reason: 1
En fait j'ai l'impression que je ne comprends pas ton problème.
Tu lis l'état de l'interrupteur toutes les 200ms (à chaque itération des 2 boucles) mais tu ne prends cet état en compte qu'une fois sur 20. Je ne vois pas où est le problème.

Il faut placer le code entre les balises code (bouton # au dessus de la fenêtre de saisie) ce qui le rend plus lisible.

Il y a bien une résistance de pullup sur ton bouton?

minooye

#4
Nov 27, 2012, 09:55 am Last Edit: Nov 27, 2012, 09:57 am by minooye Reason: 1
Mon souci c'est qu'avec ce code, je m'attends à ce que l'état du bouton que je lis avec le serial.print repasse à 1 (relaché) dès que je n'appuie plus sur le bouton.

En gros si je mets un delay à 300 ms, voilà ce qui va se passer sur l'état de mon bouton que je lis les valeurs.
1 // J'ai relaché
1 // J'ai relaché
1 // J'ai relaché
0 // J'appuie
0 // j'ai relaché => Problème, ça devrait être à 1
1 // J'ai relaché
1 // J'ai relaché
1 // J'ai relaché
etc...

Ca c'est déjà un souci, mais si je baisse mon delay à 100 ms, c'est pire.
1 // J'ai relaché
1 // J'ai relaché
1 // J'ai relaché
0 // J'appuie
0 // j'ai relaché => Problème, la valeur devrait être à 1
0 // J'ai relaché => Problème, la valeur devrait être à 1
0 // J'ai relaché => Problème, la valeur devrait être à 1
1 // J'ai relaché

Il y a un gros lag entre le moment ou je relache et où la valeur lue par l'arduino est correcte.
Par contre quand j'appuie sur le bouton, la valeur est bien lue au bon moment.

Je n'ai pas mis de résistance de Pull up effectivement...

ps : j'ai modifier mon msg initial pour mettre la balise de code et virer la condition if qui n'est pas à mon avis la source du pb

fdufnews

Quote
Je n'ai pas mis de résistance de Pull up effectivement...

Je pense que ton problème vient de là. La broche met un certain temps à retrouver un état stable. A minima utilises le pullup intégré dans les IO.
si tu utilises l'IDE 1.0 ou supérieur
Code: [Select]
pinMode(INPUT_PULLUP);


si tu utilises une version de l'IDE antérieure à 1.0
Code: [Select]
pinMode(INPUT);
digitalWrite(HIGH);


minooye

Merci, je vais tester ça  ce soir en rentrant du taf  :)

minooye


Go Up