Go Down

Topic: [RESOLU] Probleme de Switch/Case (Read 3719 times) previous topic - next topic

PaulinHalenria

Jun 16, 2013, 02:39 pm Last Edit: Jun 17, 2013, 12:22 am by PaulinHalenria Reason: 1
Je suis à la fois content de moi et à la fois très frustré.
Dans un but de HighSpeed Photography, j'ai réussi à faire un montage qui tient la route et un code qui fait ce que je veux.
Sauf qu'il ne le fait pas quand je veux.

Normalement, il doit attendre Un premier bruit fort pour déclencher l'appareil photo (qui est en mode BULB)
Le son est géré par en sensor qui me renvoie un signal digital si je dépasse un seuil réglé par un potentiomètre intégré au sensor. Pas de threshold dans le code donc puis géré dans le sensor directement.
Au boum suivant, il doit déclencher le flash.
Puis après une petite pause, il doit couper l'appareil photo.

Seulement, avant qu'il y ait du bruit, il me déclenche le flash. Ensuite l'appareil photo, ensuite il coupe l'appareil photo. Mais il n'attend aucun bruit pour faire les choses, dans le mauvais ordre qui plus est (mais je n'en suis pas sur à 100% il les fait peut-être presque en même temps et le flash est plus rapide que l'appareil).

Voici mon code

Code: [Select]
int flashPin = 13;  // pin qui declenche le flash
int soundPin = 7;   // pin qui capte le signal du son
int boutonPin = 7;  // pin qui lit le bouton. Idem que son en attendant achat bouton
int dslrPin = 5;    // pin qui declenche la cam
int lightPin = 3;   // pin qui capte la variation lumineuse
int relayPin = 2;   // pin qui coupe la lumiere dans la piece
int bruit = 0;      // variable de lecture du son
int bouton = 0;     // variable de lecture du bouton start
int etape = 1;      // variable d'etat

void setup()
{
 pinMode(soundPin, INPUT);       // capteur du son est une entree
 pinMode(lightPin, INPUT);       // capteur de lumiere est une entree
 pinMode(boutonPin, INPUT);      // bouton de mise en route (soundtrigger en attendant achat)
 pinMode(dslrPin, OUTPUT);       // declenchement de la cam est une sortie
 pinMode(flashPin, OUTPUT);      // declenchement du flash est une sortie
 pinMode(relayPin, OUTPUT);      // relais 220V pour couper ou allumer la lampe dans la piece
}

void loop()
{
switch(etape) {
case 1: {
// on attend le bouton de mise en route qui existe pas encore donc sound a la place
bruit = digitalRead(soundPin);   // lecture du son
if (bruit = HIGH)
{
// digitalWrite(relayPin, LOW); // on coupe la lumiere via le relais
delay(50); // on attend 50 millisecondes pourrait etre remplace par lecture lightPin
digitalWrite(dslrPin, HIGH); // on ouvre obturateur du dslr
etape++; //increment pour etape suivante
}
break;
}
case 2: {
// on ecoute le son de declenchement
bruit = digitalRead(soundPin);   // lecture du son
if (bruit = HIGH)
{
digitalWrite(flashPin, HIGH); // declenchement du flash
delay(20);
digitalWrite(flashPin, LOW); // arret envoi signal au flash
etape++; //increment pour etape suivante
}
break;
}
case 3: {
// on revient dans le monde normal
delay(50);   // petite pause
digitalWrite(dslrPin, LOW); // fermeture obturateur
delay(50);  // petite pause
// digitalWrite(relayPin, HIGH); // on allume la lumiere
etape++; //increment pour etape suivante
break;
}
default: {
break; // on ne fait rien
}
 }
}

Viproz

il n'y a aucun délai en fin de boucle, quand un bruit est détecté, il peut faire toutes les étapes et le bruit ne sera toujours pas fini

Pour ton problème de déclenchement sans qu'aucun bruit n'ai été fait, tu es sur d'avoir bien réglé le potentiomètre de ton sensor ?

stig_mat

