Lancer une action après un décompte

Hello,

dans le cadre d'une activité photo, j'ai construit un photobooth. Grosso modo, c'est un photomaton :slight_smile:

On appuie sur un bouton, un décompte (optionnel) se lance et la photo est prise. Ca c'est ce que je souhaitais réaliser. N'ayant réussi à coder ça, j'ai détourné le problème. :grin:

Matériel utilisé :

Actuellement, ça fonctionne mais c'est loin d'être optimal.
Côté hardware, le bouton est relié à la prise télécommande de l'appareil photo (ça je conserve) ET est relié à l'Arduino.
Ce dernier étant connecté à l'afficheur 7 segments.

Actuellement, lorsqu'on appuie sur le bouton, ça coupe l'alimentation de l'Arduino.

Quand on relache, l'Arduino est alimenté et le décompte de 2 secondes se lance jusqu'à 0.
Le bouton étant lui même connecté à l'appareil photo (va la prise télécommande) il déclenche immédiatement la photo. Pour que le déclenchement de l'APN et le décompte sur l'afficheur soient synchro, j'ai réglé l'APN sur retardateur 2 secondes.

Bref, c'est monté à l'envers mais ça fonctionne. Mais, 2 secondes c'est court. J'aimerai passer à 3-4-5 secondes.

Pour cela il me faut modifier l'hardware mais aussi le coté soft. Niveau hardware, je suppose que le déclencheur doit être branché à l'Arduino plutot qu'au bouton. L'Arduino lui donnera ainsi l'ordre de déclencher.
Actuellement, ça déclenche de suite puisque branché sur le bouton. Bon, ça déclenche le retardateur pour détourner le problème mais c'est pas super propre comme méthode...

Pour le montage propre, j'ai le cheminement en tête mais je galère à coder le truc :confused:

Mon idée :

  • l'afficheur 7 segments affiche 0

--> on appuie sur le bouton
---> lance le décompte 5-4-3-2-1-0
----> déclenche l'APN (qui n'est plus mis sur le retardateur)

Le déclenchement de l'APN doit donc être à la suite du décompte alors qu'actuellement il est simultanné (retardateur 2 secondes)

Je me répète un peu parce que je trouve mon montage assez tordu... :smiling_imp:

Je vous joint le code actuel et le schéma de montage.

int sega=2; // le segmeent A est connecter au pin 2 de l'arduino
int segb=3; // le segment B est connecter au pin 3 de l'arduino
int segc=4; // le segment C est connecter au pin 4 de l'arduino 
int segd=6; // le segment D est connecter au pin 6 de l'arduino
int sege=9; // le segment E est connecter au pin 9 de l'arduino
int segf=11; // le segment F est connecter au pin 11 de l'arduino
int segg=13; // le segment G est connecter au pin 13 de l'arduino
int tempo = 1000; // tempo est le temps qui va se passer entre chaque nombre donc la cest une 1 seconde d'attente entre chaque nombre car 1000 ms = 1 second



void setup() // je déclare mes sortie de mon arduino 
{
pinMode (sega,OUTPUT);
pinMode (segb,OUTPUT);
pinMode (segc,OUTPUT);
pinMode (segd,OUTPUT);
pinMode (sege,OUTPUT);
pinMode (segf,OUTPUT);
pinMode (segg,OUTPUT);
}

void loop()

{


// afficher 2
digitalWrite (sega,LOW);
digitalWrite (segg,LOW);
digitalWrite (sege,LOW);
digitalWrite (segd,LOW);
digitalWrite (segb,LOW);
digitalWrite (segc,HIGH);
digitalWrite (segf,HIGH);

// laisser 1 seonde d'attente
delay (tempo);
// afficher 1
digitalWrite (sega,HIGH);
digitalWrite (segg,HIGH);
digitalWrite (segd,HIGH);
digitalWrite (sege,HIGH); 
digitalWrite (segf,HIGH); 
digitalWrite (segb,LOW);
digitalWrite (segc,LOW);


// laisser 1 seconde d'attente 
delay (tempo);

// afficher le 0
digitalWrite (sega,LOW);
digitalWrite (segb,LOW);




digitalWrite (segc,LOW);
digitalWrite (segd,LOW);
digitalWrite (sege,LOW);
digitalWrite (segf,LOW);
digitalWrite (segg,HIGH);

 while(5) ; 

}

Le bouton noir sur le schéma représente l'appareil photo.

Pourriez vous m'aider à corriger mon taff ?

D'avance, je vous remercie :slight_smile:

