Metro, shift register 74hc595, interuption , un beau casse tete!!!

bonjour,
je suis en train de chercher comment , associer tout ca:
Metro, shift register 74hc595 et interuption

Mon programme doit commander une animation lumineuse de 8 led, donc j'opte pour l'utilisation du registre shift qui permet de coder ça en séquence binaire bien pratique car visuelles,

Cette animation doit pouvoir être interrompue à tout moment par un appui sur un bouton , que j'ai donc câblé en pin2 pour bénéficier de l’interruption, qui, lui déclenche un relais qui commande une prise d'image , un servo moteur et une autre animation lumineuse.

la partie italique
ne me pause pas de problème, pour l'instant mais je n'ai pas encore intégrer le 74h595

cela dit,

si je m'en tiens a ce que je lis , ce CI a besoin des pin 2.3.4 or j'y ai un bouton (sur la 2) et qui doit être hyper réactif,

j'ai un peut de mal à piger l'utilisation de metro pour intercaler mes allumage/extinction de leds et la doc la dessus est un peut maigre,

je précise que l'utilisation de delay() est impossible en première partie pour ne pas rater l’appui sur le bouton mais que ca ne pause pas de problème après cet appui,

voici le code

#include <Servo.h> 

Servo myservo;  


const int buttonPin = 2;     // bouton  de la ciblesur pin 2
const int ledPin =  12; // led 12 sortie pour relais reed 
int ledPins[] = {14,15,16,17,18,19,8,10,11}; 
int buttonState = 0;
void setup() 
{ 
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  myservo.attach(9);  // servo sur pin 9
  myservo.write(40); //initialise le servo en position repos zero
  delay(20); // pour stabilisation
} 


void loop() 
{
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {  // bouton etat haut detecté  
    digitalWrite(ledPin, HIGH);  // led ON
    delay(1000); 
    myservo.write(178);       // va en butée inverse     
    delay(250);  // stabilisation 250 ms
    digitalWrite(ledPin, LOW);  // led OFF
    myservo.write(40); // retour en zero
    delay(20); // pour stabilisation 

/*
si la cible est atteinte, les led font un truc a la k2000
à etoffer plus tard
*/
int delayTime = 100;
for(int i = 8; i > 0; i--){
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime);  
     for(int i = 1; i <= 8; i++){  
    digitalWrite(ledPins[i], LOW);  
    delay(delayTime);                
  } 
  }for(int i = 0; i <= 8; i++){
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime);  
     for(int i = 8; i >= 0; i--){ 
       digitalWrite(ledPins[i], LOW);   delay(delayTime);   
  } 
  } }
  //reste a intégrer  des animation (type MaFonction1,MaFonction2...)avant l'impact
}

bonne journée et merci a ceux qui prendrais le temps de me lire et de me conseiller, parce que la je sèche un peu

moelleux:
ce CI a besoin des pin 2.3.4 or j'y ai un bouton (sur la 2)

Qu'est ce qui l'empêche de marcher sur 3 4 et 5 ?

heu c'est pour moi la question?

si oui , j'ai juste trouvé aucun exemple de code comme ca , alors comme je suis un novice qui fait des test avec des arduino qui fonctionnent, des fois , en piquant des bouts de codes a droite a gauche,mais qui n'ai aucune formation ni en elec ni en programmation ,(mais je jouais beaucoup aux lego )je me disait que peut être que ca marche que sur 2.3.4 comme les interruptions sur 2 et 3 par exemple, je me pose peut être trop de questions , un peu comme dans la vie? :roll_eyes:

mais si tu me dit que ca ne pose pas de problème, alors voila déjà une avancé pas mal,

là j'ai donc des del sur 3->19 mais si je passe en 74hc595 ça libéré de la place

oups je viens de me rendre compte que j'ai 9 lampe a gérer donc un 74hc595ne suffit plus argll!!!
donc je reste comme je suis mais je dois trouver comment temporiser mes animations avec autre chose que delay!!!!!

quelqu'un saurait m'orienter?
j'ai déjà essayé de comprendre mstimer2 et metro mais je ne vois pas comment on fait avec 9 led
merci

Regarde le code de la fonction shiftout et tu verras que c'est uniquement toi qui décide quelles pins utiliser.
Fonction shiftout contenue dans le fichier wiring_shift.c :

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}
;

