fonction milli() delay dans programme spéc

Bonsoir à tous,

Je suis en train de réaliser une barre travelling motorisé avec la fonction time lapse à l’aide d’un écran lcd et différentes options.

J’ai effectué le programme final pour l’option cité ci dessus.

Voici le programme :

/* Début projet barre automatisé avec time lapse*/


/*Programme permettant un cycle time lapse mouvementé sur la barre traveling à l'aide du moteur pas à pas*/
/*Il se compose de deux relais pour la mise au point et le déclenchement de l'APN, motorisé sur la barre à l'aide d'un moteur pas à pas de type NEMA
 * et de son pilote A3967 ( à changer pour la phase finale car trop faible en courant*/
 
/*déclaration des variables pour le pilote du moteur pas à pas*/

int dirpin = 2;
int steppin = 3;

/*déclaration des variables pour les relais qui commandent le 'APN*/

#define AF_PIN   10
#define DECL_PIN  11

/*déclaration des tempos de la mise au point et du déclenchement de l'APN*/

int tempo_AF = 800; // durée de la mise au point, à déterminer selon la durée du cycle.
int tempo_DECL = 1200;  // durée de déclenchement de l'APN, à déterminer selon la durée du cycle.


/***************************************************************************************************************************/

void setup() 
{

/*Déclaration de la valeur des commandes APN en sortie gérée pas 2 relais*/
   
 pinMode(AF_PIN, OUTPUT);
 pinMode(DECL_PIN, OUTPUT);  

 
/*Déclaration de la valeur des commandes moteur PAP en sortie*/ 

pinMode(dirpin, OUTPUT);
pinMode(steppin, OUTPUT);

}


/****************************************************************************************************************************/

void loop()
{

  int i;

  digitalWrite(dirpin, LOW); 
  delay(100);

/*j'agis sur cette valeur, pour déterminer le nombre de pas par cycle (nombre de degrés de rotation du moteur) à modifier selon la longueur de la barre traveling*/

  for (i = 0; i<1000; i++)     
  {
    digitalWrite(steppin, LOW);  
    digitalWrite(steppin, HIGH);

/*j'agis sur cette valeur pour déterminer la vitesse de rotation, plus elle tend vers zéro, plus la vitesse est rapide. A déterminer selon la configuration du système de la barre*/
    
    delayMicroseconds(1500);
  }
    digitalWrite(dirpin, HIGH);

/*C'est le temps d'atente entre la fin du cycle rotation du moteur et le début de la prise de vue*/

delay(2500);

 digitalWrite(AF_PIN, HIGH);
 delay(tempo_AF);
 
 digitalWrite(DECL_PIN, HIGH);
 delay(tempo_DECL);
   
 digitalWrite(AF_PIN, LOW);
 
 digitalWrite(DECL_PIN, LOW);}

Mon problème c’est que je ne peux pas intégrer la fonction delay car j’intègre ce programme, par la suite dans un menu avec écran lcd. Je dois pouvoir interrompre le programme à n’importe quel moment.

Après plusieurs essais sans succés, je donne ma langue au chat, je voudrais avoir votre aide s’il vous plaît en vosus remerciant davance.

Bonjour , pour la fonction milli**s** on peut trouver des cours , des exemples , des codes et meme la description avec un moteur de recherche .

Le principe , si j' ai bien compris , c ' est de prendre une base dans une variable de type unsigned long ( me semble t il , a confirmer ) puis de le comparer a millis lui meme ou tu en as besoin .

exemple : unsigned long tempsBase = millis ; // en debut de loop je pense .

puis lorsque tu en as besoin il suffit d ' etablire une condition du style :

if ( tempsBase - millis() ) >= 2500 { //si la difference entre millis maintenant et le temps de millis en debut de boucle est plus grand que 2.5 secondes

    // alors j '  execute ca .
    }
else { // sinon je fais autre chose 
   // je fais ca

}

bref c ' est quand meme la base de la programation les conditions .

Courage ! :wink:

Bonjour,

Tout d'abord je te remercie pour ta réponse, sache que je débute (3 mois), j'essaye au maximum de faire des recherches et j'en apprends tous les jours.

J'avais essayé de faire ça, mais ca ne fonctione pas :

