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.
// 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