Il faut utiliser un flag (drapeau en français) : une simple variable booléenne qui traduit "tel action est arrivée".
Dans ton cas :
boolean Flag=0; // à placer en en-tête
...
if(ETAT_VY_HP==HIGH && ETAT_ROUGE==HIGH && Flag==0) {
Flag=1;
// ton code, ne s'executera qu'une fois, et ne pourra être réexecuté que si Flag est remis à 0
}
if(ETAT_ROUGE==LOW && Flag==1) Flag=0;
si le pin que tu associes à "ROUGE" est , par exemple , dans ton cas , le pin 2 ou 3 (Arduino Uno) , tu peux (puisque la condition determinante à l'air d'être "ETAT_ROUGE==LOW TO HIGH" ) aussi utiliser une interruption qui changera la valeur du flag
, ce qui donnerait :
boolean flag(0);
setup()
{
...
attachInterrutp(pin, verifEtatRouge, RISING) // "RISING" signifie "passer d'un état bas à un état haut"
...
}
loop()
{
....
if (flag) { ...... ; flag=0; }
}
verifEtatRouge ()
{
if (flag==0 && ETAT_VY_HP==1) { flag=1; }
}
Pour détecter une transition, il faut connaitre l'état présent ainsi que l'état précédent.
Il faut donc utiliser une variable qui conserve d'une itération à l'autre l'état qu'avait le signal au précédent passage.
Un petit exemple:
void loop(void){
......
ETAT_ROUGE = digitalRead(ma_broche); // lit l'état courant
......
if (ETAT_VY_HP==HIGH && ETAT_ROUGE==HIGH && ETAT_ROUGE_AVANT == LOW ){
......
}
......
ETAT_ROUGE_AVANT = ETAT_ROUGE; // conserve l'état courant pour le prochain tour
}
A noter que j'ai configuré mes boutons en mode bistable, un appui momentané du bouton poussoir "bp_rouge" entraîne un état à HIGH maintenu (et idem pour le retour à LOW). Une lecture digitalRead simple d'une entrée ne serait donc pas suffisante.
Je ne peux pas aussi utiliser la commande "attachInterrutp" , car sur mon projet les pins 2 &3 sont déjà occupés par d'autres sorties (j'utilise les 14 I/O pour ce projet).
Du coup la solution proposée par B@tto qui s'appuie exclusivement sur un booléen me semble la plus appropriée.
terch:
Je ne peux pas aussi utiliser la commande "attachInterrutp" , car sur mon projet les pins 2 &3 sont déjà occupés par d'autres sorties (j'utilise les 14 I/O pour ce projet).
Si tu utilises une carte à base ATMega328p, et seulement celui là, toutes les I/O peuvent servir pour des interruptions.
Ce n'est pas aussi direct que pour Int0 et int1, les interruptions sont gérées par port, à charge du programmeur de tester dans le port signalant une interruption qu'elle broche est responsable.
Si tu es intéressé il y a un tuto dans la rubrique tuto, il est assez ancien et il faut aller le chercher sur la dernière page.
terch:
Je ne peux pas aussi utiliser la commande "attachInterrutp" , car sur mon projet les pins 2 &3 sont déjà occupés par d'autres sorties (j'utilise les 14 I/O pour ce projet).
Si tu utilises une carte à base ATMega328p, et seulement celui là, toutes les I/O peuvent servir pour des interruptions.
Ce n'est pas aussi direct que pour Int0 et int1, les interruptions sont gérées par port, à charge du programmeur de tester dans le port signalant une interruption qu'elle broche est responsable.
Si tu es intéressé il y a un tuto dans la rubrique tuto, il est assez ancien et il faut aller le chercher sur la dernière page.
Merci pour l'info, je vais regarder ça de plus près.
Je suis en train de tester la solution de B@tto qui fonctionne plutôt bien, à part pour un détail:
Lorsque Flag=0 (début de programme) et que ROUGE est à HIGH, et que en plus je mets mon ETAT_VY_HP à HIGH (via Bouton Poussoir), celui çi ne passe pas à HIGH sur le premier appui, mais sur le deuxième appui.