Go Down

Topic: Ruban Led par infrarouge (Read 1 time) previous topic - next topic

Tristan_Guillo

Bonjour,
je suis nouveau sur le forum et j'aurais besoin d'un petit coup de main.
je débute dans le code et l'arduino et mon premier projet est un ruban led RGB par infrarouge.
Je dispose de deux bout de code , le premier pour la télécommande infrarouge , et le deuxième mes premiers pas avec une led RGB et quelques séquences.
Mon souci est que, si je cumule mes deux programmes, j'ai l'impression que l'arduino est trop lent pour bien détecter les messages infrarouge.

Exemple :
Code: [Select]
#include <IRremote.h>

const int DIN_RECEPTEUR_INFRAROUGE = 2;

IRrecv monRecepteurInfraRouge (DIN_RECEPTEUR_INFRAROUGE);

decode_results messageRecu;

void setup()
{
 Serial.begin(9600);
 monRecepteurInfraRouge.enableIRIn();
 monRecepteurInfraRouge.blink13(true);
}

void loop()
{
  if (monRecepteurInfraRouge.decode(&messageRecu))
  {
    if (messageRecu.value == 0xFF6897)
    {Serial.println("Touche 0");}
{
  if (messageRecu.value == 0xFF30CF)
  {Serial.println("Touche 1");}
{
  if (messageRecu.value == 0xFF18E7)
  {Serial.println("Touche 2");}
{
  if (messageRecu.value == 0xFF7A85)
  {Serial.println("Touche 3");}
{
  if(messageRecu.value == 0xFF10EF)
  {Serial.println("Touche 4");}
{
  if(messageRecu.value == 0xFF38C7)
  {Serial.println("Touche 5");}
{
  if(messageRecu.value == 0xFF5AA5)
  {Serial.println("Touche 6");}
{
  if(messageRecu.value == 0xFF42BD)
  {Serial.println("touche 7");}
{
  if(messageRecu.value == 0xFF4AB5)
  {Serial.println("Touche 8");}
{
  if(messageRecu.value == 0xFF52AD)
  {Serial.println("Touche 9");}
{
  if(messageRecu.value == 0xFFA25D)
  {Serial.println("Touche on/off");}
{
  if(messageRecu.value == 0xFF629D)
  {Serial.println("Touche mode");}
{
  if(messageRecu.value == 0xFFE21D)
  {Serial.println("Touche mute");}
{
  if(messageRecu.value == 0xFF22DD)
  {Serial.println("Touche play/pause");}
{
  if(messageRecu.value == 0xFF02FD)
  {Serial.println("Touche gauche");}
{
  if(messageRecu.value == 0xFFC23D)
  {Serial.println("Touche droite");}
{
  if(messageRecu.value == 0xFFE01F)
  {Serial.println("Touche EQ");}
{
  if(messageRecu.value == 0xFFA857)
  {Serial.println("Touuche -");}
{
  if(messageRecu.value == 0xFF906F)
  {Serial.println("Touche +");}
{
  if(messageRecu.value == 0xFF9867)
  {Serial.println("Touche random");}
{
  if(messageRecu.value == 0xFFB04F)
  {Serial.println("Touche U/SD");}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}

    Serial.println(messageRecu.value,HEX);
    delay(500);
    monRecepteurInfraRouge.resume();
  }
  delay(1);
}


Ce programme seul marche bien, l'arduino affiche dans le serial monitor Touche 1 etc..
Ensuite, mon deuxième code :
Code: [Select]
const int Rouge = 9; // PWM
const int Vert = 10; // PWM
const int Bleu = 11; // PWM


void setup(){
  pinMode( Rouge, OUTPUT );
  pinMode( Vert, OUTPUT );
  pinMode( Bleu, OUTPUT );
 
  //La LED RGB utilise une anode commune (le + en commun.
  //Il faut donc manipuler la tension sur les broches négatives
  //de la LED.
  //
  //Pour résumer:
  //  On allume une LED en mettant la broche/pin à 0 volts
  //  On eteind une LED en mettant la broche/pin à 5 volts
 
  // Tout éteindre
  digitalWrite( Rouge, HIGH );
  digitalWrite( Vert, HIGH );
  digitalWrite( Bleu, HIGH );
}

void couleursFondue(){
 
  // allumer Rouge
  digitalWrite( Rouge, LOW );
  digitalWrite( Vert, HIGH );
  digitalWrite( Bleu, HIGH );
 
  // Ajouter progressivement du vert
  // Retirer progressivement du rouge
  //   Rappel: 255 = pas de couleur, 0 = max de couleur
  for( int iVert = 255; iVert>0; iVert-- ) {
    int iRouge = 255 - iVert;
    analogWrite( Rouge, iRouge );
    analogWrite( Vert, iVert );
    delay( 10 );
  }
  // Ajouter progressivement du bleu
  // Retirer progressivement du vert
  //   Rappel: 255 = pas de couleur, 0 = max de couleur
  for( int iBleu = 255; iBleu>0; iBleu-- ) {
    int iVert = 255 - iBleu;
    analogWrite( Vert, iVert );
    analogWrite( Bleu, iBleu );
    delay( 10 );
  }
  // Ajouter progressivement du rouge
  // Retirer progressivement du bleu
  //   Rappel: 255 = pas de couleur, 0 = max de couleur
  for( int iRouge = 255; iRouge>0; iRouge-- ) {
    int iBleu = 255 - iRouge;
    analogWrite( Bleu, iBleu );
    analogWrite( Rouge, iRouge );
    delay( 10 );
  }
}

void FcouleurBlanc(){
//Blanc
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(200); 
}

void FcouleurRouge(){
//Rouge
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, HIGH);
delay(200);
}

void FcouleurVert(){
//Vert
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, LOW);
delay(200);
}

void FcouleurBleu(){
//Bleu
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(200);
}

//---------------------

void FcouleurRose(){
//Rose
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, HIGH);
delay(200);
}

void FcouleurBleuCiel(){
//Bleu Ciel
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, LOW);
delay(200);
}

void FcouleurJaune(){
//Jaune
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(200);
}

void StrobColorFast(){

//Blanc
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(30);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(30);

//Rouge
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, HIGH);
delay(30);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(30);

//Vert
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, LOW);
delay(30);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(30);

//Bleu
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(30);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(30);


//---------------------

//Rose
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, HIGH);
delay(100);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(20);

//Bleu Ciel
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, LOW);
delay(100);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(20);

//Jaune
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(100);

//OFF
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(20);
}

void Strob(){
//Blanc
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(20);
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(20);
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(20);
}

void loop()

   
  //FcouleurBlanc();

  //------
  //StrobColor
  //>>

 
  //FcouleurRouge();
  //Strob();
  //FcouleurVert();
  //Strob();
  //FcouleurBleu();
  //Strob();
  //FcouleurRose();
  //Strob();
  //FcouleurBleuCiel();
  //Strob();
  //FcouleurJaune();
  //Strob();
 
  //--------
 
  couleursFondue();

  //-----------
 
  //Strob();
  //StrobColorFast();

}

(Seul "couleursFondue" est activé pour le moment)

Ce que j'aimerais faire du coup, c'est pouvoir cumuler ces deux codes dans un premier temps, et ensuite comment dois je faire pour que la télécommande commande mes séquences ?

Exemple : Touche mode active la séquence strob, on appuie une deuxième fois sur la touche mode et c'est la séquence fondues de couleurs.. Et ainsi de suite !
Pour finir, les couleurs unique sur les touches , de 0 a 6 (Blanc = 0, Rouge = 2 etc..)

Voilà j'espère être assez compréhensible et que l'on pourra m'aider à exploiter cette formidable petite carte ! :)

----
Led RGB sur les pin 9,10,11 & 3.5v
Led IR sur les pin GND, 2 & 5v

petrusfr

Bonjour,

Tu utilises la fonction DELAYquiestune fonction bloquante : l'exécution du programme s'arrête ...

Tu doid utiliser la fonction MILLIS pour gérer tes temporisations : voir dans les exemples de l'IDE : blink whitout delay.

Pour "combiner " tes 2 parties, tu peux utiliser la fonction  SWITCH    CASE  qui permet d'exécuter quelque chose en fonction de la valeur d'une variable (dans ton cas, la variable renvoyée par l'appui du bouton de la télécommande...

A+

Pierre

Tristan_Guillo

Bonsoir,
Merci pour ta réponse rapide Pierre!
Je me suis renseigner sur la fonction milles, j'ai essayé de modifié mon code pour comprendre cette fonction.

avant j'utilisais ce code pour un effet stroboscope :

Code: [Select]
void Strob(){
//Blanc
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(20);
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
delay(20);
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
delay(20);
}


J'ai bien une lumière blanche clignotante. Mais en modifiant mon code et en essayant d'utiliser la fonction millis, j'obtient une lumière blanche continue...

Code: [Select]
void Strob(){
//Blanc
if((millis() - temps) > 20);
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
temps = millis();

if((millis() - temps) > 20);
digitalWrite(Bleu, HIGH);
digitalWrite(Rouge, HIGH);
digitalWrite(Vert, HIGH);
temps = millis();

if((millis() - temps) > 20);
digitalWrite(Bleu, LOW);
digitalWrite(Rouge, LOW);
digitalWrite(Vert, LOW);
temps = millis();
}


J'ai déclaré "long temps;" au tout début de mon code.
Je pense que j'utilise mal la fonction, j'aimerais comprendre son fonctionnement!
Une fois que j'aurais compris et que je saurais l'appliquer, je me mettrais a la fonction "Switch Case"  :)
Bonne soirée

Tristan_Guillo

Re bonjour, je suis toujours en galère  :smiley-confuse:
J'ai crée un code en m'inspirant de divers source, le programme ce compile bien mais il y a un problème que je ne comprend pas.
Après le téléversement , ma led doit être éteinte puis dois s'allumer au signal de ma télécommande infrarouge ( bouton on/off ), mais ma led est déjà allumer !! La carte reçois bien le signal ( Je peux le voir grace à "irrecv.blink13(true);" , et le code hexadecimal est le bon, mais rien ne ce passe ! Ma led reste statique. Je ne comprend pas, quelqu'un aurais la gentillesse de m'aider ?  ;)
Bonne soirée !
Le code :
Code: [Select]
#include <IRremote.h>
int bright;
int before;
int out=9; //connect your LED to pin 9
int steps=5; //dimmer steps, vary those to increase/decrease the steps between full brightness and turned off
int RECV_PIN = 2; //data out of IR receiver connects to pin 2

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn(); // start the receiver
  irrecv.blink13(true);
  before=0; //LED is turned off
  bright=255; //brightness value is at maximum (255)
  pinMode(out,OUTPUT);
}

void loop()
{
  if(results.value == 0xFFA25D)
  {Serial.println("Touche on/off");}
{
  if (irrecv.decode(&results)) {

  if (results.value == 0xFFA25D){ //Code to turn the LED ON/OFF
    if(before == 0){ // if the LED was turned off, then we turn it on
      digitalWrite(out,HIGH);
      before=1; //LED is now turned on
    }
  }
    else{
      digitalWrite(out,LOW); //if the LED was turned on, then we turn it off
      before=0;
      bright=255;
    }}
  if (results.value == 0xFFA857 && before==1){ //Code to decrease the brightness
    if(bright-255/steps<0){
      analogWrite(out,bright);
    }
    else{
    bright=bright-255/steps;
    analogWrite(out,bright);
  }}
  if (results.value == 0xFF906F && before==1){ //Code to increase the brightness
    if(bright+255/steps>255){
      analogWrite(out,bright);
    }
    else{   
    bright=bright+255/steps;
    analogWrite(out,bright);
  }}
  Serial.println(results.value,HEX);
  irrecv.resume();
}}





On off : 0xFFA25D
+ : 0xFFA857
- : 0xFF906F

kamill

Bonjour,

To programme est un peu compliqué, je te propose quelque chose de plus simple:
Code: [Select]
#include <IRremote.h>
int bright;
bool allume=false;
const int out = 9; //connect your LED to pin 9
const int steps = 5; //dimmer steps, vary those to increase/decrease the steps between full brightness and turned off
const int RECV_PIN = 2; //data out of IR receiver connects to pin 2

const int delta=255/steps;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn(); // start the receiver
  irrecv.blink13(true);
  bright = 0; //brightness value is at maximum (255)
  pinMode(out, OUTPUT);
 
  Serial.begin(9600);
}

void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value)
    {
      case 0xFFA25D:    // on /off
        Serial.println("Touche on/off");
        if (bright>0)
        {
          // on est allume: on éteint
          bright=0;
        }
        else
        {
          // on est éteint: on allume au max
          bright=255;
        }
        break;
     
      case 0xFFA857:    // +
        bright+=delta;
        if (bright>255)
          bright=255;
        break;
     
      case 0xFF906F:    // -
        bright-=delta;
        if (bright<0)
          bright=0;
        break;
    }
   
    analogWrite(out,bright);
    irrecv.resume();
  }
}

Tristan_Guillo

Merci Kamill, ton code marche super ! J'aimerais corsé la chose en faisant fonctionner une LED RGB ( sur les sorties pmw toujours )
J'ai modifié le code de façon a intégrée celle ci, mais je n'ai pas le résultats que je veux et je ne comprend pas pourquoi..  :smiley-confuse:
La fonction On Off marche toujours, mais la touche "+" transforme la couleurs de blanc a bleu ciel alors qu'elle devrais réduire en luminosité, j'ai du mal a comprendre pourquoi  :(
Code: [Select]
#include <IRremote.h>
int brightR;
int brightV;
int brightB;
bool allume=false;
const int RED = 9;
const int VERT = 10;
const int BLEU = 11;
const int steps = 5; //dimmer steps, vary those to increase/decrease the steps between full brightness and turned off
const int RECV_PIN = 2; //data out of IR receiver connects to pin 2

const int delta=255/steps;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn(); // start the receiver
  irrecv.blink13(true);
  brightR = 0; //brightness value is at maximum (255)
  pinMode(RED, OUTPUT);
  pinMode(VERT, OUTPUT);
  pinMode(BLEU, OUTPUT);
 
  Serial.begin(9600);
}

void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value)
    {
      case 0xFFA25D:    // on /off
        Serial.println("Touche on/off");
        if (brightR>0)

        {
          // on est allume: on éteint
          brightR=0;
          brightV=0;
          brightB=0;
        }
        else
        {
          // on est éteint: on allume au max
          brightR=255;
          brightV=255;
          brightB=255;
        }
        break;
     
      case 0xFF906F:    // +
      Serial.println("Touche +");
          brightR+=delta;
        if (brightR>255)
          brightR=255;
          break;
          brightV+=delta;
        if (brightV>255)
          brightV=255;
          break;
          brightB+=delta;
        if (brightB>255)
          brightB=255;
        break;
       
     
      case 0xFFA857:    // -
      Serial.println("Touche -");
        brightR-=delta;
        if (brightR<0)
          brightR=0;
          break;
          brightV-=delta;
        if (brightV<0)
          brightV=0;
          break;
          brightB-=delta;
        if (brightB<0)
          brightB=0;
        break;
    }
   
    analogWrite(RED,brightR);
    analogWrite(VERT,brightV);
    analogWrite(BLEU,brightB);
    irrecv.resume();
  }
}

kamill

#6
Apr 21, 2016, 08:32 am Last Edit: Apr 21, 2016, 08:33 am by kamill
Bonjour,

Il ne doit y avoir qu'un seul break à la fin de chaque case (bizarre que le compilateur ne donne pas d'erreur).
Par exemple pour le +
Code: [Select]
     case 0xFF906F:    // +
     Serial.println("Touche +");
       brightR+=delta;
       if (brightR>255)
         brightR=255;

       brightV+=delta;
       if (brightV>255)
         brightV=255;

       brightB+=delta;
       if (brightB>255)
         brightB=255;
       break;

Tristan_Guillo

Merci encore, donc je vient d'essayer en suivant ton indication ( idem touche - ), maintenant le problème qui ce pose est le suivant, la ouche on/off fonctionne bien ( la commande s'affiche bien dans le serial monitor ) , mais si j'essaye de faire "-" , rien ne ce passe mais le programme fonctionne toujours , mais si je fait "+" sur la télécommande, le programme bloque, plus rien ne répond et le code "FFFFFFFF
" s'affiche dans le serial monitor peut importe le bouton appuyer  :o
Bref, encore un problème incompréhensible pour moi  :(
Code: [Select]
void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value)
    {
      case 0xFFA25D:    // on /off
        Serial.println("Touche on/off");
        if (brightR>0)

        {
          // on est allume: on éteint
          brightR=0;
          brightV=0;
          brightB=0;
        }
        else
        {
          // on est éteint: on allume au max
          brightR=255;
          brightV=255;
          brightB=255;
        }
        break;
     
           case 0xFF906F:    // +
     Serial.println("Touche +");
       brightR+=delta;
       if (brightR>255)
         brightR=255;

       brightV+=delta;
       if (brightV>255)
         brightV=255;

       brightB+=delta;
       if (brightB>255)
         brightB=255;
       break;
       
     
      case 0xFFA857:    // -
      Serial.println("Touche -");
        brightR-=delta;
        if (brightR<0)
          brightR=0;
         
          brightV-=delta;
        if (brightV<0)
          brightV=0;
         
          brightB-=delta;
        if (brightB<0)
          brightB=0;
        break;
    }
   
    analogWrite(RED,brightR);
    analogWrite(VERT,brightV);
    analogWrite(BLEU,brightB);
    irrecv.resume();
  }
}

