Bien le bonjour à tous.

J'ai écrit un code Arduino que j'ai essayé de simuler via le logiciel "PROTEUS", mais malheureusement pour moi, ça ne fonctionne pas comme je le souhaite.

Lors de la simulation sous Proteus, lorsque j'appuis sur le bouton trois (Btn3), le système ne répond plus (même lorsque j'appuis sur un autre bouton ) et seule la ledB clignote.

J'aimerai comprendre pourquoi le système ne répond plus lorque j'appuis sur le bouton 3 (Btn3).

Quelqu'un peut-il m'aider à comprendre pourquoi ?

Voici le code source ci-dessous :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
 
/* instructions de pré-compilation pour définir les variables ledR,....,Btn2*/ 
#define ledR 6   
#define ledB 7
#define piezo 8
#define Btn1 10          // boutons pour le piezo
#define Btn2 11          // boutons pour led rouge
#define Btn3 12          // boutons pour led bleue
#define INPUT_MODE 0     // Mode pull-UP pour les boutons
/* instructions de pré-compilation pour définir les variables ledR,....,Btn2*/
 
/*Variable globales*/
char  statebtn1;         // Variable pour garder l'etat du bouton 1
char  statebtn2;         // Variable pour garder l'etat du bouton 2
char  statebtn3;         // Variable pour garder l'etat du bouton 3
long int timenextledR;
long int timenextledB;
long int timeBtn = millis();
/*Variable globales*/
 
/*Etats du système*/   
char LedRL=2;
char LedRI=7;
char LedBH=3;
char LedBI=8;   
char LedBL=4;
char LedBF=9; 
char pieH=5;   
char pieL=6;  
char stateledR=2;   
char stateledB=4; 
char statepie=6; 
char act; 
/*Etats du système*/
 
/*Déclaration des fonctions*/
void event(int a,int b,int c);   // fonction pour scructer les evènements
char condition();              // fonction pour vérifier les conditions 
void action(char a);              // fonction pour faire les actions
/*Déclaration des fonctions*/
 
 
void setup() {
  for(int i=6;i<9;i++){       // boucle pour configurer les variables ledR,...,piezo en sortie
    pinMode(i,OUTPUT);
  }
  for(int j=10;j<13;j++){     // boucle pour configurer les variables Btn1 et Btn2 en entrée
    pinMode(j,INPUT_PULLUP);
  }
}
 
void loop() {
 event(Btn1,Btn2,Btn3);
 condition();
 action(act);
}
 
void event(int a,int b,int c){          // fonction pour scructer les evènements
  if(digitalRead(a) == INPUT_MODE && millis() - timeBtn > 500){
        timeBtn = millis();
        statebtn1=1;      //variable pour dire bouton 1 appuyé
  }
  if(digitalRead(b) == INPUT_MODE && millis() - timeBtn > 500){
        timeBtn = millis();
        statebtn2=1;      //variable pour dire bouton 2 appuyé
  }
  if(digitalRead(c) == INPUT_MODE && millis() - timeBtn > 500){
        timeBtn = millis();
        statebtn3=1;      //variable pour dire bouton 2 appuyé
  }
}
 
char condition(){
  if(statebtn1==1){
    if(statepie==pieL){
        act=1;
    }
    else if(statepie==pieH){
        act=2;
    }
    statebtn1=0;
  }
  if(statebtn2==1){
    if(stateledR==LedRL){
        act=3;
    } 
    statebtn2=0; 
  }
  if(stateledR==LedRI){
        act=4;
  }
  if(statebtn3==1){
    if(stateledB==LedBL){
        act=5;
    }
    else{
      act=8;
    }
    statebtn3=0;
  }
  if(stateledB==LedBH){
        act=6;
  }
  if(stateledB==LedBI){
        act=7;
  }
  if(stateledB==LedBF){
        act=5;
  }
  return act;
}
 
void action(char a){
  switch(a){
      case 1:
        digitalWrite(piezo,HIGH);
        statepie=pieH;
        act=0;
      break; 
      case 2:
        digitalWrite(piezo,LOW);
        statepie=pieL;
        act=0;
      break;
      case 3:
        digitalWrite(ledR,HIGH);
        timenextledR=millis();
        stateledR=LedRI;
        act=0;
      break;
      case 4:
        if(millis()-timenextledR>=1500){
            digitalWrite(ledR,LOW);
            stateledR=LedRL; 
        }
        act=0;
      break;
      case 5:
        digitalWrite(ledB,HIGH);
        timenextledB=millis();
        stateledB=LedBH;
        act=0;
      break;
      case 6:
        if(millis()-timenextledB>=1000){
          digitalWrite(ledB,LOW);
          stateledB=LedBI; 
        }
        act=0;
      break;
      case 7:
        if(millis()-timenextledB>=2000){
          stateledB=LedBF; 
        }
        act=0;
      break;
      case 8:
        digitalWrite(ledB,LOW);
        stateledB=LedBL;
        act=0;
      break;
  } 
}