Créer une interruption avec un capteur analogique

Bonjour,

Je travaille en ce moment sur un Led Cube RGB et j'y ai ajouté un capteur de proximité. J'ai différentes animations dans qui s'active aléatoirement dans un switch(random()) et j'aimerai que selon la position de la main devant celui ci, la couleur change dans le cube..

Cependant, je n'arrive pas à coder ça. J'ai éssayé de relever l'analogRead dans un Timer afin de changer une variable "couleur", mais rien a faire. Pas trouvé non plus si l'on pouvais faire des interruptions avec une entrée analogique.

Quelqu'un a-t'il une idée de comment je pourrai faire ça?

Merci d'avance

Pas trouvé non plus si l'on pouvais faire des interruptions avec une entrée analogique

Je vais te faire une réponse toute théorique car j'essaye également d'avoir une interruption sur 4 broches analogiques et ça ne viens pas comme je voudrais : c'est normalement possible ,........,quand on a compris comment faire.

l'ATMega de l'UNO c'est à dire le 328p a 5 vecteurs d'interruption sur les broches entrés/sorties : Deux vecteurs liés à une seule broche : Int0 à la broche 2 et int1 à la broche 3.

3 vecteurs PCINTx: un par port. il faut savoir que les broches sont regroupées par PORT, dans le 328p il existe 3 ports : B, C, D. Chaque port possède un vecteur d'interruption, PCINTO pour le port B, PCINT1 pour le port C et PCINT2 pour le port D. Les broches analogiques appartiennent au port C (A0 = PC0,........,A5 = PC5).

En résumé (théorie toujours) il faut : Autoriser le port C à générer une interruption. Déterminer quelles broches du port C peuvent déclencher une interruption, Quand l'interruption se produit il faut déterminer quelle est la broche à l'origine de l'interruption et traiter l'interruption.

Je n'ai pas vu comment la fonction attachinterrupt() pouvait gérer les interruptions PCINT0 à PCINT2, c'est peut être possible mais je n'ai pas vu. Il reste alors de gérer directement les registres mais je coince pas mal.

Merci aux "gourous" de nous renseigner.

J’ai déjà réussi à créer des interruptions sur d’autres PIN digital que INT0 et INT1 avec ce genre de code http://wyolum.com/docs/IR2.pde

Donc théoriquement ça doit être possible… mais en numérique on a que 0 et 1 donc on utilise des “Rising”, “Falling”, … Mais pour récupérer les valeurs analogiques et les interpréter, ça c est encore autre chose!

Je vais regarder ton code de près :grin:
Par contre pour ton besoin il me semble avoir compris dans la spec Atmel que les vecteurs PCINTx ne gèrent que le changement de niveau logique (1 vers 0 ou 0 vers 1).

Sinon j'ai éssayé la méthode de faire un analogRead(A0) dans le Timer1 à l'air de (légerement) fonctionner. Mais lorsque je renvoie des données sur le Serial j'ai le mac qui à tendance à complètement planter... il m'affiche une fenetre qui dit de redémarrer l'ordi en appuyant sur le boutton power, c est bien la première fois que je le vois crasher aussi fortement ^^

ça y est, j’ai réglé le souci!!

J’ai fais un Timer1 toute les 0,5s qui donne ça :

void timer1_callback()
{
int data = analogRead(A0);
if(240 <= data && data <= 300){
Couleur = 0;
}
else if(301 <=data && data <= 350){
Couleur = 1;
}
else if(351 <=data && data <= 400){
Couleur = 2;
}
else if(401 <=data && data <= 450){
Couleur = 3;
}
else if(451 <=data && data <= 500){
Couleur = 4;
}
else if(501 <=data){
Couleur = 5;
}
}

Et voila mon ledCube RGB avec l’allumage et les couleurs gérés par la position de la main (bon ya encore du calibrage à faire ^^)