Sais-tu combien de temps ton capteur de bruit maintient-il le signal haut sur soundPin ?
Parce qu'effectivement s'il dure plus que le temps de traitement de la première étape...

PaulinHalenria

J'ai mis des pauses, j'ai baissé le potentiomètre au plus plus bas et pourtant même comportement, moins rapide bien sur.

Code: [Select]
int flashPin = 13;  // pin qui declenche le flash
int soundPin = 7;   // pin qui capte le signal du son
int boutonPin = 7;  // pin qui lit le bouton. Idem que son en attendant achat bouton
int dslrPin = 5;    // pin qui declenche la cam
int lightPin = 3;   // pin qui capte la variation lumineuse
int relayPin = 2;   // pin qui coupe la lumiere dans la piece
int bruit = 0;      // variable de lecture du son
int bouton = 0;     // variable de lecture du bouton start
int etape = 1;      // variable d'etat

void setup()
{
  pinMode(soundPin, INPUT);       // capteur du son est une entree
  pinMode(lightPin, INPUT);       // capteur de lumiere est une entree
  pinMode(boutonPin, INPUT);      // bouton de mise en route (soundtrigger en attendant achat)
  pinMode(dslrPin, OUTPUT);       // declenchement de la cam est une sortie
  pinMode(flashPin, OUTPUT);      // declenchement du flash est une sortie
  pinMode(relayPin, OUTPUT);      // relais 220V pour couper ou allumer la lampe dans la piece
}

void loop()
{
switch(etape) {
case 1: {
// on attend le bouton de mise en route qui existe pas encore donc sound a la place
                        delay(5000);
bruit = digitalRead(soundPin);   // lecture du son
if (bruit = HIGH)
{
// digitalWrite(relayPin, LOW); // on coupe la lumiere via le relais
delay(50); // on attend 50 millisecondes pourrait etre remplace par lecture lightPin
digitalWrite(dslrPin, HIGH); // on ouvre obturateur du dslr
etape++; //increment pour etape suivante
}
break;
}
case 2: {
// on ecoute le son de declenchement
                        delay(5000);
bruit = digitalRead(soundPin);   // lecture du son
if (bruit = HIGH)
{
digitalWrite(flashPin, HIGH); // declenchement du flash
delay(20);
digitalWrite(flashPin, LOW); // arret envoi signal au flash
etape++; //increment pour etape suivante
}
break;
}
case 3: {
// on revient dans le monde normal
delay(5000);   // petite pause
digitalWrite(dslrPin, LOW); // fermeture obturateur
delay(50);  // petite pause
// digitalWrite(relayPin, HIGH); // on allume la lumiere
etape++; //increment pour etape suivante
break;
}
default: {
break; // on ne fait rien
}
  }
}

Viproz

dans ce cas là, sans le modèle de ton sensor, on ne peut pas t'aider


Viproz

Tu devrais tester le sensor en lui même, dans ta boucle tu met la led du pin 13 à l'état que tu reçoit, et tu regarde si en tournant le potentiomètre elle s'éteint

PaulinHalenria

Alors, avec ce code-ci pour tester

Code: [Select]
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7;   // soundsensor connected to digital pin 7
int val = 0;     // variable to store the read value

void setup()
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin 13 as output
  pinMode(inPin, INPUT);      // sets the digital pin 7 as input
}

void loop()
{
  val = digitalRead(inPin);   // read the input pin
  digitalWrite(ledPin, val);    // sets the LED to the button's value
}


Quand je "frappe" sur le bureau, la LED 13 s'allume
Si j'augmente le potentiomètre (enfin je tourne dans le sens des aiguilles d'une montre, ce que j'assimile à augmenter), la LED est allumée constamment. Quand je frappe sur le bureau, elle s'éteint.
Si je pousse le potentiomètre à fond, elle reste allumée tout le temps.

A noter, il y a deux leds sur le sensor.
Si on regarde l'image

