Aller au contenu


Photo
- - - - -

led rgb est arduino


  • Veuillez vous connecter pour répondre
5 réponses à ce sujet

#1 flo_geek

flo_geek

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 14 novembre 2012 - 11:43

Salu à tous voilà pour passer le temps j'ai voulue faire joujou avec des led rgb et un arduino j'ai réussi à avoir les couleur RGB(fonction led du code) à les faire allumer progressivement puis éteindre progressivement (fonction fade du code) mais maintenant je voudrai passé d'une couleur à une autre progressivement est c'est la que j'ai un problème.
Exemple:

je veux passé du rouge au bleu puis du bleu au vert, le passé du rouge au bleu super de bleu au vert super mais après quand la fonction loop ce répète il passe du vert au bleu est pas du rouge au bleu. Le problème bien je pense d'un changement de variable (à l'aide de printf j'ai vue que à la répétition de la loop les valeur ne change pas).
je vois laissé le code en pièce jointe.

merci d'avance de votre aide :)

Fichier(s) joint(s)

  • Fichier joint  led_RGB.zip   976 octets   92 téléchargement(s)


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 15 novembre 2012 - 01:54

#define RED 9

#define GREEN 10
#define BLEU 11
#define TAB 3


int rouge[TAB] = {0, 255, 255};

int blue[TAB] = {255, 255, 0};

int vert[TAB] = {255, 0, 255};


int iblc = 0;
int cRecu = 0;

int inum = 100;

int icouleur1p[3];


/*int ired = 0;
int igreen = 0;
int ibleu = 0;*/

/*void led(int ired,int igreen,int ibleu)
{
  analogWrite(RED, ired);
  analogWrite(GREEN, igreen);
  analogWrite(BLEU, ibleu);
}*/

void led (int iTab[3])
{
  analogWrite(RED, iTab[0]);
  analogWrite(GREEN, iTab[1]);
  analogWrite(BLEU, iTab[2]);
}

void fade (int icouleur1[3])
{
  
  analogWrite(RED, 255);
  analogWrite(GREEN, 255);
  analogWrite(BLEU, 255);
  
  icouleur1p = {255,255,255};
  
  do
  {
    if(icouleur1p[0] > icouleur1[0])
    {
      icouleur1p[0] = icouleur1p[0] - 1;
    }
    if(icouleur1p[1] > icouleur1[1])
    {
      icouleur1p[1] = icouleur1p[1] - 1;
    }
    if(icouleur1p[2] > icouleur1[2])
    {
      icouleur1p[2] = icouleur1p[2] - 1;
    }
    
    analogWrite(RED, icouleur1p[0]);
    Serial.println(icouleur1p[0]);
    analogWrite(GREEN, icouleur1p[1]);
    Serial.println(icouleur1p[1]);
    analogWrite(BLEU, icouleur1p[2]);
    Serial.println(icouleur1p[2]);
    
    delay(10);
    
  }while((icouleur1p[0]> icouleur1[0]) || (icouleur1p[1] > icouleur1[1]) || (icouleur1p[2] > icouleur1[2]));
  
  Serial.print("fin high");
  
  do
  {
    if(icouleur1p[0] < 255)
    {
      icouleur1p[0] = icouleur1p[0] + 1;
    }
    if(icouleur1p[1] < 255)
    {
      icouleur1p[1] = icouleur1p[1] + 1;
    }
    if(icouleur1p[2] < 255)
    {
      icouleur1p[2] = icouleur1p[2] + 1;
    }
    
    analogWrite(RED, icouleur1p[0]);
    Serial.println(icouleur1p[0]);
    analogWrite(GREEN, icouleur1p[1]);
    Serial.println(icouleur1p[1]);
    analogWrite(BLEU, icouleur1p[2]);
    Serial.println(icouleur1p[2]);
    delay(10);
   }while((icouleur1p[0] < 255) || (icouleur1p[1] < 255) || (icouleur1p[2] < 255));
  
  Serial.print("fin fade\n");
}