Tu peux même utiliser les pins analogiques comme des pins numériques, le seul fait de faire pinMode( A0, OUTPUT) mettra A0 en mode digital. D'ailleurs si tu lit bien les explications sur le site Arduino tu verra que le pin A0 est aussi dénommer D14, A1-> D15 etc....

Pour ton besoin de commander 9 leds c'est simple un registre à décalage eh bien ça décale ! :grin:
Plus sérieusement les registres à décalage se chaînent : sortie du registre n sur l'entrée du registre (n+1)

Dans ton cas tu va devoir utiliser 2 registres à décalage.
Il faut relier entre elles toutes les broches "horloges" et toutes les broches "latch".
Pour les données tu relies la pin que tu as choisi pour les données sur l'entrée du premier registre et la sortie de ce premier registre sur l'entrée du deuxième .
Et ainsi de suite quelque soit le nombre de registre.
Bien sûr il te faudra envoyer autant de mot de 8 bits qu'il y a de registres.

Metro, c'est quoi !!!

Tu parles d'interruption mais tu ne les utilises pas.

excusez ma confusion, je ne suis pas trop rigoureux ,j' ai testé pleins de truc et je me melange, la j"en suis là,

#include <Servo.h> 
#include <Metro.h>
Metro ledMetro = Metro(1500);
Servo myservo;  
boolean etat = HIGH; 

const int buttonPin = 2;     // bouton sur pin 2
const int reedrelay =  12; // led 12 sortie pour reed 
int ledPins[] = {14,15,16,17,18,19,8,10,11}; 
int buttonState = 0;

void Mapattern()
{
  int delayTime = 200;
  for(int i = 8; i >= 0; i--){
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime);  }
     for(int i = 0; i <= 8; i++){  
    digitalWrite(ledPins[i], LOW);  
    delay(delayTime);                
  } 
  
 } 
  

void setup() 
{ 
  pinMode(reedrelay, OUTPUT);
  pinMode(buttonPin, INPUT);
  myservo.attach(9);  // servo sur pin 9
  myservo.write(40); //initialise le servo en position repos zero
  delay(20); // pour stabilisation
} 


void loop() 
{
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {  // bouton etat haut detecté  
  
    digitalWrite(reedrelay, HIGH);  // led ON
    delay(100); 
    myservo.write(178);       // va en butée inverse     
    delay(350);  // stabilisation 250 ms
    digitalWrite(reedrelay, LOW);  // led OFF
    myservo.write(40); // retour en zero
    delay(20); // pour stabilisation 
      Mapattern();
    }
else {
  if (ledMetro.check() == 1) { // check if the metro has passed it's interval .

  for (int i = 0; i <= 8; i++ ) {
    digitalWrite(ledPins[i], etat);
    
    etat=!etat;
     for(int i = 8; i >= 0; i--){
       
       digitalWrite(ledPins[i], etat);   
  
}}}}


  //verifier les histoires de chenillard
}

ca marche , mais c'est pas le top niveau création de paterne lumineuses

Tu utilises Metro mais en même temps tu programmes des événements récurrents avec des délais.
Je pense qu'il doit y avoir moyen de rendre ça beaucoup plus réactif en supprimant les délais et en exploitant plusieurs objets Metro.

je cherche a comprendre mieux métro, mais je ne suis pas un as de la programmation, en fait je suis un parfait néophyte, j'ai réussit a coder deux ou fois truc en recopiant des bouts de codes a droit a gauche l’année dernière sur des utilisations de waveshield,

mais je suis assez mauvais en anglais (mais les traduction google m'aident un peu, ) et je n'ai pas été longtemps à l’école ::blush:
alors je m'y attelle à tâtons et les didacticiels du site du zero sont en berne!!!

comme je le disais, les élément ou je me permet du delay surviennent à un moment ou le reste du système est immobilisé, cela dit , en vue d’améliorations futurs ....

mais j'ai du mal à piger le truc pour faire des chenillards en metro , je viens de tomber sur ca: Arduino Playground - Timer Library
ca a l'air bien aussi mais je m'y perd un peu...

si tu peut m'orienter sur l’utilisation de metro avec 9 led parce que je n'arrive qu'a les faire clignoter toutes ensembles,
merci