Pages: [1]   Go Down
Author Topic: Tempo entre action sans delay  (Read 549 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour a tous

J'ai un soucis qui doit pas être trop compliqué mais que je n'arrive pas a résoudre de part mes faibles connaissances en programmation....

J'ai bien compris qu'il fallait que j'utilise la fonction millis() pour ne pas avoir la fonction delay et donc l'absence de réaction durant l’exécution de cette fonction...

Voici mon programme actuel
c'est un système simulant de vérins hydrauliques. Pour les faire fonctionner il faut activer les bobines du distributeurs et activer l’accélérateur et l'embrayage de la pompe.

Code:


// adressage des pins:            // pin 8,9 ==> bt
#define bt_mben        31         // pins d'entrée Pupitre
#define bt_dben        30
#define bt_pell1       29
#define bt_pell2       28
#define bt_sonnette    26
#define ct_lc          20
#define ct_ben_bas     19
#define ct_beq_rent    17         // bequilles completement rentrées    1 quand rentré
#define ct_beq_sort    16         // bequilles sorties et en pression   1 quand sortie

#define embra        15         // pins de sortie
#define cl_para      14
#define accel        13
#define pell2         6
#define pell1         4
#define dc_beq        3
#define sonnet        2
#define mt_beq        1
#define benne         0

  int HydroPwr = LOW;

  long previousMillis = 0;        // variable pour mémoriser le temps écoulé depuis le dernier changement de la LED
  long delay_Acc = 1000;           // delay entre l'acceleration et l'embrayage

void setup() {

  pinMode(embra, OUTPUT);        // initialisation des E/S
  pinMode(cl_para, OUTPUT);
  pinMode(accel, OUTPUT);
  pinMode(benne, OUTPUT);
  pinMode(pell1, OUTPUT);
  pinMode(pell2, OUTPUT);
  pinMode(dc_beq, OUTPUT);
  pinMode(sonnet, OUTPUT);
  pinMode(mt_beq, OUTPUT);
 
  pinMode(bt_mben, INPUT);
  pinMode(bt_dben, INPUT);
  pinMode(bt_pell1, INPUT);
  pinMode(bt_pell2, INPUT);
  pinMode(bt_sonnette, INPUT);
 
  pinMode(ct_lc, INPUT);
  pinMode(ct_ben_bas, INPUT);
  pinMode(ct_beq_rent, INPUT);
  pinMode(ct_beq_sort, INPUT); 
}

// variables de tests capteurs et boutons

boolean t_sonnette, t_pelle_s1, t_pelle_s2, t_beq_sortir, t_benne, t_clap_para, t_beq_rentrer;


void loop(){
 
   
 int et_bt_mben = digitalRead(bt_mben);              // attribution des etats des variables
 int et_bt_dben = digitalRead(bt_dben);
 int et_bt_pell1 = digitalRead(bt_pell1);
 int et_bt_pell2 = digitalRead(bt_pell2);
 int et_bt_sonnette = digitalRead(bt_sonnette);
 int et_ct_lc = digitalRead(ct_lc);
 int et_ct_ben_bas = digitalRead(ct_ben_bas);
 int et_ct_beq_rent = digitalRead(ct_beq_rent);
 int et_ct_beq_sort = digitalRead(ct_beq_sort);

 
 
// Sonnette alarme
  t_sonnette = (!et_bt_sonnette || et_ct_beq_rent == HIGH);        // sonnette si appui bouton ou bequilles non rentrées

// Pelle sens1
  t_pelle_s1 = (!et_bt_pell1);                                     // vérification du BP pelle sens 1

// Pelle sens2
  t_pelle_s2 = (!et_bt_pell2);                                     // vérification du BP pelle sens 2

// Sortir bequilles et monter benne
  t_beq_sortir = (!et_bt_mben && et_ct_beq_sort == HIGH && !et_ct_lc);            //vérification  BP monte benne et capteur bequilles non sorties et capteur LC came actif
  t_benne = (!et_bt_mben && !et_ct_beq_sort && !et_ct_lc);                        //vérification  BP monte benne et capteur bequilles sorties et capteur LC came actif     
  t_clap_para = (!et_bt_mben && !et_ct_beq_sort && !et_ct_lc);                    //vérification  BP monte benne et capteur bequilles sorties et capteur LC came actif


 // Descente benne et remonter bequilles
  t_clap_para = (!et_bt_dben && et_ct_ben_bas == HIGH);                          //vérification  BP descente benne et capteur benne basse non activé
  t_beq_rentrer = (!et_bt_dben && !et_ct_ben_bas  && !et_ct_lc);                              //vérification  BP descente benne et capteur benne basse activé



  HydroPwr = t_pelle_s1 || t_pelle_s2 || t_beq_sortir || t_benne || t_beq_rentrer;

 if (HydroPwr != LOW)
 
{
  digitalWrite(accel, HydroPwr);

  unsigned long currentMillis = millis();                                         // stocke la valeur courante de la fonction millis()

  if(currentMillis - previousMillis > delay_Acc)
     {
       previousMillis = currentMillis;                                            // mémorise la valeur de la fonction millis()
   
  digitalWrite(embra, HydroPwr);
  digitalWrite(pell1, t_pelle_s1);                                                                                       // pelle sens 1
  digitalWrite(pell2, t_pelle_s2);                                                                                       // pelle sens 2
  digitalWrite(dc_beq, t_beq_sortir);                                                                                    // sortir bequilles
  digitalWrite(benne, t_benne);                                                                                          // monter benne
  digitalWrite(mt_beq, t_beq_rentrer);                                                                                   // rentrer bequilles
     }

 else
 {
   digitalWrite(accel, LOW);
   digitalWrite(embra, LOW);
   digitalWrite(pell1, LOW);                                                                                       
   digitalWrite(pell2, LOW);                                                                                     
   digitalWrite(dc_beq, LOW);                                                                                 
   digitalWrite(benne, LOW);                                                                                 
   digitalWrite(mt_beq, LOW);                                                                           
                                               
 }
}

  digitalWrite(sonnet, t_sonnette);                                                                                      // activation sonnette
  digitalWrite(cl_para, t_clap_para || t_benne);                                                                         // ouvrir clapet parachute
 
 
}

Mon soucis vient de ma boucle "if". Son but est d'activer l’accélérateur avant d'activer l'embrayage (donc la pression hydraulique) et le reste avec un laps de temps defini par "delay_Acc"
Ceci afin de ne pas utiliser la fonction delay et donc de "bloquer" le systeme sur une action pendant un laps de temps (pour faire simple on fait une autre action ou rien du tout, la precedente fonction s’arrête de suite)

avec mon code, l’accélérateur marche bien et il y a bien le tempo, mais les actions d’après se lancent et s’arrêtent de suite car le "else" les coupe....

quelqu'un peut m'aider svp ?

Merci

Nico





« Last Edit: February 03, 2013, 10:25:46 am by n1c0l45 » Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai un peu modifié mon code, j'avance mais c'est toujours pas bon.
Personne ne peut me filer un petit coup de main?

merci

nico
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai bien chercher du cote de la lib softtimer... mais je comprends pas grand chose, je vais essaye de la decortiquer
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Avant de décortiquer des librairies, commence à jouer avec ce bout de code :

http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci, j'ai deja trouvé ce code. je m'en suis d'ailleurs inspirer pour celui ecris au dessus? mais c'est pas bon
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Alors c'est que tu n'as pas compris comment fonctionne millis().... faut relire  smiley-mr-green
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

lol, ca fait deux jours que je la lis smiley-wink j'ai compris (je pense) comment le millis() fonctionne, mon soucis vient plutot de ma boucle if (je pense)
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bonjour,
tu peux t'inspirer de ce topic
http://arduino.cc/forum/index.php/topic,145657.msg1102114.html#msg1102114
création d'un timer à l'instant T et déclenchement d'une action après un délais en millis.

PS : les millis font des dégats en ce moment  smiley-mr-green
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci, je vais regarder cela...
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

en y regardant de plus près et après étude des différents liens proposés, je pense que mon problème ne vient pas de la tempo mais de ma boucle if.
je pense qu'on mon raisonnement est faux

qu'en pensez vous?

encore merci pour l'aide!
Logged

Pages: [1]   Go Up
Jump to: