Bonsoir,
J'ai commencé à vraiment utiliser Arduino depuis peu et j'ai un problème concernant un projet que je suis en train de réaliser pour mes études. Cela consiste à mettre en rotation une ligne de LED et grâce à la persistance rétienne afficher un message. Une des difficultés est d'adapter la fréquence de clignotement des LEDs par rapport à la vitesse de rotation et aussi réussir à faire clignoter les LEDs toujours au même endroit dans l'espace. Pour cela je me suis inspiré d'un système trouvé sur un projet similaire qui est de mettre une source lumineuse fixe et un capteur en rotation avec les LEDs. Ainsi à chaque fois que le capteur passe devant la source lumineuse, le dispositif à fait un tour (et donc par le calcul on trouve la fréquence de clignotement adaptée).
Globalement ça fonctionne bien, le mot s'affiche et mon capteur détecte bien chaque fois que mon système fait un tour. Mais mon problème est si mon système n'a pas fini d'afficher un mot et que mon capteur détecte un tour. Ce que je voudrais mettre en place c'est faire une interruption à chaque fois que mon capteur détecte une source lumineuse importante (signe du tour complet) et à ce moment là recommencer ma boucle qui me permet de faire clignoter les LEDs. Et c'est justement ici que j'ai du mal. Je ne comprend pas comment arrêter la boucle d'affichage de mon mot et revenir au début de la boucle loop ().
Je suis désolé si ce n'est pas vraiment clair. C'est pour cela que j'ai fait un petit code pour modéliser ma situation.
void setup() {
Serial.begin (9600) ;
Serial.println ("Initialisation");
attachInterrupt(0, interruption , RISING);
}
void loop() {
Serial.println ("Boucle") ;
while (1) //Boucle 1
{
}
}
void interruption ()
{
asm volatile (" jmp 0");
}
Ce que je voudrais c'est que lorsque l'interruption se déclenche, le programme sorte de la boucle 1 pour atteindre le début de la boucle loop() sans refaire le setup() . C'est à dire si j'ouvre mon shell voir une seule fois "initialisation" même si j'active plusieurs fois une interruption.
J'ai essayé plusieurs méthodes comme faire un break, un goto mais le seul qui "fonctionne" c'est de reset la carte (le problème c'est que ça retourne dans la boucle setup () ) .
Donc ma question serait de savoir s'il est possible après une interruption d'atteindre le début de la boucle loop () .
Désolé d'avoir fait un peu long. Merci d'avance 
bonjour,
déjà le loop est comme son nom l'indique une boucle qui tourne en permanence.
donc tu ne repasse pas par le setup sauf reboot de la carte ou lancement de l'ide console.
je ne vois pas trop l'utilité de ton while
Oui je comprend mais ce que je cherche à faire c'est quitter une boucle dès lors que mon capteur est "activé". Après je ne sais pas quand mon capteur va être activé mais dès qu'il est je voudrais revenir au début du loop() .
alors, le loop tourne en permanence, il va falloir se mettre ca dans la tête 
tu mets while(1); ok, mais en référence à quoi? rien
fonction boolean
bool rester = true;
setup
....
..
loop
while(rester){
affiche un truc
}
afficher je suis sorti avec interruption
fin loop
interruption
rester = false
Peut être que mon modèle était pas le plus judicieux.
En fait mon while (1) c'est ma boucle durant laquelle j'active les LEDs pour afficher mon mot. Du coup pendant que j'affiche mon mot c'est un peu comme si elle était infini parce que pour en sortir il faut avoir affiché le mot en entier. Donc si mon capteur détecte un tour pendant l'affichage du mot, ça signifie que mon dispositif tourne plus vite que la vitesse d'affichage de mon mot. Donc je devrais quitter le processus d'affichage du mot (changer la valeur du clignotement) et recommencer à l'écrire.
C'est le fait de sortir de la boucle d'affichage et de retourner au début de mon loop() que je cherche à faire.
Je suis vraiment désolé si je m'explique mal 
bonjour,
je pense qu'il faut tout simplement insérer une porte logique "et"
si on à (1) "et pas" (!&&) le capteur lumineux, la boucle while tourne
si on à (1) et (&&) le capteur lumineux, on sort de la boucle while
ce qui pourrais se traduire ainsi dans ton code :
void setup() {
Serial.begin (9600) ;
Serial.println ("Initialisation");
attachInterrupt(0, interruption , RISING);
}
void loop() {
Serial.println ("Boucle") ;
while ((1) && (!capteur lumineux)) //Boucle 1
{
}
}
void interruption ()
{
asm volatile (" jmp 0");
}
On3NexuS:
Donc si mon capteur détecte un tour pendant l'affichage du mot, ça signifie que mon dispositif tourne plus vite que la vitesse d'affichage de mon mot. Donc je devrais quitter le processus d'affichage du mot (changer la valeur du clignotement) et recommencer à l'écrire.
Pourquoi ne pas tout simplement changer la valeur du clignotement et continuer l'affichage.
Le changement de délai sera pris en compte au tour suivant. Cela va sans doute pomper pendant quelques tours et puis se stabiliser si la vitesse est relativement constante.
fdufnews:
Pourquoi ne pas tout simplement changer la valeur du clignotement et continuer l'affichage.
Le changement de délai sera pris en compte au tour suivant. Cela va sans doute pomper pendant quelques tours et puis se stabiliser si la vitesse est relativement constante.
C'est une super idée. Les premiers instants du changement de vitesse ne seront pas pris en compte mais plus le système tournera plus l'affichage sera précis.
Merci beaucoup !! je vais essayer de mettre cela en place 