Go Down

Topic: faire cignoter des leds r,v, et b à des vitesses différentes (Read 479 times) previous topic - next topic

wurst

Bonjour,

Je souhaite réaliser un stroboscope RVB ou la vitesse de chaque couleur serait réglable indépendamment des autres.
Est ce possible de faire tourner plusieurs scipts en parallèle utilisant la fonction "delay" avec un seul arduino ?
Avec une seule couleur j'utilise cette technique :
Code: [Select]
  digitalWrite(13, HIGH);
  delay(3);
  digitalWrite(13, LOW);
  delay(vitesse);

Par contre si j'ajoute d'autre leds, j'ai un problème au niveau des delay car ils vont s'enclencher les uns a la suite des autres et non tourner en parallèle comme je le souhaite.

Mon circuit est déjà réalisé sur la base des nombreux tutos sur les rubans de leds avec des transistors.

B@tto

Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

wurst

Merci B@tto pour ta réponse.

Je viens d'essayer ce code inspiré du lien que tu as posté :

Code: [Select]
unsigned long DepartR;
unsigned long DepartV;
unsigned long DepartB;
boolean Flag;

const int LedR =  5;
int MonDelaiR=1000;
const int LedV =  6;
int MonDelaiV=2000;
const int LedB =  7;
int MonDelaiB=4000;

void setup() {
    pinMode(LedR,OUTPUT);
    pinMode(LedV,OUTPUT);
    pinMode(LedB,OUTPUT);
 
    DepartR = millis(); // Enregistrement de mon point de départ
    DepartV = millis(); // Enregistrement de mon point de départ
    DepartB = millis(); // Enregistrement de mon point de départ
  }
 
 
void loop() {
 
 
    if((millis()-DepartR)>=MonDelaiR){     // si 1000 ms se sont écoulées
          Flag=!Flag;    // j'inverse l'état de mon booléen
          digitalWrite(LedR,Flag);   //  je change l'état de ma sortie
          DepartR=millis();  // nouvelle enregistrement du point de départ
         }
       
     if((millis()-DepartV)>=MonDelaiV){     // si 1000 ms se sont écoulées
          Flag=!Flag;    // j'inverse l'état de mon booléen
          digitalWrite(LedV,Flag);   //  je change l'état de ma sortie
          DepartV=millis();  // nouvelle enregistrement du point de départ
         }

     if((millis()-DepartB)>=MonDelaiB){     // si 1000 ms se sont écoulées
          Flag=!Flag;    // j'inverse l'état de mon booléen
          digitalWrite(LedB,Flag);   //  je change l'état de ma sortie
          DepartB=millis();  // nouvelle enregistrement du point de départ
         }
         
// code qui s'exécutera le temps que 1000 ms se soient écoulées
 
}


Celà semble fonctionner, je dis "semble" car j'ai du mal a visualiser les temps de clignotement de chaque leds. :)

Par contre, je souhaite que les leds ne restent allumée que pendant 3ms. Ors avec ce code je ne peux pas manipuler la durée "led LOW".

Je souhaite aussi contrôler en temps réelle la vitesse des leds stroboscopique, est ce possible avec cette base de code ?


B@tto

Déjà il faut un flag par couleur sinon une couleur va en influencer une autre.

Ensuite si tu veux optimiser un peu tout ça, et vu que le code est identique entre les 3 couleurs, je te conseille de passer par un tableau, ça sera plus lisible et plus pratique.

Ensuite j'avais pas percuté mais c'est pas fantastique comme méthode pour régler une couleur en RGB, du PWM serait plus adapté.

Sinon brut de fonderie la solution à ton problème est toute simple : plutôt que d'utiliser une ref de temps / couleur, il suffit d'en avoir une seule, au début des 3 ms du remet à zéro ta ref, tu allumes toutes les led. Dès que le temps d'une couleur est écoulé tu l'éteins. Et logiquement au bout de 3 ms si tu as bien bossé tous le monde est éteint. Il te suffit derrière de remettre à zéro une autre ref de temps qui déclenche celle des led.

Je suis surement pas clair ...

En code ça donne un truc qui ressemble à :

Code: [Select]
void loop() {


if(millis()>timeStrob+delayStrobe) { // départ d'un cycle de 3 ms

unsigned long timeRVB = millis();

digitalWrite(R,HIGH);
digitalWrite(G,HIGH);
digitalWrite(B,HIGH);

while(milis()<timeRVB+3000) {

if(timeRVB+delayR>millis()) {
digitalWrite(R,LOW);
}

if(timeRVB+delayG>millis()) {
digitalWrite(G,LOW);
}

if(timeRVB+delayB>millis()) {
digitalWrite(B,LOW);
}

}

timeStrobe=millis();

}

}


Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

wurst

Je vais t'avouer que je ne comprends pas grand chose à ton code. J'aurai dû préciser que je bidouille  avec arduino de temps en temps. Très souvent j'adapte simplement des codes.

Du coup là je suis pommé :)

Mais je vais médité sur ton code,

Merci !

Go Up