problème de boucle

Bonjour,

voila mon problème,
Je veux que mon moteur fasse le nombre de pas demandé ,dans un sens ou l’autre, en fonction de la photorésistance et ensuite qu’ il s’arrête.
Le programme fait se qu’on lui demande,mais boucle a chaque fois.
Pouvez vous m’aidez.

poule45.ino (1.61 KB)

/*
This is a test sketch for the Adafruit assembled Motor Shield for Arduino v2
It won’t work with v1.x motor shields! Only for the v2’s with built in PWM
control

For use with the Adafruit Motor Shield v2
----> http://www.adafruit.com/products/1438
*/

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include “utility/Adafruit_MS_PWMServoDriver.h”

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);

// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #2 (M3 and M4)

Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 1);

int pinPR=A0;
float tension = pinPR * (5.0 / 1023.0); // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 1.7;

void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

myMotor->setSpeed(100); // 10 rpm

}

void loop() {

int pinPR = analogRead(A0);
float tension = pinPR * (5.0 / 1023.0);

Serial.println(tension);
delay (10);

if(tension<seuilObscurite)

{
myMotor->step(1000, FORWARD, DOUBLE);
delay(200);
myMotor->release();

}
if(tension>seuilObscurite)

{ myMotor->step(1000,BACKWARD, DOUBLE);
delay(200);
myMotor->release();
}
}

C’est mieux en postant directement le code mais utilisez les tags de code svp (modifiez votre post ci dessus)

J’ai une paire de tags qui traîne, je vous les offre gracieusement pour cette fois, la prochaine fois faudra les créer vous même :slight_smile:

[nobbc][code]....[/code][/nobbc]

Vous avez plus qu’à mettre votre code au niveau des ...


Vous avez en variables globales

int pinPR=A0;
float tension = [color=red]pinPR[/color] * (5.0 / 1023.0);

PinPR est un numéro de pin, pas la valeur lue sur la pin…

Ensuite en plus vous redeclarez ces variables avec un sens différent dans la loop…

Au lieu de ralentir votre programme et utiliser plus de mémoire avec des calculs qui seront approximatifs, déclarez votre seuil directement avec la valeur entre 0 et 1023 correspondante

Sinon votre programme fait bien ce qu’il faut, la loop() c’est fait pour boucler comme son nom l’indique :slight_smile:

Il vous faut donc mémoriser et maintenir votre état - une variable globale (un boolean) - fermé ou ouvert - et dans vos tests si vous êtes fermé et que la valeur est toujours correcte par rapport au seuil alors pas la peine de relancer une fermeture.

L’opérateur de test de 2 conditions en même temps en C est && (cf la doc)

bonsoir, JML

Je débute sur Arduino . Merci pour tes conseils même si j’ai un peu de mal a comprendre.voici mon code, ça a l’air de marcher.

[int pinPR = A0;
float valeur = analogRead(A0);             // variable qui va enregistrer la lecture du capteur
boolean val = false;                      // seuil defini (tombee de la nuit fixe a 400)


void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz

  myMotor->setSpeed(100);  // 10 rpm
  boolean val = false; //variable porte fermee
}
void loop() {

  float valeur = analogRead(A0);

  Serial.println(valeur);
  delay (100);

  if ((valeur < 400) && (val = false)) // seuil defini (tombee de la nuit fixe a 400)

  {
    myMotor->step(1000, FORWARD, DOUBLE);
    delay(200);
    myMotor->release();
    val = true;

  }
  if ((valeur > 400) && (val = true))

  { myMotor->step(1000, BACKWARD, DOUBLE);
    delay(200);
    myMotor->release();
    val = false;
  }
}]

Bonjour a tous et a toutes.

Mon problème n'est pas résolu. Je ne comprends pas mon moteur tourne toujours!! l'inversion de sens se fait correctement en fonction du seuil, mais ne prend pas en compte la variable boolean pour l'arrêt.

merci a tous et a toutes pour de l'aide. Je devient chèvre.

Pour faire un test il faut faire == pas = qui est une affectation - donc vous mettez val à false

Merci J-M-L ça marche nickel. Mes poules seront bien au chaud maintenant. Un grand merci encore pour ton aide.

super

dans la partie Réalisations et Projets Finis - vous trouverez plusieurs projets plus ou moins élaborés sur ce thème, par exemple Porte automatique pour poulailler ou Trappe poulaillier sans contacts fin de course