kamill

Bonjour,

Je ne vois pas trop d'ou ça peut venir. Peut être une interaction entre les timers utilisés pour le pwm et les timer utilisés pour iremote.
Essaie de mettre le bleu sur la pin 6

Tristan_Guillo

Merci pour ta réactivité !
Je n'ai pas tout bien compris mais j'ai suivi ton conseil, et ca marche très bien sur la pin 6 !   :smiley-mr-green:
Comment pourrais je faire pour assigner une couleur a une touche ?
J'ai essayé
Code: [Select]
case 0xFF30CF:    // 1
      Serial.println("Touche 1");
     digitalWrite(BLEU, HIGH);
     digitalWrite(RED, LOW);
     digitalWrite(VERT, HIGH);
     delay(500); 

a la suite du programme, mais j'ai du mal a comprendre, enfin a utilisé la fonction "if".
Car avec ce que j'ai fait, la couleur RED s'affiche pendant "delay(500)", puis le programme revient a son point de départ.
Ce que j'aimerais faire, c'est pouvoir choisir la couleur ( Touche 0 = Blanc, Touche 1 = Rouge...) tout en gardant le control de la luminosité avec "+" et "-" !  :o
Pour finir, j'aimerais pouvoir appuyé sur le bouton "mode" (FF629D) et que cela me déclenche des fonctions. Par exemple, j'appuie sur "1", la lumière devient rouge, j'appuie sur "mode" , et un effet stroboscope rouge s'execute , puis si j'appuie sur "0" , le stroboscope devient blanc ansi de suite !