void passage(int iav[3], int iap[3])
{
  Serial.println(iav[0]);
  Serial.println(iav[1]);
  Serial.println(iav[2]);
  Serial.print("\n");
  Serial.println(iap[0]);
  Serial.println(iap[1]);
  Serial.println(iap[2]);
  
  led(iav);
  
  do
  {
    if(iav[0] > iap[0])
    {
      iav[0]--;
    }
    if(iav[0] < iap[0])
    {
     iav[0]++; 
    }
    
  Serial.println(iav[0]);
  Serial.println(iav[1]);
  Serial.println(iav[2]);
  Serial.print("\n");
  Serial.println(iap[0]);
  Serial.println(iap[1]);
  Serial.println(iap[2]);
  
  delay(10);
  led(iav);
  }while(iav[0] != iap[0]);
  Serial.print("fin\n");
  
}

void setup()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLEU, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  passage(rouge, blue);
  delay(100);
  passage(rouge, vert);
}

Bon pour ceux qui comme moi auront eu du mal à ouvrir ton fichier je le poste ici : ( c'est le contenu du fichier en pièce jointe du message précédent )

Tout d'abord je ne dirais qu'un truc : quand on fait un programme et encore plus quand on le partage comme ici, il faut toujours mettre des commentaires ! Moi perso j'en met presque un à chaque ligne. Des fois juste se forcer à mettre des commentaires te permet de voir où est l'erreur. Moi j'applique le principe que : si quand j'ouvre le .c d'un programme, je n'arrive pas à le comprendre dans ces grandes lignes en lisant uniquement les commentaires, le programmes est bon à jeter à la poubelle ( surtout si il ne marche pas ) (ou sinon on demande gentillement à celui qui l'a fait de mettre les commentaires ^^ )
Quand j'aurais un peu plus de temps je vais regarder ton prog de plus près.

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 flo_geek

flo_geek

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 15 novembre 2012 - 07:12

Ok d'ac je vais le commenter et le renvoyer

#4 flo_geek

flo_geek

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 16 novembre 2012 - 10:40

Voilà le code commenté

mike118 tu a tout à fait raison, cela est mieux pour la personne qui relie le code mais je n'ai toujours pas ce reflex

Fichier(s) joint(s)

  • Fichier joint  led_rgb.txt   3,23 Ko   113 téléchargement(s)


#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 969 messages
  • Gender:Male
  • Location:Anglet

Posté 17 novembre 2012 - 01:12

#define RED 9 //patte rouge
#define GREEN 10 // patte verte
#define BLEU 11 //patte bleu
#define TAB 3 //taille des tableau

int rouge[TAB] = {0, 255, 255};  //couleur rouge
int blue[TAB] = {255, 255, 0};    //couleur bleu
int vert[TAB] = {255, 0, 255};    //couleur verte
int noir[TAB] = { 255,255,255};

int iblc = 0;    //variable pour les boucle for
int cRecu = 0;    //
int icouleur1p[3];  // valeur analogique des led pour la monté en intensiter

void led (int iTab[3]) // fonction led qui allume la led avec la couleur decrite par RGB
{
  analogWrite(RED, iTab[0]); //led rouge
  analogWrite(GREEN, iTab[1]);//led verte
  analogWrite(BLEU, iTab[2]);//led bleu
}

void fade (int icouleur1[3]) // monté puis descente en intansiter
{
  
  led(noir); //led off
  
  icouleur1p = {255,255,255};  //valeur de depart de la led soit noir
  
  do // faire
  {
    if(icouleur1p[0] > icouleur1[0]) //si couleur led rouge > a couleur led rouge voulue
    {
      icouleur1p[0] = icouleur1p[0] - 1; // alors faire moins 1 a la led rouge
    }
    if(icouleur1p[1] > icouleur1[1]) //si couleur verte > a couleur led verte voulue 
    {
      icouleur1p[1] = icouleur1p[1] - 1; //alors faire moins 1 a la led verte
    }
    if(icouleur1p[2] > icouleur1[2]) //si couleur bleu > a couleur bleu voulue
    {
      icouleur1p[2] = icouleur1p[2] - 1; //alors faire moins 1 a les bleu;
    }
    
    led(icouleur1p); // changement de couleur de la led
    
    delay(10); //delay de 10 pour la vitesse de transition
    
  }while((icouleur1p[0]> icouleur1[0]) || (icouleur1p[1] > icouleur1[1]) || (icouleur1p[2] > icouleur1[2]));//tant que la couleur rouge verte est bleu n'est pas celle voulue
  
  /*identique que avant mais la led diminue en intensiter*/
  do
  {
    if(icouleur1p[0] < 255)
    {
      icouleur1p[0] = icouleur1p[0] + 1;
    }
    if(icouleur1p[1] < 255)
    {
      icouleur1p[1] = icouleur1p[1] + 1;
    }
    if(icouleur1p[2] < 255)
    {
      icouleur1p[2] = icouleur1p[2] + 1;
    }
    
    led(icouleur1p);
    delay(10);
   }while((icouleur1p[0] < 255) || (icouleur1p[1] < 255) || (icouleur1p[2] < 255));
  
}

void passage(int iav[3], int iap[3]) //transition d'une couleur a une autre
{
  
  led(iav);//afficher la couleur de depart
  
  do //faire
  {
    if(iav[0] > iap[0]) //si val rouge de la led > val rouge de la led voulue 
    {
      iav[0]--; // faire -1 a la valeur de la led rouge
    }
    else if(iav[0] < iap[0]) // sinon si val de la led rouge < val de la led voulue 
    {
     iav[0]++; //faire +1 a la valeur de la led rouge
    }
    
    if(iav[1] > iap[1]) //meme chose pour le vert
    {
      iav[1]--;
    }
    else if(iav[1] < iap[1])
    {
     iav[1]++; 
    }
    
    if(iav[2] > iap[2]) //meme chose pour le bleu
    {
      iav[2]--;
    }
    else if(iav[2] < iap[2])
    {
     iav[2]++; 
    }
  
  delay(10);
  led(iav); // afficheur la valeur de la led modifier 
  }while(iav[0] != iap[0]  || iav[1] != iap[1] || iav[2] != iap[2]);//tant que les couleur RGB sont diffrente des couleur voulue
  
}

void setup()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLEU, OUTPUT);
}