c'est quoi comme appareil photo?
peut etre plus simple de faire comme ca

int pins [] = {2, 3, 4, 6, 9,11, 13 }; 
int digit[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int tempo = 1000; 

char Code[] = {B01111110, B00110000, B01101101, B01111001, B00110011, B01011011, B01011111, B01110000, B01111111, B01111011 }; // allume les leds  du 7 segments de 0 a 9


void setup()
{
for(int i = 0; i < 7; i++) // met les sortie digital en sortie
pinMode(pins[i], OUTPUT);
}

void loop()
{
for(int j = 10; j >0; j--) // va afffichage decrementation de 9 à 0...
{
affiche(digit[j]);
delay(tempo);
}

// envoyer une commande a l'appareil photo


void affiche(int num)
{
int mask = 1;
for(int i = 0; i < 8; i++)
{
if((mask & Code[num]) == 0)
digitalWrite(pins[i], LOW);
else digitalWrite(pins[i], HIGH);
mask = mask << 1;
}
}

bonjour,
tu peux t'inspirer de CECI

et comme demandé, quel marque et type d'apn?

Déjà, merci pour vos réponses rapides c'est cool :slight_smile: :slight_smile:

--

C'est un Canon EOS 50D. Ca pourrait évoluer vers un 6D ou 5DII mais les prises télco sont les mêmes.

Pour l'intervalomètre, je suis tombé sur un tuto similaire mais tous les petits à côté, le fait que ce soit en boucle, qu'il y ait un buzzer supplémentaire, l'écran différent etc... m'ont perturbés :confused:

Je suis vraiment pas du monde du développement alors je n'ai pas bien réussi à isoler ce qui m'intéresse.

--

hazerty565

Merci pour le code, c'est vraiment super sympa mais avant de le téleverser, j'ai envie de comprendre ce que je fais :smiley:

int pins [] = {2, 3, 4, 6, 9,11, 13 };
int digit[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int tempo = 1000;

char Code[] = {B01111110, B00110000, B01101101, B01111001, B00110011, B01011011, B01011111, B01110000, B01111111, B01111011 }; // allume les leds  du 7 segments de 0 a 9

Là, on explique à l'Arduino les différents branchements et les ordres à réaliser ?
0 pour LOW
1 pour HIGH si on reprend les termes que j'ai utilisé en haut.
Ca, OK.

void setup()
{
for(int i = 0; i < 7; i++) // met les sortie digital en sortie
pinMode(pins[i], OUTPUT);
}

void loop()

Là déjà, première question... je comprends pas vraiment ce qu'il se passe :frowning:
Quand i passe à 0 après le décompte, on passe à l'odre suivant ??
Mais qui est ce i ? Et pourquoi i <7 ?

void loop()
{
for(int j = 10; j >0; j--) // va afffichage decrementation de 9 à 0...
{
affiche(digit[j]);
delay(tempo);
}

Boucle avec le décompte de 9 à 0 avec un délai de 1000ms, tempo réglé au début.
Ca OK... mais qui est ce j ? L'afficheur 7 segments ?

Par contre si je lis loop(), ça veut dire qu'une fois arrivé au 0 on est reparti pour un décompte à partir de 9 ?

void affiche(int num)
{
int mask = 1;
for(int i = 0; i < 8; i++)
{
if((mask & Code[num]) == 0)
digitalWrite(pins[i], LOW);
else digitalWrite(pins[i], HIGH);
mask = mask << 1;
}
}

Là, si j'ai suivi :
si on arrive à 0 alors c'est LOW et du coup ça déclenche ?
Si c'est une autre valeur, c'est HIGH et du coup on attend le LOW ?

Encore merci pour votre aide !

salut

un peu de lecture, pour répondre à tes premières questions :

https://www.arduino.cc/en/Reference/For

Mais qui est ce i ? Et pourquoi i <7 ?

premiere question...

pourquoi 7, en faite, tu reponds a ta question juste apres =>> 7 segments,tu vas juste configurer tes pin de l'arduino en sortie

pour la deuxieme question, J c'est pour la boucle for, et decrementer
et la fonction affiche, eh ben ca les numeros de 9 a 0.. donc pour toi, il y a juste a reflechir pour faire de 5 à 0..

et la derniere, c'est juste une fonction qui va allumer les bonne leds pour faire le bon numero en fonction du tableau code ex B00110000 ca t'afficher 1 sur le 7 segments.

Par la suite, j'ai trouver un site, qui permet de controler un eos avec un arduino et un bouton...

http://arduinophilchx.blogspot.fr/

A nouveau, merci pour vos réponses :slight_smile:

bricofoy:
salut

un peu de lecture, pour répondre à tes premières questions :

https://www.arduino.cc/en/Reference/For

Oui, j'avais déjà lu avant de poser la question ici (mais en français :stuck_out_tongue: ) mais étant totalement néophyte au dev, c'est resté très, très flou pour moi :confused:

hazerty565:
premiere question...

pourquoi 7, en faite, tu reponds a ta question juste apres =>> 7 segments,tu vas juste configurer tes pin de l'arduino en sortie

pour la deuxieme question, J c'est pour la boucle for, et decrementer
et la fonction affiche, eh ben ca les numeros de 9 a 0.. donc pour toi, il y a juste a reflechir pour faire de 5 à 0..

et la derniere, c'est juste une fonction qui va allumer les bonne leds pour faire le bon numero en fonction du tableau code ex B00110000 ca t'afficher 1 sur le 7 segments.

Par la suite, j'ai trouver un site, qui permet de controler un eos avec un arduino et un bouton...

http://arduinophilchx.blogspot.fr/

Je n'étais pas tombé sur ce site mais sûr d'autres, mais vraiment c'est trop complexe pour moi pour arriver à isoler ce que je veux :frowning:
Déjà, ce que j'ai réussi à réaliser, ça m'a pris je ne sais plus combien d'heures de bidouilles, recherches... Ne serait que pour allumer les segments c'était une grosse bataille ! Alors un truc plus complexe...
Je démarre de quasiment 0. Je veux arriver à mon objectif évidemment mais je veux également comprendre comment ça fonctionne. Démarrer avec cette grosse pas de code ça me semble démesuré pour mon niveau :confused:

Du coup, en effet pour le chiffre 7, c'était un peu bête :smiley:
Pour afficher de 5 à 0, je devrais y arriver tout seul oui je pense.

Du coup, j'ai essayé de téléverser ce programme pour commencer à bricoler le hardware, mais erreur :confused:

Arduino : 1.6.5 Hourly Build 2015/05/19 09:13 (Windows 7), Carte : "Arduino Uno"

Les options de compilation ont été modifiées, tout sera recompilé

decompte3_2017.ino: In function 'void loop()':
decompte3_2017:27: error: a function-definition is not allowed here before '{' token
decompte3_2017:36: error: expected '}' at end of input
a function-definition is not allowed here before '{' token

Ce rapport contiendrait plus d'informations si l'option
"Montrer les informations de sortie pendant la compilation"
était activée dans Fichier > Préférences.

Et est surligné la ligne avec { entre

void affiche(int num)

et

int mask = 1;

dans la dernière partie

:frowning:

pour éviter cette erreur, il manque un } après // envoyer une commande a l'appareil photo

les { et } permettent de délimiter des blocs de programmation, en l’occurrence ici la fonction loop()

Ok, je viens de voir oui. C'était avant et non après mais j'ai compris le principe, merci :slight_smile:

J'essaie d'avancer un peu tout seul et si besoin je reviens vous voir. Et si ça marche, je viens fêter ma victoire avec vous :smiley:

Bon, les branchements sur l'afficheur 7 segments sont complètement à la ramasse ici, je vais essayer de corriger ça.

Et supprimer la fonction loop.
Le lancement de la séquence de décompte se fera via un bouton externe qui sera branché sur l'Arduino... mais étape par étape, je vais d'abord faire les branchements de l'afficheur

supprimer loop() pas certain que ce soit une bonne idée... ça va avoir du mal à compiler

tu peux la laisser, mais vide, cela dit loop me semble le bon endroit pour attendre ton appui sur le bouton

Hélas, ce n'est pas le fonctionnement que je veux donner :confused:

Je me suis peut-être mal exprimé.

De base, sans aucune action, le compteur affiche "0".
On appuie sur le bouton, il lance le compteur 5, 4, 3, 2, 1, 0
Quand il arrive à 0, Arduino déclenche l'appareil photo et le compteur reste sur 0 jusqu'au prochain déclement.

En fait, je veux simplement que l'Arduino serve de télécommande avec un délai à l'appareil photo et ce délai se décompte sur l'afficheur pour savoir quand l'appareil photo déclenche.

j'ai bien compris

et je maintiens que c'est dans loop() que tu dois faire l'attente de l'appui sur le bouton, puis faire le décompte, puis envoyer la commande de l'appareil, puis retourner en attente