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:
-
Mode manuel avec pour le déclenchement un bouton 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 (4 vitesses possibles que l'utilisateur peut voir avec 4 leds)
// 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;
}
l'appui sur les boutons est parfois lent à être détecter. Dans mon cablage, j'ai pourtant utilisé un montage avec une résistance pull-down pour chaque bouton utilisé.
Est ce possible d'améliorer ce comportement de boutons? Ou de faire mieux et plus simple (enfin plus simple mais faut que j'arrive à le comprendre ensuite don c pas trop de contraction dans les formules?)
Merci beaucoup pour votre aide.
