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
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
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; }
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?
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;} }
Merci
Partager