Stopper la lecture d'une entrée maintenue

Bonjour,

Je débute sur la programmation Arduino avec déjà un projet très ambitieux, celui-de commander des

moteurs 24VCC et d'autres périphériques. Mon choix s'est porté sur l'Arduino pour sa simplicité et son

efficacité.

Voici en fait le problème que je n'arrive pas à résoudre :

J'aimerai stopper la lecture d'une entrée où est connecté un bouton maintenu.

Est-il possible, lors du déroulement du programme, d'arrêter la lecture d'une pin configurée INPUT et dont le bouton associé à cette pin est

tout le temps maintenu ?

Je vous remercie pour votre aide parce que pour l'instant je ne vois pas de solution.

akuma8: Voici en fait le problème que je n'arrive pas à résoudre :

J'aimerai stopper la lecture d'une entrée où est connecté un bouton maintenu.

Est-il possible, lors du déroulement du programme, d'arrêter la lecture d'une pin configurée INPUT et dont le bouton associé à cette pin est

tout le temps maintenu ?

Je vous remercie pour votre aide parce que pour l'instant je ne vois pas de solution.

bonjour ta question n'est pas tres claire :grin:

si tu ne veux pas lire l'etat , il suffit simplement de pas/plus effectuer de lecture

Pas clair en effet ... Surtout que c'est toi qui pilote la lecture avec digitalRead() donc bon

J’avoue que ce n’est pas très clair, je m’explique :

J’ai 2 valeurs de comparaison Z1 et FB, qui sont fixées par l’utilisateur avec FB>Z1.
J’ai une fonction Capteur() qui incrémente une variable capteur toutes les 900ms.
J’ai un bouton : “B_o” relié à la pin 32 de mon Arduino Mega.
En appuyant sur ce bouton ma LED doit s’allumer et mon capteur tourne.
Lorsqu’on lâche ce bouton si le capteur n’a pas dépassé Z1 on éteint la LED.
Si le capteur dépasse la valeur Z1 et qu’on lâche le bouton la LED continue de s’allumer jusqu’à atteindre FB.
La LED doit s’éteindre lorsque le capteur dépasse la valeur FB.
Ce code marche mais lorsque le bouton est maintenue durant toute l’exécution du programme la LED ne s’éteint même si le capteur dépasse FB, c’est pour ça que je demande s’il est possible de désactiver la lecture lorsque FB est dépassé.

J’espère avoir été un peu plus clair :smiley:

pinMode(B_o,INPUT);

int ouv=digitalRead(B_o);


  if (ouv==1 ){                     // bouton ouverture, le moteur tourne et le capteur commence à compter
    digitalWrite(R,HIGH);                  // Allume LED Rouge
    capteur = Capteur();                 // Capteur  commence à compter
    }

  else if (ouv==0 && capteur<=Z1){ // Si on lâche le bouton et la valeur du capteur est inférieur à Z1 on éteint la LED
     digitalWrite(R,LOW);
    }

  else if (capteur > Z1){            // Si le capteur a dépassé Z1 on allume la LED jusqu'à ce que le capteur atteigne la valeur FB
    capteur = Capteur();
    digitalWrite(R,HIGH);
    while(capteur >FB){              // Une fois que le capteur a dépassé la valeur FB on doit tout arrêter même si le bouton est est toujours maintenu et c'est là que ça coince !! la LED ne s'éteint pas !!
      digitalWrite(R,LOW);
    }
  
  }

Yep!

Si la led ne s'éteint pas, c'est tout simplement que tu n'atteins jamais la condition.

As-tu essayé de debogger ton programme en plaçant des Serial.print(valeur) dans ton code ?

[EDIT] Well ! Tant que tu appuiras sur le bouton, la première condition du if s'executera sans passer aux autres. Tu dois inclure tes objectifs même si le bouton est actionné, c'est çà ? Tu dois donc inclure d'autres conditions dans ton premier if. Logic is the best !

@+

Zoroastre.