void loop()
{
  passage(rouge, blue); //passage du rouge au bleu
  delay(100); // temps d'attente 
  passage(rouge, vert); //passage du rouge au vert
}

Du premier coup d'oeil je ne vois pas où est le problème dans ton code...

Je te propose donc de faire les essais suivant et de rapporter ce que cela affiche :

Remplace ton void loop par :

void loop()
{
  passage(rouge, vert); //passage du rouge au bleu
  delay(100); // temps d'attente 
  passage(rouge, blue); //passage du rouge au vert
}

puis essais
void loop()
{
  passage(rouge, blue); //passage du rouge au bleu
  delay(100); // temps d'attente 
  passage(rouge, vert); //passage du rouge au vert
  delay(100); // temps d'attente 
  passage(rouge, blue); //passage du rouge au vert
  delay(100); // temps d'attente 
  passage(rouge, vert); //passage du rouge au vert

}
et essais

void loop()
{
passage(rouge, blue); //passage du rouge au vert
  delay(100); // temps d'attente 
  passage(rouge, vert); //passage du rouge au vert
delay(100);
}


Le but étant de voir si c'est cas 1 : les couleurs rouge -> vert à rouge->bleu
cas 2 le fait de retourner dans le loop
cas 3 le fais de ne pas faire de delay

qui empeche de voir le rouge.

En fonction de ce que tu verras je pourrais peut être t'aider d'avantage ...

à bientôt !

( PS : Très important de commenter du coup j'ai pu comprendre ton programme en moins de 5 min alors qu'il m'aurait fallut une bonne trentaine de minute sinon ... et je sais pas si j'aurais pu prendre le temps ... )

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#6 flo_geek

flo_geek

    Membre occasionnel

  • Membres
  • Pip
  • 89 messages
  • Gender:Male

Posté 08 décembre 2012 - 10:12

Salu
merci de ton aide mais j'ai reussi a trouver tous seul
voila dans la fonction passage j'ai 2 parametre d'entrés, et dans le code de la fontion je modifie un de ces parametre c'est pour cela que sa ne fonctionnait pas comme je le voulais.

voici le code fini :

#define RED 9 //patte rouge
#define GREEN 10 // patte verte
#define BLEU 11 //patte bleu
#define TAB 3 //taille des tableau

