Problème défilement couleurs LED RGB

Bonjour à tous,
Je suis tout nouveau dans le monde d'Arduino depuis quelques jours.
Je commence à lire des tutos un peu de partout et utiliser le kit suivant et découvrir le C.
Aujourd'hui j'ai testé la LED RGB et j'ai essayé de faire un défilement de couleurs mais j'ai un petit souci entre le violet => Bleu et le vert => Jaune qui font comme des "saut" sans transition a la couleur suivante.
Mon code qui doit étre bien moche à vos yeux (je découvre aussi le C :smiley: ) n'a pas l'air mauvais de se que je vois sur le moniteur. Est ce possible que le problème vienne du matériel?
Ici une vidéo du problème

Merci pour vos éclairages :slight_smile: :stuck_out_tongue:

const byte PIN_LED_R = 8;
const byte PIN_LED_G = 9;
const byte PIN_LED_B = 10;

void setup() {
  // Initialise les broches
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);
  displayColor(0, 0, 0);

  Serial.begin(9600);
}


void loop() {
  int r = 255;// on attaque avec le rouge bien pur !
  int g = 0;
  int b = 0;
  int d = 10; // Délais de "transition"


while(r == 255) // On a du rouge, on ajoute un peu de bleu pour arriver au violet
{
  displayColor(r, g, b);
  b++;
   //Serial.print("Boucle 1 | ");
   //Serial.print("R=");
   //Serial.print(r);
   //Serial.print(" B=");
   //Serial.print(b);
   //Serial.print(" G=");
   //Serial.println(g);
  if(b==255){r=254;}
  delay(d);

}

while(r != 0) // La on a du violet on continu en supprimant le rouge pour arriver au bleu
{
  displayColor(r, g, b);
  r--;
  //Serial.print("Boucle 2 | ");
   //Serial.print("R=");
   //Serial.print(r);
   //Serial.print(" B=");
   //Serial.print(b);
   //Serial.print(" G=");
   //Serial.println(g);
  delay(d);
}

while(b ==255) // On a notre bleu on mets une lichette de vert pour avoir du turquoise
{
  r=0;
  displayColor(r, g, b);
  g++;
  //Serial.print("Boucle 3 | ");
   //Serial.print("R=");
   //Serial.print(r);
   //Serial.print(" B=");
   //Serial.print(b);
   //Serial.print(" G=");
   //Serial.println(g);
   if(g==255){b=254;}
  delay(d);
}

while(b != 0) // On a le turquoise on vire le bleu pour garder le vert
{
  displayColor(r, g, b);
  b--;
  //Serial.print("Boucle 4 | ");
   //Serial.print("R=");
   //Serial.print(r);
   //Serial.print(" B=");
   //Serial.print(b);
   //Serial.print(" G=");
   //Serial.println(g);  
  delay(d);
}

while(g == 255) // On a le vert on mets le rouge pour avoir du jaune
{
  displayColor(r, g, b);
  r++;
  //Serial.print("Boucle 5 | ");
   //Serial.print("R=");
   //Serial.print(r);
  //Serial.print(" B=");
   //Serial.print(b);
   //Serial.print(" G=");
   //Serial.println(g); 
   if(r==255){g=254;} 
  delay(d);
}

while(g > 0) // On vire le vert pour avoir le orange et repartir sur la 1ere boucle de rouge
{
  displayColor(r, g, b);
  g--;
  //Serial.print("Boucle 6 | ");
   //Serial.print("R=");
   //Serial.print(r);
   //Serial.print(" B=");
   //Serial.print(b);
   //Serial.print(" G=");
   //Serial.println(g); 
  delay(d);
}

}

/** Affiche une couleur */
void displayColor(byte r, byte g, byte b) {

  // Assigne l'état des broches
  // Version cathode commune
  analogWrite(PIN_LED_R, r);
  analogWrite(PIN_LED_G, g);
  analogWrite(PIN_LED_B, b);

}

Salut

