Go Down

Topic: Commande de store (Read 2255 times) previous topic - next topic

Mike74

bonjour à tous, voilà je souhaiterai réaliser une petite commande de store mais je bloque sur la fonction monter tant que fin de course haut = 0 et la fonction descendre tant que fin de course bas = 0.

Je recois mes commande via la liaison série :
Code: [Select]

void loop() {
 
// Réception des ordres
  while(Serial1.available()){                         // is there anything to read?
    char getData = Serial1.read();                    // if yes, read it

// Monter
    if(getData == 'm'){
      monter();     
    }
   
// Descendre   
    if(getData == 'd' ){
       descendre();
    }
  }
}


Je bloque  sur les fonction monter et descendre, en fait si j'appelle la fonction monter() , le moteur doit monter le store et ne sortir de la fonction que si le store arrive en position haute (fin de course) et retourner un état "Haut"

Idem pour la fonction descendre.

Merci pour votre aide.

B@tto

Une boucle while ;) :

Code: [Select]

void loop() {
 
// Réception des ordres
  while(Serial1.available()){                         // is there anything to read?
    char getData = Serial1.read();                    // if yes, read it

// Monter
    if(getData == 'm'){
      while(digitalRead(CourseHaut)==0) monter();     
    }
   
// Descendre   
    if(getData == 'd' ){
while(digitalRead(CourseBas)==0)   descendre();
    }
  }
}

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Mike74

J'ai essaye mais ca fonctionne pas, le moteur continu à monter mais si le courseHaut = = 1

Code: [Select]

// Déclaration des varibales de position
int courseHaut = digitalRead (fdcHautPin);
int courseBas = digitalRead (fdcBasPin);


// Réception des ordres
 while(Serial1.available()){                        
   char getData = Serial1.read();
 
// Monter
   if(getData == 'm'){
     while(courseHaut == 0) monter();    
   }  
   
// Descendre    
   if(getData == 'd' ){
      while(courseBas == 0) descendre();
   }
 }

}

// Commande Monter
void monter(){
 digitalWrite(montePin, HIGH);
}

void descendre(){
 digitalWrite(descendPin, HIGH);
}

B@tto

#3
Nov 22, 2013, 03:29 pm Last Edit: Nov 22, 2013, 03:33 pm by B@tto Reason: 1
Normal il faut lancer le test à chaque boucle et arrêter le moteur quand il atteint la butée :

Code: [Select]

void monter(){

 while(courseHaut == 0) {
courseHaut = digitalRead (fdcHautPin);
digitalWrite(montePin, HIGH);
}

digitalWrite(montePin, LOW);

}

void descendre(){

while(courseBas == 0) {  digitalWrite(descendPin, HIGH);
courseBas = digitalRead (fdcBasPin);
}
digitalWrite(descendPin, LOW);
}



et si je simplifie :

Code: [Select]

void monter(){

 while(digitalRead (fdcHautPin) == 0)  digitalWrite(montePin, HIGH);

digitalWrite(montePin, LOW);

}

void descendre(){

while(digitalRead (fdcBasPin) == 0)   digitalWrite(descendPin, HIGH);

digitalWrite(descendPin, LOW);

}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Mike74

Super ca fonctionne, merci.

je souhaiterais rajouter dans la fonction "Monter" ou "Descendre" , une fonction qui allume un voyant défaut si le store n'est pas en position haute au bout d'un certain delay après une commande "monter" et idem pour la commande "descendre", j'aio essaye avec un delay mais non, je pense qu'il faut utiliser une fonction millis(),

merci pour votre aide .


B@tto

oui il faut utiliser millis() et rajouter une conditions dans boucle while :

Code: [Select]
unsigned long Depart=millis(); // on note "l'heure" de depart
while(digitalRead (fdcBasPin) == 0 && (Depart+3000)>millis())   digitalWrite(descendPin, HIGH); // tant que l'heure actuelle est inférieure à l'heure de depart + 3s, on continu sinon on stoppe la boucle
digitalWrite(descendPin, LOW);
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Mike74

Merci B@to mais c'est pas tout à fait ce que je cherche, en effet à partir du moment ou j envoi la commande monter par exmple,
la boucle se lance et a un certain délai mais la finalité est que si le contact de fin de course n'est pas fermé dans ce délai, alors je sors de la boucle oui MAIS j'informe également d'un défaut par l'allumage de la led "Defaut".

:smiley-roll-sweat:

B@tto

#7
Nov 25, 2013, 10:06 pm Last Edit: Nov 26, 2013, 09:14 am by B@tto Reason: 1
Dans ce cas il faut insérer un flag :

Code: [Select]
unsigned long Depart=millis(); // on note "l'heure" de depart
byte Flag=0;
while(digitalRead (fdcBasPin) == 0 && Flag==0)   {
digitalWrite(descendPin, HIGH);
if(millis()>=Depart+3000) Flag=1;
}
digitalWrite(descendPin, LOW);
digitalWrite(Defaut,Flag);
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Mike74

un flag ? c'est quoi cette petite bête ?

jfs

#9
Nov 26, 2013, 07:24 am Last Edit: Nov 26, 2013, 07:26 am by Jean-François Reason: 1
Un flag c'est comme sur les boites aux lettres américaines, le petit drapeau sur le coté, le facteur le lève lorsqu'il est passé (valeur à 1), on le baisse lorsque'on prend le courrier dans la boite (on remet la valeur à 0).

En gros c'est un boléen qui permet de savoir si l'événement s'est produit ou non.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

Go Up