J'espère être assez clair dans mes explications :smiley-confuse:
Je suis assez perdu au niveau du code, je décortique peut a peut du code pour apprendre..
Je suis sur que mon projet est réalisable assez simplement, mais ca me paraît être une montagne  :smiley-fat:

kamill

#10
Apr 21, 2016, 02:12 pm Last Edit: Apr 21, 2016, 02:12 pm by kamill
Pour allumer une seule couleur tu fais la même chose que pour l'allumage général, mais uniquement sur la couleur
Code: [Select]
   case 0xFF30CF:    // 1
       Serial.println("Touche 1");
      brightR=255;
      brightV=0;
      brightB=0;
       break;


Pour faire varier une seule couleur, il faut mémoriser la couleur à faire varier et modifier uniquement cette couleur dans +  et -

Tristan_Guillo

Je te remercie encore de prendre de ton temps pour m'aider Kamill !
Je pense qu'il y a un souci quelque part mais je ne sais pas ou ! Je m'explique , j'ai donc fait ceci :
Code: [Select]
case 0xFF6897:    // 0
       Serial.println("Touche 0");
       brightR=0;
        brightV=0;
        brightB=0;
       break;
       
    case 0xFF30CF:    // 1
       Serial.println("Touche 1");
       brightR=255;
        brightV=0;
        brightB=0;
       break;

