Bon, rien que ces deux tests se contredisent :
// Sortir bequilles et monter benne
if (!et_bt_hm && !et_bt_mben && et_ps_beq_sort == HIGH&& et_ps_beq_sort == HIGH )//vérification de l'homme mort et BP monte benne et pressostat bequilles non sorties
{
digitalWrite(embra, HIGH); // activation embrayage
digitalWrite(dc_beq, HIGH); // sortir bequilles
}
else {
digitalWrite(embra, LOW);
digitalWrite(dc_beq, LOW);
}
if (!et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort) //vérification de l'homme mort et BP monte benne et pressostat bequilles sorties
{
digitalWrite(embra, HIGH); // activation embrayage
digitalWrite(benne, HIGH); // monter benne
digitalWrite(cl_para, HIGH); // ouvrir clapet parachute
}
else {
digitalWrite(embra, LOW);
digitalWrite(benne, LOW);
digitalWrite(cl_para, LOW);
}
Effectivement, si le premier est vérifié, alors embra sera mis à 1, mais comme le second n'est pas vérifié, embra est remis à 0.
Comme chaque sortie dépend un peu de plusieurs entrées. si je ne prends que ces deux tests, ça donne ça :
embra = dc_beq = et_bt_hm && !et_bt_mben && et_ps_beq_sort == HIGH && et_ps_beq_sort == HIGH;
embra = benne = cl_para = et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort
On voit que deux conditions agissent sur embra, donc il faut les réunir. On a donc juste à écrire ça :
digitalWrite(dc_beq, et_bt_hm && !et_bt_mben && et_ps_beq_sort == HIGH&& et_ps_beq_sort == HIGH);
digitalWrite(embra, (et_bt_hm && !et_bt_mben && et_ps_beq_sort == HIGH&& et_ps_beq_sort == HIGH)||(et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort));
digitalWrite(benne , et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort);
digitalWrite(cl_para, et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort);
Pour faire plus simple, essaie ce code là : c'est le tien, mais il doit marcher, sinon je ne suis pas un ninja
La modif que j'ai faite : c'est remplacer chaque if par un calcul boolean. puis digitalWrite (sortie, t_xxx);. Quand une sortie dépend de plusieurs tests, alors on a des OR dans le digitalWrite. Ca a pour effet que les tests IF ne s'annulent plus les uns les autres...
/*
Atmega 644p
*/
// adressage des pins: // pin dispo 0,8,9,16,22) 8,9 ==> bt
#define bt_hm 31 // pins d'entrée Pupitre
#define bt_mben 30
#define bt_dben 29
#define bt_pell1 28
#define bt_pell2 27
#define bt_sonnette 25
// pins d'entrée capteurs
#define ct_ben_bas 20
#define ps_beq_rent 18 // bequilles completement rentrées 1 quand rentré
#define ps_beq_sort 17 // bequilles sorties et en pression 1 quand sortie
#define embra 15 // pins de sortie
#define cl_para 14
#define benne 12
#define pell1 6
#define pell2 4
#define dc_beq 3
#define sonnet 2
#define mo_beq 1
void setup() {
pinMode(embra, OUTPUT); // initialisation des E/S
pinMode(cl_para, OUTPUT);
pinMode(benne, OUTPUT);
pinMode(pell1, OUTPUT);
pinMode(pell2, OUTPUT);
pinMode(dc_beq, OUTPUT);
pinMode(sonnet, OUTPUT);
pinMode(mo_beq, OUTPUT);
pinMode(bt_hm, INPUT);
pinMode(bt_mben, INPUT);
pinMode(bt_dben, INPUT);
pinMode(bt_pell1, INPUT);
pinMode(bt_pell2, INPUT);
pinMode(bt_sonnette, INPUT);
pinMode(ct_ben_bas, INPUT);
pinMode(ps_beq_rent, INPUT);
pinMode(ps_beq_sort, INPUT);
}
boolean t_sonnette, t_pelle_s1, t_pelle_s2, t_beq_benne, t_hm_benne, t_benne_beq, t_hm_benne_beq; // variables de tests capteurs et boutons
void loop(){
int et_bt_hm = digitalRead(bt_hm); // attribution des etats des variables
int et_bt_mben = digitalRead(bt_mben);
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_ben_bas = digitalRead(ct_ben_bas);
int et_ps_beq_rent = digitalRead(ps_beq_rent);
int et_ps_beq_sort = digitalRead(ps_beq_sort);
// Sonnette alarme
t_sonnette = (!et_bt_sonnette || et_ps_beq_rent == HIGH); // sonnette si appui bouton ou bequilles non rentrées
// Pelle sens1
t_pelle_s1 = (!et_bt_hm && !et_bt_pell1); // vérification de l'homme mort et du BP pelle sens 1
// Pelle sens2
t_pelle_s2 = (!et_bt_hm && !et_bt_pell2); // vérification de l'homme mort et du BP pelle sens 2
// Sortir bequilles et monter benne
t_beq_benne = (!et_bt_hm && !et_bt_mben && et_ps_beq_sort == HIGH&& et_ps_beq_sort == HIGH); //vérification de l'homme mort et BP monte benne et pressostat bequilles non sorties
t_hm_benne = (!et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort); //vérification de l'homme mort et BP monte benne et pressostat bequilles sorties
// Descente benne et remonter bequilles
t_benne_beq = (!et_bt_hm && !et_bt_dben && et_ct_ben_bas == HIGH && et_ct_ben_bas == HIGH); //vérification de l'homme mort et BP descente benne et capteur benne basse non activé
t_hm_benne_beq = (!et_bt_hm && !et_bt_dben && !et_ct_ben_bas && !et_ct_ben_bas); //vérification de l'homme mort et BP descente benne et capteur benne basse activé
digitalWrite(sonnet, t_sonnette); // activation sonnette
digitalWrite(embra, t_pelle_s1 || t_pelle_s2 || t_beq_benne || t_hm_benne || t_hm_benne_beq); // activation embrayage
digitalWrite(pell1, t_pelle_s1); // pelle sens 1
digitalWrite(pell2, t_pelle_s2); // pelle sens 2
digitalWrite(dc_beq, t_beq_benne); // sortir bequilles
digitalWrite(benne, t_hm_benne); // monter benne
digitalWrite(cl_para, t_hm_benne || t_benne_beq); // ouvrir clapet parachute
digitalWrite(mo_beq, t_hm_benne_beq); // rentrer bequilles
}
C'est le petit cadeau du matin...
Maintenant, si tu prends par exemple le digitalWrite suivant :
digitalWrite(cl_para, t_hm_benne || t_benne_beq); // ouvrir clapet parachute
on trouve alors :
cl_para = (t_hm_benne || t_benne_beq)
= (!et_bt_hm && !et_bt_mben && !et_ps_beq_sort && !et_ps_beq_sort) || (!et_bt_hm && !et_bt_dben && et_ct_ben_bas == HIGH && et_ct_ben_bas == HIGH)
(...)
Je pense qu'en décomposant l'expression, on doit pouvoir simplifier grandement, limite si tu t'es pas pris la tête pour calculer tes associations pour faire des tests, alors que ce n'était pas nécessaire, et que tu as déjà les formules de tes sorties genre
sortie = entrée1 || (!entrée2 && entrée3)
Si mon code marche, alors en échange, je te demande de le réécrire en simplifiant le tout, sinon c'est trop facile, c'est ton projet, pas le mien!