La led en haut de l'image (texte en Chinois au dessus de VCC) est allumée dès qu'il y a du courant.
La led en bas de l'image (texte en Chinois en dessous de OUT) est allumée à l'opposé de la LED 13 de l'Arduino.
Quand il réagit au bruit, l'allumage de la LED 13 éteint la LED en question sur le senseur. Et quand la LED 13 s'éteint, la LED du sensor se rallume.
Quand je change le potentiomètre, j'ai cette LED allumée tout le temps (quand je suis sous le niveau de bruit ambiant) ou éteinte tout le temps quand le potentiomètre est monté.

:(

fdufnews

Dans le setup, c'est pas tout de déclarer qui est en sortie et qui est en entrée, il faut aussi fixer les états des sorties qui sont dans un état indéterminées.

Viproz

c'est juste que c'est inversé dans ce cas là, règle ton potentiomètre pour que la led du capteur ne soit allumée que quand tu tape sur la table et remplace dans ton code les :
Code: [Select]
if (bruit = HIGH)
par :
Code: [Select]
if (bruit = LOW)

PaulinHalenria

Alors en fait, c'est l'ensemble de vos réponses qui a amené à la solution.
D'abord le signal du sensor est inversé et ensuite le signal restait trop longtemps actif donc il faisait les 4 étapes à chaque fois.
Voici mon code final, y compris l'écriture sur le port série pour le débogage. :

Code: [Select]
int flashPin = 13;  // pin qui declenche le flash
int soundPin = 7;   // pin qui capte le signal du son
int boutonPin = 7;  // pin qui lit le bouton. Idem que son en attendant achat bouton
int dslrPin = 5;    // pin qui declenche la cam
int lightPin = 3;   // pin qui capte la variation lumineuse
int relayPin = 2;   // pin qui coupe la lumiere dans la piece
int bruit = 0;      // variable de lecture du son
int bouton = 0;     // variable de lecture du bouton start
int etape = 1;      // variable d'etat

void setup()
{
  pinMode(soundPin, INPUT);       // capteur du son est une entree
  pinMode(lightPin, INPUT);       // capteur de lumiere est une entree
  pinMode(boutonPin, INPUT);      // bouton de mise en route (soundtrigger en attendant achat)
  pinMode(dslrPin, OUTPUT);       // declenchement de la cam est une sortie
  pinMode(flashPin, OUTPUT);      // declenchement du flash est une sortie
  pinMode(relayPin, OUTPUT);      // relais 220V pour couper ou allumer la lampe dans la piece
  Serial.begin(19200);
}

void loop()
{
switch(etape) {
case 1: {
// on attend le bouton de mise en route qui existe pas encore donc sound a la place
bruit = digitalRead(soundPin);   // lecture du son
if (bruit != HIGH)
{
// digitalWrite(relayPin, LOW); // on coupe la lumiere via le relais
delay(50); // on attend 50 millisecondes pourrait etre remplace par lecture lightPin
digitalWrite(dslrPin, HIGH); // on ouvre obturateur du dslr
                                Serial.print( bruit );
                                Serial.print( etape );
                                Serial.println ();
                                delay(500);   // petite pause
etape++; //increment pour etape suivante
}
break;
}
case 2: {
// on ecoute le son de declenchement
bruit = digitalRead(soundPin);   // lecture du son
if (bruit != HIGH)
{
digitalWrite(flashPin, HIGH); // declenchement du flash
delay(20);
digitalWrite(flashPin, LOW); // arret envoi signal au flash
                                Serial.print( bruit );
                                Serial.print( etape );
                                Serial.println ();
                                delay(500);   // petite pause
etape++; //increment pour etape suivante
}
break;
}
case 3: {
// on revient dans le monde normal
digitalWrite(dslrPin, LOW); // fermeture obturateur
delay(50);  // petite pause
// digitalWrite(relayPin, HIGH); // on allume la lumiere
                                Serial.print( bruit );
                                Serial.print( etape );
                                Serial.println ();
delay(500);   // petite pause
                        etape++; //increment pour etape suivante
break;
}
default: {
                                Serial.print( bruit );
                                Serial.print( etape );
                                Serial.println ();
                                etape = 1;
break; // on ne fait rien
}
  }
}

Go Up