Il me semble que la pin 8 ne sait pas faire de PWM.
Seulement 3, 5, 6, 9, 10, et 11.

@+

Salut,

un petit code sympa pour obtenir une belle variation de couleur via un seul potentiomètre (ou dans une boucle)...

edit: en utilisant les broches 9 et 10 à la place de 13 et 12 citées dans ce petit code bien sûr afin que la commande AnalogWrite() pilote bien des broches capable de PWM... :wink: :smiley:

//petit bout de programme pour faire passer une led rvb du violet au bleu selon une valeur du potard comprise entre 0 et 1024

// --------------connexion matérielles des broches(pins) ---------------
const int Potpin = 0; // analog 0 connecté au potar, pourquoi on met 0 et as A0?? sur la carte je vois les 2 connections
const int Bleupin = 13; // sortie 13 connecté a la broche bleu de la led
const int Vertpin = 12; // sortie 12 connecté a la broche verte de la led
const int Rougepin = 11; // sortie 11 connecté a la broche rouge de la led


//----------------------     variables pour debug
//debug_potar=1   -> utilisation du port série en comme entrée
//debug_potar=0   -> utilisation du potar
int debug_potar=0;
//-----
//debug_calcul=0   -> rien
//debug_calcul=0   -> utilisation du port serie pour visualistion des calculs
int debug_calcul=1;
//-------------------------------------------------------

void setup() {
  pinMode(Potpin, INPUT); //met la broche relié au potard en entrée
  pinMode(Bleupin, OUTPUT); //met la broche relié au bleu de la led en sortie
  pinMode(Vertpin, OUTPUT); //met la broche relié au vert de la led en sortie
  pinMode(Rougepin, OUTPUT); //met la broche relié au vert de la led en sortie
  Serial.begin(9600);
}



void loop(){
  //--------------------  acquisition       (potar ou port série si debug)   ------------
  int Pot;
  if (debug_potar==1){
    while (Serial.available() > 0) {// si donnée envoyé via le PC
      Pot = Serial.parseInt();
    }
  }
  else
  {
    Pot = analogRead(Potpin);    // lecture de la valeur du potar et stockage dans Pot
  }
  //-------------------------------------------------------------------------------------
 
 
  // -----------------------    calcul des valeurs r g b     -------------
  //       source adaptée de  http://blog.vermot.net/2011/11/03/generer-un-degrade-en-arc-en-ciel-en-fonction-d-une-valeur-programmatio/
  int x = (1530*Pot/1024);
  int r;
  int g;
  int b;
  if(x>=0 && x<255){
    r = 0;
    g = 255;
    b = x;
  }
  if(x>=255 && x<510){
    r = 0;
    g = 510-x;
    b = 255;
  }
  if(x>=510 && x<765){
    r = x-510;
    g = 0;
    b = 255;
  }
  if(x>=765 && x<1020){
    r = 255;
    g = 0;
    b = 1020-x;
  }
  if(x>=1020 && x<=1275){
    r = 255;
    g = x-1020;
    b = 0;
  }
  if(x>=1275 && x<=1530){
    r = 255;
    g = 0;
    b = 1530-x;
  }
//-------------------------------------------------------------------

//--------------------écriture des sorties -----------------------------
  analogWrite(Bleupin, b);  // envoi la valeur b sur la broche bleu de la led
  analogWrite(Vertpin, g);  // envoi la valeur g sur la broche vert de la led
  analogWrite(Rougepin, b);  // envoi la valeur r sur la broche rouge de la led

  if (debug_calcul==1){    //debug -> affichage des valeurs sur le moniteur série
    Serial.print("Pot=");
    Serial.print(Pot);
    Serial.print("\tR=");
    Serial.print(r);
    Serial.print("\tV=");
    Serial.print(g);
    Serial.print("\tB=");
    Serial.println(b);
  }
//--------------------------------------------------------------------------------------
 
  delay(200); // une petite tempo de 100ms pour calmer le tout
}