Arret moteur PAP

Bonjour,

Je suis en train de construire une porte automatique pour mon poulailler et j'ai quelque soucis pour le moteur.

Explication rapide du système :

Une RTC est connecté a une arduino uno afin d'avoir l'heure pour les différents programme d'ouverture choisi.
Un écran lcd 16x2 pour vérifié qu'elle programme est séléctionné et pouvoir le changé.
Tout cela fonctionne correctement
J'attaque la programmation du moteur PAP et la quelque soucis apparaisse.

Pour les essaies je met l'activation du moteur par l'appuis d'un bouton. le moteur ce met bien en route et devrai être stopper par un bouton "fin de course", mais c'est là le problème lorsque le fin de course et enclenché le moteur ne s’arrête pas.

Pour faire monté le moteur j'utilise une boucle while mais du coup j'arrive pas à la stopper. Donc je viens vers vous pour savoir ceux que j'ai fais de mal dans ma fonction ou si je peut faire autrement.

void moteurUp()
{
  moteur.setSpeed(motorSpeed);
  
  while(coupureUp = 1)
  {
      coupureUp = digitalRead(fcUp);
      moteur.step(2048);
     
  }

}

Merci

Bonjour,

La comparaison c'est == et non =

 while(coupureUp == 1)

ok merci

Je viens d'essayé mais c'est toujours pareil une fois que le moteur et en route le code est à l’arrêt du coup j'ai beau appuyé sur mon fin de course sa ne s’arrête toujours pas.

Je me demande si l'utilisation de while est bien ici mais je vois pas comment faire autrement.

hello
dans ton while, tu lis le fdc 1 fois puis tu demandes à ton moteur de faire 2048 pas, puis tu retourne lire le fdc

demandes à ton moteur de ne faire que 5 pas par exemple.

Bonjour,

Merci
J'ai essayé en mettant un pas de 100 mais le moteur tourne et bloque toujours le code du coup il test pas si le fdc et activé ou pas.

Entre temps j'ai essayé autrement et sa marche c'est surement pas super mais au moins sa va pour le moment

void fc1()
{
    coupureUp = digitalRead(fcUp);
  if (coupureUp == 1)
  {
    moteurUp();
  }

void moteurUp()
{
  moteur.setSpeed(motorSpeed);
  moteur.step(100);
  fc1();
}

J'ai fais pareil pour la descente en mettant -100 mais pour le moment il ne veut pas
Merci quand même pour votre aide.

Salut ,

Dans votre code initial , il ya des erreurs de portée des variables , elles ne sont pas toutes accessibles partout et l ' ordre aussi est important !

par exemple :

 while(coupureUp == 1)
  {
      coupureUp = digitalRead(fcUp);
}

si coupureUp n ' est pas initialisée avant dans le corps du programme elle ne sera pas accessible lors du 1er appel a la fonction .

de plus la variable globale ( si elle a bien ete initialise dans le code ) , n ' aura pas la valeur escompté a la fin de l ' appel de la fonction moteurUp !
en gros :

bool moteurUp = 0 ;
serial.print(moteurUp); // affichera moteurUp = 0 ;

void setup() {
  // put your setup code here, to run once:
bool moteurUp = 1 ;
serial.print(moteurUp); // affichera moteurUp = 1 ;
}

void loop() {
  serial.print(moteurUp); // affichera moteurUp = 0 ;
}

Ne pas tester ce code est faux ^^ , j ' ai fait ca rapidement , c ' est juste pour montrer que la variable moteurUp n ' affiche pas la meme chose selon l ' endroit ou est ce qu ' on la definit , ainsi que l ' endroit ou on la modifie ( c ' est schematique , pour les puristes :stuck_out_tongue: ! ) ainsi que l ' endroit ou on lui demande de s' afficher ! ( meme si les variables ont le meme nom , le programme considere que ce sont des variables differentes ).

c ' est un probleme tres courant que tout le monde rencontre en programmation .

Dans le second exemple que vous citez et qui fonctionne , il n ' y a pas d' erreur de portée de variables car vous utilisez la variable definit dans la fonction au sein de la fonction :

void fc1()
{
    coupureUp = digitalRead(fcUp);
  if (coupureUp == 1)
  {
    moteurUp();
  }

void moteurUp()
{
  moteur.setSpeed(motorSpeed);
  moteur.step(100);
  fc1();
}

c ' est pour ca que ca marche et pas le premier code !

sinon , pourquoi ne pas faire :

void motorStop () {
  moteur.step(0);
  moteur.setSpeed(0);
}

void moteurUp()
{
  moteur.setSpeed(motorSpeed);
 
  if(coupureUp != True)  {
      coupureUp = digitalRead(fcUp);
      moteur.step(5);
  }
}
else motorStop();

void moteurDown()
{
  moteur.setSpeed(motorSpeed);
 
  if(coupureDown != True)  {
      coupureDown = digitalRead(fcDown);
      moteur.step(5);
  }
}
else motorStop();

ou bien peut etre comme cela :

void motorStop () {
  moteur.step(0);
  moteur.setSpeed(0);
}

void moteurUp(){
  moteur.setSpeed(motorSpeed);
  moteur.step(5);
}

void moteurDown(){
  moteur.setSpeed(motorSpeed);
  moteur.step(-5);
}

while (coupureUp != True)  {
  moteurUp();
}
/* etc ...

Ok
Merci je vais essayé tout sa