Pourquoi le "while" ne marche pas ?

Dans mon code je veux appuyer sur le capteur de force , que ça fasse tourner le servo à 90 degré et que seulement quand je réappuie ça revienne à 25 degrés mais le while() ne fonctionne pas donc ça revient à 25 degrés avant meme que j'ai réappuyé (aucun message d'erreur)

#define capteur_force A0 // broche capteur de force
#include "Servo.h"

Servo servo; // création de l'objet "servo"

void setup() {
  Serial.begin(9600); // Initialisation du moniteur serie
  servo.attach(9); // attache le servo au pin spécifié
}

void loop() {
  int force = analogRead(capteur_force); // on lit la valeur venant du capteur de force
  Serial.print(force);
  if(force > 400){
    servo.write(90);
    delay(2000);
    delay(100);
    while(force < 400){
      int force = analogRead(capteur_force);
      delay(1);
    }
  }
  else{
    servo.write(25);
  }
  delay(200);
}

Merci d'avance

Bonjour,

Dans ton while tu redéfinis la variable force
int force = analogRead(capteur_force);
Cette variable est détruite au } di while, donc n'est pas prise en compte dans le while (c'est la variable définie dans loop qui est prise en compte)
fait simplement
force = analogRead(capteur_force);

ça me met ce message d'érreur (j'ai essayé dans void loop() et void setup() ) : error: 'force' was not declared in this scope
force = analogRead(capteur_force);

C'est le deuxième qu'il faut changer, pas le premier!

Faut lire la doc sur la portée des variables (scope )

oh ok je me suis renseigné , merci beaucoup (au cas ou voici le code :slight_smile:

#define capteur_force A0 // broche capteur de force analogique 0
#include "Servo.h"

Servo servo; // création de l'objet "servo"


void setup() {
  int forceLoc;
  Serial.begin(9600); // Initialisation du moniteur serie
  servo.attach(9); // attache le servo au pin 9
}

void loop() {
  int force = analogRead(capteur_force);
  Serial.print(force);
  if(force > 400){
    servo.write(90);
    delay(1500);
    force = analogRead(capteur_force);
    while(force < 400){
      delay(200);
      force = analogRead(capteur_force);
    }
    servo.write(25);
    delay(1000);
  }
}

TU as rajouté une relecture de force juste avant le while, et ça change tout !

Ce délai implique une tempo max d’appui et une tempo min pendant laquelle le servo aura bougé. Ce n’est pas dans vos spécifications initiales.

(Si vous tenez le capteur appuyé plus de 1,5 secondes alors vous serez ne rentrez pas dans le while d’attente. Si vous le tenez appuyé un quart de seconde le servo restera quand même déplacé pendant 1,5 secondes)

➜ Vous injectez une notion de temps dans un processus qui est asynchrone, ça a des conséquences pour votre cahier des charges. Dans l’absolu pour ce genre de besoin on évite les délais.

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)


Sinon si vous voulez conserver la structure actuelle, vous pouvez simplifier l’écriture de votre attente, au lieu de

vous pouvez faire simplement

while (analogRead(capteur_force) < 400) delay(200);

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.