Dans la logique, ma touche "0" est du blanc, ma touche "1" du rouge. Sauf que la, ma touche "0" éteint la led, et ma touche "1" allume du bleu ciel..  :smiley-confuse:
Comme si 255 était le minimum et 0 le maximum  :o
Exemple si je fait ceci :
Code: [Select]
case 0xFF6897:    // 0
       Serial.println("Touche 0");
       brightR=255;
        brightV=0;
        brightB=255;
       break;

 J'obtient du vert, alors que je devrais avoir du violet.
Si j'utilise le code pour faire du vert ( 255 vert, 0 Rouge , 0 Bleu )
Code: [Select]
case 0xFF6897:    // 0
       Serial.println("Touche 0");
       brightR=0;
        brightV=255;
        brightB=0;
       break;

Bah j'obtient du violet ( Sois normalement 255 Rouge, 0 Vert , 255 Bleu)
Je suis donc sur que le 0 et le 255 sont inverser, pourquoi ?  :smiley-cry:

kamill

Parce que tu as certainement une led RGB à anode commune, ce qui fait qu'elle est allumée quand on pilote à l'état bas.
Il suffit d'inverser au niveau de la commande à la fin de loop()

Code: [Select]
   analogWrite(RED,255-brightR);
   analogWrite(VERT,255-brightV);
   analogWrite(BLEU,255-brightB);

