problème boucle

Bonjour,

J’aimerais que l’orque que l'on appui une fois sur l’interrupteur cela ma fasse aller le servo indéfiniment Savez-vous comment faire ?

Car le if que j'utilise me fait faire aller le servo que lorsque j'appui dessus, si je relâche ça s’arrête mais j’aimerais que cela continue indéfiniment. Merci d'avance bonne soirée

vous avez un bug à la troisième ligne....

blague à part.. il nous faut voir votre code ... (lisez comment utiliser le forum --> 'Règles du forum francophone")

Bonjour,

J-M-L: vous avez un bug à la troisième ligne....

C'est plus la ligne 42 ? :grin:

kamill:
Bonjour,C’est plus la ligne 42 ? :grin:

j’ai perdu mon raccourci clavier qui entrait le texte automatiquement et le code me semblait sans doute très court… pas besoin de 42 lignes :slight_smile:

là vous testez l'état de l'interrupteur mais vous ne le lisez qu'ensuite...

  if ( etatInterrupteur == LOW ) {
  etatInterrupteur = digitalRead(9);

et le déplacement ne se fait que dans le if... donc si le if n'est pas vrai plus de déplacements

vous avez une résistance de pull-down ? comment est câblé l'interrupteur ?

Pourquoi avez vous retiré votre post? ça ne se fait pas...

bye

excusez-moi je me suis mal exprimé,
en fait le problème est que l’instruction se fait qu’une fois
mais j’aimerais qu’elle se fasse indéfiniment une fois le bouton appuyé

#include <Servo.h>

Servo myservo;  

int pin_servo = 8;       
int pos = 0;             
int angle_initial = 5;   
int angle_final = 90;   
int increment = 1;       
bool angle_actuel = false;
int etatInterrupteur;


void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  myservo.attach(pin_servo);  
  pinMode(9, INPUT);


}



void loop() {
etatInterrupteur = digitalRead(9);
  if (etatInterrupteur==LOW){
  
    for (pos = angle_initial; pos <= angle_final; pos += increment) {  
      myservo.write(pos);              
      delay(10);                      
      if (angle_actuel) {
        Serial.println(myservo.read());
      }
    }

    delay(2000);
    for (pos = angle_final; pos >= angle_initial; pos -= increment) { 
      myservo.write(pos);
      delay(10);
      if (angle_actuel) {
        Serial.println(myservo.read());
      }
    }

    delay(2000);

  }

}

Bonsoir electronique

Tu ne devrai pas exécuter l'action déclenchée par le if(... mais mémoriser le fait que le bouton est pressé dans une variable et ensuite faire un autre if(... qui execute l'action si la variable == vrai.

Cordialement jpbbricole

vous pouvez aussi attendre l'appui du bouton dans le setup

TantQue (bouton pas appuyé) {};

et ensuite rentrer dans la loop() ou vous ne faites que le mouvement

J'aimerais que l'orque que l'on appui une fois sur l'interrupteur cela ma fasse aller le servo indéfiniment

Est-ce tu veux aussi que si tu rappuies sur le bouton le servo s’arrête ? Est-ce que tu veux qu'à chaque fois qu'on appuie sur le bouton si le servo est en service on l’arrête, ou si le servo est arrêté on le mette en marche (va et vient) Est-ce que tu veux que quand il s’arrête il revienne à une position particulière ?

As tu un anti-rebond pour le bouton ? S'il n'y en a pas tu aura des fonctionnements aléatoires avec les rebonds mécaniques du contact. Anti rebond soit électronique (condensateur 100 nF céramique en parallèle sur les contacts) soit logiciel --> faire une recherche soit sur le forum soit lire le tuto d'Eskimon .

Dans le cas d'un" va et vient" Il me semble que l'usage d'une variable intermédiaire simplifierait la gestion. L'état de cette variable (TRUE ou FALSE) peut être modifié à l'aide d'une interruption. A chaque appui sur le bouton une interruption est déclenchée. Dans l’interruption l'état de cette variable est inversé.

L'état de cette valeur est à tester à l'entrée de la fonction loop()

bool machin = false;  // variable modifiée par l'interruption.

void loop() {
  if (machin) {
     // ce que tu veux faire
  }
}

Pour comprendre comment utiliser une interruption voir sur l'onglet "Ressources ->Reference--> attachinterrupt" sur le site arduino ou dans un tuto comme celui d'Eskimon.