Bonjour
Je suis débutant dans l'utilisation de C++, je l'utilise pour programmer ma carte arduino. Jusqu'à présent, je modifiais très légérement les scripts que je trouvais sur le net mais cette fois ci j'ai réalisé un script assez consequent.

Mon projet est de piloter 4 appareils numériques grace a des télécommandes filaires MCDC2 que j'ai démonté pour pouvoir gérer le tout avec arduino.

J'ai rajouté 2 modes de fonctionnement: (nom du bouton: boutonmodeM et boutonmodeA)

- Mode manuel avec pour le déclenchement un bouton (nom du bouton: boutonShoot) focus/shoot que l'utilisateur doit appuyer

- Mode automatique ou la, la prise de photo se fait automatiquement avec un intervalle entre 2 photos que l'utilisateur peut modifier avec un bouton vitesse (nom du bouton: boutonVitesse) (4 vitesses possibles, la vitesse augmente a chaque appui sur le bouton, l'utilisateur peut voir cette vitesse avec 4 leds)

Voici mon code initial
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
164
165
//  Définition des constantes
 
const int boutonModeM = 2;      // crée un identifiant pour la broche utilisée avec le bouton mode manuel
const int boutonModeA = 3;      // crée un identifiant pour la broche utilisée avec le bouton mode auto
const int boutonShoot = 4;      // crée un identifiant pour la broche utilisée avec le bouton shoot
const int boutonVitesse = 5;    // crée un identifiant pour la broche utilisée avec le bouton vitesse
const int focus = 8;            // crée un identifiant pour la broche utilisée pour le focus
const int shoot = 9;            // crée un identifiant pour la broche utilisée pour le shoot
const int ledPin1 = 10;         // crée un identifiant pour la broche utilisée avec la LED
const int ledPin2 = 11;         // crée un identifiant pour la broche utilisée avec la LED
const int ledPin3 = 12;         // crée un identifiant pour la broche utilisée avec la LED
const int ledPin4 = 13;         // crée un identifiant pour la broche utilisée avec la LED
 
// Les variables sont modifiées au cours du programme
int boutonModeMState = 0;        //Variable pour l'état actuel du bouton Mode Manuel
int lastboutonModeMState = 0;    // Variable pour l'état précédent du bouton Mode Manuel
int boutonModeAState = 0;        //Variable pour l'état actuel du bouton Mode Auto
int lastboutonModeAState = 0;    // Variable pour l'état précédent du bouton Mode Auto
int boutonShootState = 0;        //Variable pour l'état actuel du bouton Shoot
int lastboutonShootState = 0;    // Variable pour l'état précédent du bouton Shoot
int boutonVitesseState = 0;      //Variable pour l'état actuel du bouton Vitesse
int lastboutonVitesseState = 0;  // Variable pour l'état précédent du bouton Vitesse
int boutonVitesseCounter = 0;    // variable pour le comptage du nombre d'appuis sur le bouton vitesse
int val = 1000;                  // temps entre 2 photos en mode Automatique soit 1s
 