Tristan_Guillo

#13
Apr 21, 2016, 07:05 pm Last Edit: Apr 21, 2016, 07:23 pm by Tristan_Guillo
Génial ca marche , j'ai bien mes couleurs de 0 à 6, et je peux réduire l'intensité de chacune ! J'ai juste une petite remarque, quand réduis l'intensité avec la touche "-" jusqu'a 0 sois éteindre la led, si on la remonte avec la touche "+", la couleur n'est pas sauvegardée et revient a blanc, mais ce n'est qu'un detail pas si important que ca!
mon projet avance je suis content ! :D
J'ai un problème, j'ai réussi a attitré a ma touche "Aléatoire" une fonction "couleursFondue". Le problème étant que la fondu fait qu'une boucle ( de rouge>orange>jaune>vert>bleu>rose>rouge ) puis revient a son état initial ! Comment faire une boucle infini ?  
Mon code :
Code: [Select]
#include <IRremote.h>
int brightR;
int brightV;
int brightB;
bool allume=false;
const int RED = 9;
const int VERT = 10;
const int BLEU = 6;
const int steps = 5; //dimmer steps, vary those to increase/decrease the steps between full brightness and turned off
const int RECV_PIN = 2; //data out of IR receiver connects to pin 2

const int delta=255/steps;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  irrecv.enableIRIn(); // start the receiver
  irrecv.blink13(true);
  brightR = 0; //brightness value is at maximum (255)
  brightV = 0;
  brightB = 0;
  pinMode(RED, OUTPUT);
  pinMode(VERT, OUTPUT);
  pinMode(BLEU, OUTPUT);
  Serial.begin(9600);
  
}
void couleursFondue(){
      // allumer Rouge
  digitalWrite( RED, LOW );
  digitalWrite( VERT, HIGH );
  digitalWrite( BLEU, HIGH );
  
  // Ajouter progressivement du vert
  // Retirer progressivement du rouge
  for( int iVert = 255; iVert>0; iVert-- ) {
    int iRouge = 255 - iVert;
    analogWrite( RED, iRouge );
    analogWrite( VERT, iVert );
    delay( 10 );
  }
  // Ajouter progressivement du bleu
  // Retirer progressivement du vert
  for( int iBleu = 255; iBleu>0; iBleu-- ) {
    int iVert = 255 - iBleu;
    analogWrite( VERT, iVert );
    analogWrite( BLEU, iBleu );
    delay( 10 );
  }
  // Ajouter progressivement du rouge
  // Retirer progressivement du bleu
  for( int iRouge = 255; iRouge>0; iRouge-- ) {
    int iBleu = 255 - iRouge;
    analogWrite( BLEU, iBleu );
    analogWrite( RED, iRouge );
    delay( 10 );
  }
}

