Bonsoir à tous,
Comme je disais dans un autre topic, je suis entrain de fabriquer un petit rafaleur pyrotechnique.
Le principe n'est pas très compliqué, il s'agit de faire un chenillard avec un temps réglable entre chaque allumage d'une LED. (cette tempo peut être fixe ou variable entre chaque allumage d'une led).
Donc pour faciliter les choses, j'adapterai mes propos en parlant de chenillard et donc de led, en réalité le µC pilotera des MOSFET etc.
La où ça se complique (pour moi en tout cas) c'est que je veux une impulsion de mise à feux (= temps d'allumage d'une led pour un chenillard) de 50ms (voir un peu plus, mais basons nous sur 50) mais je veux pouvoir allumer la led suivante avec une tempo de mini 10ms ce qui implique donc un "chevauchement" de deux sorties à l'état haut.
Je sèche donc un peu sur mon programme .... je ne veux pas une réponse toute cuite, mais je souhaiterai que vous me donniez quelques pistes pour avancer svp.
Voila sur quelle base je comptais partir:
- Un tableau qui stocke toutes les sorties (s1 à s10)
- Un autre qui stock le temps entre deux allumages, soit un tableau avec 9 valeurs.
et après utilisation d'une boucle pour parcourir les deux tableaux.
Voici un code fonctionnel, mais qui ne gère pas le chevauchement, autrement dit, je ne peux pas avoir une tempo de moins de 50ms entre deux départs...
int bp = 2; // Bouton poussoir pin 2
int s1 = 3; // Sortie 1, pin 3
int s2 = 4; // etc.
int s3 = 5;
int s4 = 6;
int s5 = 7;
int s6 = 8;
int s7 = 9;
int s8 = 10;
int s9 = 11;
int s10 = 12; // sortie 10, pin 12
int delay_seq; // temps d'allumage d'une led
boolean fin_seq; // fin de la séquence ? oui/non
int nbr_lign; // nombre de ligne = nombre de LED
int tab_s[10]; // tableau contenant les sorties
int tab_delay[10]; // tableau contenant les délais entre chaque allumage d'une led
int i;
void setup() {
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
pinMode(s3, OUTPUT);
pinMode(s4, OUTPUT);
pinMode(s5, OUTPUT);
pinMode(s6, OUTPUT);
pinMode(s7, OUTPUT);
pinMode(s8, OUTPUT);
pinMode(s9, OUTPUT);
pinMode(s10, OUTPUT);
pinMode(bp, INPUT);
fin_seq = 0; //Fin séquence ? -> non
delay_seq = 50; // Allumage d'une led pendant 50ms
nbr_lign = 7; // 3 led
tab_s[0] = s1; // 1ere sortie
tab_s[1] = s2; // 2eme sortie
tab_s[2] = s3; // etc ...
tab_s[3] = s4;
tab_s[4] = s5;
tab_s[5] = s6;
tab_s[6] = s7;
tab_s[7] = s8;
tab_s[8] = s9;
tab_s[9] = s10;
tab_delay[0] = 200; // Tempo entre led 1 et led 2 = 200ms
tab_delay[1] = 100; // Tempo entre led 2 et led 3 = 100ms
tab_delay[2] = 50; // ...
tab_delay[3] = 350;
tab_delay[4] = 500;
tab_delay[5] = 500;
tab_delay[6] = 600;
tab_delay[7] = 650;
tab_delay[8] = 50;
}
void loop() {
if ( (digitalRead(bp) == HIGH) and (fin_seq == 0)) // Si le bouton poussoir est actionné et que la sequence n'a pas encore été lancée.
{
for(i=0; i <= (nbr_lign - 1) ; i++)
{
digitalWrite(tab_s[i], HIGH); // -> tableau contenant les sorties
delay(delay_seq); // delay de 50ms
digitalWrite(tab_s[i], LOW); // extinction de la led
delay(tab_delay[i] - delay_seq); // prochain allumage -> lecture de la tempo désiré dans le tableau et soustraction des 50ms.
}
// fin_seq = 1; // Fin de la sequence, désactivation lancement d'une nouvelle sequence.
}
}
Voilà, donc auriez-vous svp quelques petits tuyaux à me donner pour m'aider dans l'avancement de mon codage ?
Merci par avance,
Bonne journée à tous.