Justement comment y entrer ? Je trouve bizarre qu'il n'y entre pas alors que la condition est largement respectée :( ! Je sèche complètement !

bonjour, pas clair du tout, mets ton code entier, car on ne peut voir certaines variables.

Yep!

Tu as 2 conditions principales à gérer : Soit le bouton est à 1, soit il est à 0.

if (ouv == 1) { ajout de conditions secondaires } else { ajout de conditions secondaires }

Tu dois donc considérer les 2 cas selon tes objectifs. Le dépassement d'une variable si le bouton est allumé, et aussi lorsqu'il est éteint.

Les conditions telles qu'elles sont écrites actuellement ne prennent pas en compte toutes les possibilités.

Revois entièrement cette partie de ton code, écris-le de manière pragmatique, sur papier, et traduis-le simplement ensuite.

@+

Zoroastre.

zoroastre: Yep!

Tu as 2 conditions principales à gérer : Soit le bouton est à 1, soit il est à 0.

if (ouv == 1) { ajout de conditions secondaires } else { ajout de conditions secondaires }

Revois entièrement cette partie de ton code, écris-le de manière pragmatique, sur papier, et traduis-le simplement ensuite.

Zoroastre.

Tu as sans doute raison, en plus ma variable capteur est globale donc avec 2 conditions ça devrait le faire vu qu'un changement dans l'une des conditions impacte l'autre condition. Je vais revoir ma conception et j'espère que ça marchera. Je reviens si tout est ok sinon je reviendrai quand même ^^ ! Merci

Problème résolu :) !

Merci Zoroastre ^^

Rebonjour,

J’ai une autre question :

J’aimerai décrémenter une valeur à chaque seconde en utilisant millis(), j’ai fait mon petit code mais ça ne fonctionne pas.
le voici :

   long tmp;
   int capteur, FB=10;
   for(int i=0;i<=FB;i++){
     if(millis()-tmp>1000){
       capteur=FB-i;
       Serial.println(capteur);
      tmp=millis();
     }

Quand j’enlève la condition incluant millis(), ça marche mais avec millis(), ça n’a pas l’air de vouloir répondre.

Help !

merci

Yep!

Il est fort probable (sans connaître le code complet) que ta boucle for s'execute en moins d'une seconde.

Ajoutes un delay(1000) après ta condition et avant la dernière parenthèse de ta boucle for pour t'en rendre compte...

Supprime ta boucle for et utilises plutôt i++; dans ta condition :

unsigned long tmp = 0;

int capteur, FB=10, i = 0;

void setup()
{
  Serial.begin(9600);
  delay(100);
}


void loop()
{

     if (millis() - tmp >= 1000){
       capteur = FB - i;
       Serial.println(capteur);
      tmp=millis();
      i++;
      if (i > 10) { i = 0; }
     } 

   
}

@+

Zoroastre.

salut pour quoi une boucle for ? la valeur de i risque d'etre aleatoire entre 0 et FB donc capteur vas vite evoluer entre 0 et FB de magniere trés aléatoire si tu cherche a avoir quelque chose de temporel alors c'est la valeur tu temps qui cser de base

   long tmp;
  static FB=10;
   int capteur=0;
   
   
if(millis()-tmp>1000){// si le temps et superieur a 1 seconde
FB--;//FBet décrémenté de 1
 capteur=FB;
 Serial.println(capteur);
      tmp=millis();
     }

ou je n'ai pas compris le but !

tmp n'est pas assigné avant le if, il contient donc une valeur aléatoire lors du test de la condition...

Heloderma-kris: salut pour quoi une boucle for ? la valeur de i risque d'etre aleatoire entre 0 et FB donc capteur vas vite evoluer entre 0 et FB de magniere trés aléatoire si tu cherche a avoir quelque chose de temporel alors c'est la valeur tu temps qui cser de base

   long tmp;
  static FB=10;
   int capteur=0;
   
   
if(millis()-tmp>1000){// si le temps et superieur a 1 seconde
FB--;//FBet décrémenté de 1
 capteur=FB;
 Serial.println(capteur);
      tmp=millis();
     }

ou je n'ai pas compris le but !

Oui C'est quelque chose comme ça que je voulais... ça m'évite le delay() ( que je déteste au passage ^^).

Merci je vais voir ce que ça donne.

Bonjour,

Je reviens avec mon problème initial : “Forcer l’arrêt de lecture d’une PIN INPUT même si le bouton associé à cette PIN est maintenu.”

J’ai revu mon algorithme et ça marche avec une LED, mais mon but final serait d’arrêter un moteur. Le problème

c’est qu’en remplaçant la LED par le moteur, ça ne marche pas, mon moteur ne s’arrête pas et continue

de tourner.

Pourtant dans les autres cas où le bouton est relaché il s’arrête bien. HELP !