void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value)
    {
      case 0xFFA25D:    // on /off
        Serial.println("Touche on/off");
        if (brightR>0)

        {
          // on est allume: on éteint
          brightR=0;
          brightV=0;
          brightB=0;
        }
        else
        {
          // on est éteint: on allume au max
          brightR=255;
          brightV=255;
          brightB=255;
        }
        break;
      
           case 0xFF906F:    // +
     Serial.println("Touche +");
       brightR+=delta;
       if (brightR>255)
         brightR=255;

       brightV+=delta;
       if (brightV>255)
         brightV=255;

       brightB+=delta;
       if (brightB>255)
         brightB=255;
       break;
        
      
      case 0xFFA857:    // -
      Serial.println("Touche -");
        brightR-=delta;
        if (brightR<0)
          brightR=0;
          
          brightV-=delta;
        if (brightV<0)
          brightV=0;
        
          brightB-=delta;
        if (brightB<0)
          brightB=0;
        break;
        
   case 0xFF6897:    // 0
       Serial.println("Touche 0");
       brightR=255;
        brightV=255;
        brightB=255;
       break;
      
    case 0xFF30CF:    // 1
       Serial.println("Touche 1");
       brightR=255;
        brightV=0;
        brightB=0;
       break;
    
    case 0xFF18E7:    // 2
       Serial.println("Touche 2");
       brightR=0;
        brightV=255;
        brightB=0;
       break;

    case 0xFF7A85:    // 3
       Serial.println("Touche 3");
       brightR=0;
        brightV=0;
        brightB=255;
       break;

    case 0xFF10EF:    // 4
       Serial.println("Touche 4");
       brightR=255;
        brightV=0;
        brightB=255;
       break;
      
    case 0xFF38C7:    // 5
       Serial.println("Touche 5");
       brightR=0;
        brightV=255;
        brightB=255;
       break;

    case 0xFF5AA5:    // 6
       Serial.println("Touche 6");
       brightR=255;
        brightV=255;
        brightB=0;
       break;

    case 0xFF9867:    //Random
    Serial.println("Touche Random");
    couleursFondue();
    
    }
    
    analogWrite(RED,255-brightR);
   analogWrite(VERT,255-brightV);
   analogWrite(BLEU,255-brightB);
    irrecv.resume();
  }
}