void setup() {
  // mettre les broches en entrée
  pinMode(boutonModeM, INPUT);
  pinMode(boutonModeA, INPUT);
  pinMode(boutonShoot, INPUT);
  pinMode(boutonVitesse, INPUT);
 // mettre les broches en sortie
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(focus, OUTPUT);   
  pinMode(shoot, OUTPUT);
  // initialise la communication série
  Serial.begin(9600);
}
 
 
void loop() {
  // lit l'état actuel des boutons et les mémorise dans une variable
  boutonModeMState = digitalRead(boutonModeM);
  boutonModeAState = digitalRead(boutonModeA);
  boutonShootState = digitalRead(boutonShoot);
  boutonVitesseState = digitalRead(boutonVitesse);
 
  // MODE MANUEL
  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (boutonModeMState != lastboutonModeMState ) {
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (boutonModeMState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS à HAUT
           Serial.println("Mode Manuel");
                                  }
 else {
      // si le bouton courant est BAS
      // il est passé de HAUT à BAS :
      Serial.println("Pas d'appui");
      }
  }
   // PRISE DE PHOTOS
    if (boutonShootState != lastboutonShootState) {
      if (boutonModeMState == HIGH && boutonShootState == HIGH) {
      Serial.println("Prise photo");
      digitalWrite(focus, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(500);                  // wait for a second
      digitalWrite(shoot, HIGH);   // turn the LED off by making the voltage LOW
      delay(100);                  // wait for a second
      digitalWrite(focus, LOW);    // turn the LED on (HIGH is the voltage level)
      digitalWrite(shoot, LOW);    // turn the LED off by making the voltage LOW
    } 
}    
  // MODE AUTOMATIQUE
  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (boutonModeAState != lastboutonModeAState) {
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (boutonModeAState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS à HAUT
            Serial.print("Mode Auto");
}
 else {
      // si le bouton courant est BAS
      // il est passé de HAUT à BAS :
      Serial.println("Pas d'appui");
    }
}
  // REGLAGE VITESSE PHOTOS
  if (boutonVitesse != lastboutonVitesseState) {
 
      if (boutonModeAState == HIGH && boutonVitesseState == HIGH) {
      Serial.println("Reglage vitesse");
      boutonVitesseCounter++;
      Serial.println(boutonVitesseCounter, DEC);
    }
}
 
switch (boutonVitesseCounter) 
{
   case 1 :
    // traitement si 1 appui
    digitalWrite(ledPin1, HIGH); // allume la LED 1 
    Serial.println("LEd 1");
    Serial.println(val);
break ;
 
   case 2 :
    // traitement si 2 appuis
    digitalWrite(ledPin2, HIGH); // allume la LED 2 
    Serial.println("LEd 2");
    Serial.println(val);
break ;
 
   case 3 :
// traitement si 3 appuis
    digitalWrite(ledPin3, HIGH); // allume la LED 3 
    Serial.println("LEd 3");
    Serial.println(val);
break ;
 
   case 4 :
// traitement si 4 appuis
   digitalWrite(ledPin4, HIGH); // allume la LED 4 
   Serial.println("LEd 4");
   Serial.println(val);
break ;
 
  case 5 :
// traitement si 5 appuis
Serial.println("Remise à zéro");
digitalWrite(ledPin4, LOW); // eteint la LED 4
digitalWrite(ledPin3, LOW); // eteint la LED 3
digitalWrite(ledPin2, LOW); // eteint la LED 2
boutonVitesseCounter = 1;
break ;
 
default :
// traitement si aucun bouton n'a été utilisé
break ;
} 
 
  // PRISE DE PHOTOS avec Val comme délai entre 2 photos
  val = boutonVitesseCounter * 1000;
  digitalWrite(focus, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);               // wait for a second
  digitalWrite(shoot, HIGH);    // turn the LED off by making the voltage LOW
  delay(100);               // wait for a second
  digitalWrite(focus, LOW);   // turn the LED on (HIGH is the voltage level)
  digitalWrite(shoot, LOW);    // turn the LED off by making the voltage LOW
  delay(val);
 
    //mémorise l'état courant du bouton poussoir
    //pour les prochains passages dans la boucle loop
    lastboutonModeMState = boutonModeMState;
    lastboutonModeAState = boutonModeAState;
    lastboutonShootState = boutonShootState;
    lastboutonVitesseState = boutonVitesseState;
 
 
  }
On m'a conseillé de faire des fonctions pour alleger le programme. J'ai fait cela pour commencer:
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
//  Définition des constantes
 
const int boutonModeM = 2;      // crée un identifiant pour la broche utilisée avec le bouton mode manuel
const int boutonModeA = 3;      // crée un identifiant pour la broche utilisée avec le bouton mode auto
const int boutonShoot = 4;      // crée un identifiant pour la broche utilisée avec le bouton shoot
const int boutonVitesse = 5;    // crée un identifiant pour la broche utilisée avec le bouton vitesse
const int focus = 8;            // crée un identifiant pour la broche utilisée pour le focus
const int shoot = 9;            // crée un identifiant pour la broche utilisée pour le shoot
const int ledPin1 = 10;         // crée un identifiant pour la broche utilisée avec la LED
const int ledPin2 = 11;         // crée un identifiant pour la broche utilisée avec la LED
const int ledPin3 = 12;         // crée un identifiant pour la broche utilisée avec la LED
const int ledPin4 = 13;         // crée un identifiant pour la broche utilisée avec la LED
 
// Les variables sont modifiées au cours du programme
int boutonModeMState = 0;        //Variable pour l'état actuel du bouton Mode Manuel
int lastboutonModeMState = 0;    // Variable pour l'état précédent du bouton Mode Manuel
int boutonModeAState = 0;        //Variable pour l'état actuel du bouton Mode Auto
int lastboutonModeAState = 0;    // Variable pour l'état précédent du bouton Mode Auto
int boutonShootState = 0;        //Variable pour l'état actuel du bouton Shoot
int lastboutonShootState = 0;    // Variable pour l'état précédent du bouton Shoot
int boutonVitesseState = 0;      //Variable pour l'état actuel du bouton Vitesse
int lastboutonVitesseState = 0;  // Variable pour l'état précédent du bouton Vitesse
int boutonVitesseCounter = 1;    // variable pour le comptage du nombre d'appuis sur le bouton vitesse
int val = 1000;                  // temps entre 2 photos en mode Automatique soit 1s
 
void setup() {
  // mettre les broches en entrée
  pinMode(boutonModeM, INPUT);
  pinMode(boutonModeA, INPUT);
  pinMode(boutonShoot, INPUT);
  pinMode(boutonVitesse, INPUT);
 // mettre les broches en sortie
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  pinMode(focus, OUTPUT);   
  pinMode(shoot, OUTPUT);
  // initialise la communication série
  Serial.begin(9600);
}
 
 
void loop() {
  // lit l'état actuel des boutons et les mémorise dans une variable
  boutonModeMState = digitalRead(boutonModeM);
  boutonModeAState = digitalRead(boutonModeA);
  boutonShootState = digitalRead(boutonShoot);
  boutonVitesseState = digitalRead(boutonVitesse);
 
  // MODE MANUEL
  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (boutonModeMState != lastboutonModeMState ) {
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (boutonModeMState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS à HAUT
           Serial.println("Mode Manuel");
                                  }
 else {
      // si le bouton courant est BAS
      // il est passé de HAUT à BAS :
      Serial.println("Pas d'appui");
      }
  }
   // PRISE DE PHOTOS
    if (boutonShootState != lastboutonShootState) {
      if (boutonModeMState == HIGH && boutonShootState == HIGH) {
      Serial.println("Prise photo");
      void prisedephoto();
    } 
}    
  // MODE AUTOMATIQUE
  // compare l'état actuel du bouton poussoir à l'état précédent mémorisé
  if (boutonModeAState != lastboutonModeAState) {
    // si l'état du bouton poussoir a changé et est HAUT, on incrémente la variable de comptage
    if (boutonModeAState == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS à HAUT
            Serial.print("Mode Auto");
}
 else {
      // si le bouton courant est BAS
      // il est passé de HAUT à BAS :
      Serial.println("Pas d'appui");
    }
}
  // REGLAGE VITESSE PHOTOS
  if (boutonVitesse != lastboutonVitesseState) {
 
      if (boutonModeAState == HIGH && boutonVitesseState == HIGH) {
      Serial.println("Reglage vitesse");
      boutonVitesseCounter++;
	vitesse (val);
      Serial.println(boutonVitesseCounter, DEC);
    }
}
 
  // PRISE DE PHOTOS avec Val comme délai entre 2 photos
  val = boutonVitesseCounter * 1000;
  digitalWrite(focus, HIGH);   // turn the LED on (HIGH is the voltage level)
  void prisedephoto();
  delay(val);
 
    //mémorise l'état courant du bouton poussoir
    //pour les prochains passages dans la boucle loop
    lastboutonModeMState = boutonModeMState;
    lastboutonModeAState = boutonModeAState;
    lastboutonShootState = boutonShootState;
    lastboutonVitesseState = boutonVitesseState;  
  }
 
void prisedephoto () {
digitalWrite(focus, HIGH);   // turn the LED on (HIGH is the voltage level)
delay(500);               // wait for a second
digitalWrite(shoot, HIGH);    // turn the LED off by making the voltage LOW
delay(100);               // wait for a second
digitalWrite(focus, LOW);   // turn the LED on (HIGH is the voltage level)
digitalWrite(shoot, LOW);    // turn the LED off by making the voltage LOW 
}
 
int vitesse (int val) {
switch (boutonVitesseCounter) {
   case 1 :
    // traitement si 1 appui
    digitalWrite(ledPin1, HIGH); // allume la LED 1 
    Serial.println("LEd 1");
    Serial.println(val);
break ;
   case 2 :
    // traitement si 2 appuis
    digitalWrite(ledPin2, HIGH); // allume la LED 2 
    Serial.println("LEd 2");
    Serial.println(val);
break ;
   case 3 :
// traitement si 3 appuis
    digitalWrite(ledPin3, HIGH); // allume la LED 3 
    Serial.println("LEd 3");
    Serial.println(val);
break ;
   case 4 :
// traitement si 4 appuis
   digitalWrite(ledPin4, HIGH); // allume la LED 4 
   Serial.println("LEd 4");
   Serial.println(val);
break ;
  case 5 :
// traitement si 5 appuis
Serial.println("Remise à zéro");
digitalWrite(ledPin4, LOW); // eteint la LED 4
digitalWrite(ledPin3, LOW); // eteint la LED 3
digitalWrite(ledPin2, LOW); // eteint la LED 2
boutonVitesseCounter = 1;
break ;
  default :
// traitement si aucun appui n'a été fait
break ; 
return val;} 
}
Est ce possible d'améliorer tout cela? Les boutons réagissent mais parfois il faut appuyer longtemps pour que cela réagisse... D'ou vient cette lenteur de réaction?
Merci