int rouge[TAB] = {0, 255, 255};  //couleur rouge
int blue[TAB] = {255, 255, 0};    //couleur bleu
int vert[TAB] = {255, 0, 255};    //couleur verte
int noir[TAB] = { 255,255,255};

int iblc = 0;    //variable pour les boucle for
int icouleur1p[3];  // valeur analogique des led pour la monté en intensiter
int ipass[3] = {0, 0, 0};

void led (int iTab[3]) // fonction led qui allume la led avec la couleur decrite par RGB
{
  analogWrite(RED, iTab[0]); //led rouge
  analogWrite(GREEN, iTab[1]);//led verte
  analogWrite(BLEU, iTab[2]);//led bleu
}

void fade (int icouleur1[3]) // monté puis descente en intensiter
{
  
  led(noir); //led off
  
  icouleur1p = {255,255,255};  //valeur de depart de la led soit noir
  
  do // faire
  {
    if(icouleur1p[0] > icouleur1[0]) //si couleur led rouge > a couleur led rouge voulue
    {
      icouleur1p[0] = icouleur1p[0] - 1; // alors faire moins 1 a la led rouge
    }
    if(icouleur1p[1] > icouleur1[1]) //si couleur verte > a couleur led verte voulue 
    {
      icouleur1p[1] = icouleur1p[1] - 1; //alors faire moins 1 a la led verte
    }
    if(icouleur1p[2] > icouleur1[2]) //si couleur bleu > a couleur bleu voulue
    {
      icouleur1p[2] = icouleur1p[2] - 1; //alors faire moins 1 a les bleu;
    }
    
    led(icouleur1p); // changement de couleur de la led
    
    delay(10); //delay de 10 pour la vitesse de transition
    
  }while((icouleur1p[0]> icouleur1[0]) || (icouleur1p[1] > icouleur1[1]) || (icouleur1p[2] > icouleur1[2]));//tant que la couleur rouge verte est bleu n'est pas celle voulue
  
  /*identique que avant mais la led diminue en intensiter*/
  do
  {
    if(icouleur1p[0] < 255)
    {
      icouleur1p[0] = icouleur1p[0] + 1;
    }
    if(icouleur1p[1] < 255)
    {
      icouleur1p[1] = icouleur1p[1] + 1;
    }
    if(icouleur1p[2] < 255)
    {
      icouleur1p[2] = icouleur1p[2] + 1;
    }
    
    led(icouleur1p);
    delay(10);
   }while((icouleur1p[0] < 255) || (icouleur1p[1] < 255) || (icouleur1p[2] < 255));
  
}

void pass(int iav[3], int iap[3]) //transition d'une couleur a une autre
{
  ipass[0] = iav[0];
  ipass[1] = iav[1];
  ipass[2] = iav[2];
  led(ipass);//afficher la couleur de depart
  
  do //faire
  {
    if(ipass[0] > iap[0]) //si val rouge de la led > val rouge de la led voulue 
    {
      ipass[0]--; // faire -1 a la valeur de la led rouge
    }
    else if(ipass[0] < iap[0]) // sinon si val de la led rouge < val de la led voulue 
    {
     ipass[0]++; //faire +1 a la valeur de la led rouge
    }
    
    if(ipass[1] > iap[1]) //meme chose pour le vert
    {
      ipass[1]--;
    }
    else if(ipass[1] < iap[1])
    {
     ipass[1]++; 
    }
    
    if(ipass[2] > iap[2]) //meme chose pour le bleu
    {
      ipass[2]--;
    }
    else if(ipass[2] < iap[2])
    {
     ipass[2]++; 
    }
  
  delay(10);
  led(ipass); // afficheur la valeur de la led modifier 
  }while(ipass[0] != iap[0]  || ipass[1] != iap[1] || ipass[2] != iap[2]);//tant que les couleur RGB sont diffrente des couleur voulue
  
}

void setup()
{
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLEU, OUTPUT);
}

void loop()
{
  pass(rouge, blue); //passage du rouge au bleu
}

maintenant je vais essayer de créer une libraire avec toute ces fonctions voila

si vous avez des question sur mon code hésiter pas :)/>/>

@++ est merci encrore de votre aide :D/>/>




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users