kamill

#14
Apr 22, 2016, 09:06 am Last Edit: Apr 22, 2016, 09:08 am by kamill
Il faut que tu utilises un flag pour indiquer que tu es en mode "fondu"
Dans l'exemple ci dessous je l'ai appelé flagFondu. Il est mis à true par l'appui sur la touche fondu et remis à false par la touche arret
Ensuite suivant l'état du flag tu exécutes ou pas couleursFondue()
Code: [Select]
void loop()
{
  static bool flagFondu = false;

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    switch (results.value)
    {
      case 0xFFA25D:    // on /off
        Serial.println("Touche on/off");
        flagFondu = false;
        if (brightR > 0)

        {
          // on est allume: on éteint
          brightR = 0;
          brightV = 0;
          brightB = 0;
        }
        else
        {
          // on est éteint: on allume au max
          brightR = 255;
          brightV = 255;
          brightB = 255;
        }
        break;

      case 0xFF906F:    // +
        Serial.println("Touche +");
        brightR += delta;
        if (brightR > 255)
          brightR = 255;

        brightV += delta;
        if (brightV > 255)
          brightV = 255;

        brightB += delta;
        if (brightB > 255)
          brightB = 255;
        break;


      case 0xFFA857:    // -
        Serial.println("Touche -");
        brightR -= delta;
        if (brightR < 0)
          brightR = 0;

        brightV -= delta;
        if (brightV < 0)
          brightV = 0;

        brightB -= delta;
        if (brightB < 0)
          brightB = 0;
        break;

      case 0xFF6897:    // 0
        Serial.println("Touche 0");
        brightR = 255;
        brightV = 255;
        brightB = 255;
        break;

      case 0xFF30CF:    // 1
        Serial.println("Touche 1");
        brightR = 255;
        brightV = 0;
        brightB = 0;
        break;

      case 0xFF18E7:    // 2
        Serial.println("Touche 2");
        brightR = 0;
        brightV = 255;
        brightB = 0;
        break;

      case 0xFF7A85:    // 3
        Serial.println("Touche 3");
        brightR = 0;
        brightV = 0;
        brightB = 255;
        break;

      case 0xFF10EF:    // 4
        Serial.println("Touche 4");
        brightR = 255;
        brightV = 0;
        brightB = 255;
        break;

      case 0xFF38C7:    // 5
        Serial.println("Touche 5");
        brightR = 0;
        brightV = 255;
        brightB = 255;
        break;

      case 0xFF5AA5:    // 6
        Serial.println("Touche 6");
        brightR = 255;
        brightV = 255;
        brightB = 0;
        break;

      case 0xFF9867:    //Random
        Serial.println("Touche Random");
        flagFondu = true;
        break;

    }
    irrecv.resume();
  }
  if (flagFondu)
  {
    couleursFondue();
  }
  else
  {
    analogWrite(RED, 255 - brightR);
    analogWrite(VERT, 255 - brightV);
    analogWrite(BLEU, 255 - brightB);
  }
}

Go Up