avec long temps = 0 et long temps2 = 0

void loop() {


  
  if(millis() - temps >= 1500){
    digitalWrite(AF_PIN, HIGH);
  }
if(millis() - temps >= 5000){
digitalWrite(AF_PIN, LOW);
temps = millis();

}



  
if(millis() - temps2 >=2500){
  digitalWrite(DECL_PIN, HIGH);
}
if(millis() - temps2 >= 5000){
digitalWrite(DECL_PIN, LOW);

temps2 = millis();}
}

cela fonctionne bien sans le moteur. Mais avec le moteur tout est en désordre. Même quand je modifie les tempos. Pourtant je pensais qu'il prenait la loop dans l'ordre.

Salut,

Il faut affecter à temps la valeur millis() dans le setup.

setup
{
....
temps=millis();
temps2=millis()
.....
}

Bonjour, merci de ta réponse, j'essaye ça de suite.

Ca fonctionne presque! J’ai un dernier soucis. Voici le programme complet modifié :

/*Programme permettant un cycle time lapse mouvementé sur la barre traveling à l'aide du moteur pas à pas*/
/*Il se compose de deux relais pour la mise au point et le déclenchement de l'APN, motorisé sur la barre à l'aide d'un moteur pas à pas de type NEMA
 * et de son pilote A3967 ( à changer pour le projet car trop faible en courant*/
 
/*déclaration des variables pour le pilote du moteur pas à pas*/

int dirpin = 7;
int steppin = 6;

/*déclaration des variables pour les relais qui commandent le 'APN*/

#define AF_PIN   9
#define DECL_PIN  10

/*déclaration des tempos de la mise au point et du déclenchement de l'APN*/

long temps = 0;
long temps2 = 0;

/***************************************************************************************************************************/

void setup() 
{

/*Déclaration de la valeur des commandes APN en sortie gérée pas 2 relais*/
   
 pinMode(AF_PIN, OUTPUT);
 pinMode(DECL_PIN, OUTPUT);  

 
/*Déclaration de la valeur des commandes moteur PAP en sortie*/ 

pinMode(dirpin, OUTPUT);
pinMode(steppin, OUTPUT);

/*affectation du temps à la millis()*/

temps = millis();
temps2 = millis();

}


/****************************************************************************************************************************/

void loop()
{

  int i;

  digitalWrite(dirpin, LOW); 
  delay(100);

/*j'agis sur cette valeur, pour déterminer le nombre de pas par cycle (nombre de degrés de rotation du moteur) à modifier selon la longueur de la barre traveling*/

  for (i = 0; i<1000; i++)     
  {
    digitalWrite(steppin, LOW);  
    digitalWrite(steppin, HIGH);

/*j'agis sur cette valeur pour déterminer la vitesse de rotation, plus elle tend vers zéro, plus la vitesse est rapide*/
    
    delayMicroseconds(1000);
  }
    digitalWrite(dirpin, HIGH);

/*C'est le temps d'atente entre chaque cycle "rotation" du moteur*/

delay(2500);



if(millis() - temps >= 1600){
    digitalWrite(AF_PIN, HIGH);
  }
if(millis() - temps >= 5000){
digitalWrite(AF_PIN, LOW);
temps = millis();

}
  
if(millis() - temps2 >=2500){
  digitalWrite(DECL_PIN, HIGH);
}
if(millis() - temps2 >= 5000){
digitalWrite(DECL_PIN, LOW);

temps2 = millis();}
 
  }

Mon probléme, je pense doit venir de cette tempo :

/*C'est le temps d'atente entre chaque cycle "rotation" du moteur*/

delay(2500);

Quand le moteur démarre, les deux relais de mise au point et de déclenchement démarrent en même temps. J’ai essayé d’intégrer une variable “temps3” mais ca ne marche pas non plus.

J’ai déjà avancé avec le problème du set up. Merci

Bonjour à tous, merci de m’aider

Bonne journée

Hello,
Je suis newbee mais je sais que le fait d'utiliser la fonction delay() dans un prog te bloque tout le prog, et c'est pour cette raison que je préfère la fonction delayWithMillis(). (voir examples sur le net)
Peut être est-ce la raison de ton problème ?