Problème PWM Pin 11

Bonjour !

Ce code reçois le code IR d'une télécommande et permet de sélectionner une des 4 leds puis d'en modifier l'éclairage.
Le soucis : Tout fonctionne à merveille sauf la led en pin 11 qui est soit allumée soit éteinte, 0v ou 5v. Or elle est pourtant PWM comme la 10, la 9 et la 6 ?!!!

#include <IRremote.h>
#include <IRremoteInt.h>

#define GREEN 9
#define BLUE 10
#define RED 6
#define YELLOW 11

#define LGREEN 5
#define LBLUE 5
#define LRED 5
#define LYELLOW 5

#define CHP 16769565
#define CHM 16753245
#define PLUS 16754775
#define MOINS 16769055

byte   pin[]={GREEN, BLUE, RED, YELLOW,'\0'};
byte  lux[]={LGREEN, LBLUE, LRED, LYELLOW};

byte   i = 0;
byte   light = 50;

byte RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Début du récepteur
  
  while(pin[i]){
    analogWrite(pin[i], lux[i]);
    i++;
  }
  pinMode(13, OUTPUT);
  i = 0;
}

void   up_lux()
{
  if((lux[i] + light) <= 255)
    lux[i] += light;
  else
    lux[i] = 255;
}

void   down_lux()
{
  if((lux[i] - light) >= 0)
    lux[i] -= light;
  else
    lux[i] = 0;
}

void  up_led()
{
  if(pin[i + 1])
    i++;
  else
    i = 0;

}
  
void  down_led()
{
  byte tmp;
  if((i - 1) >= 0)
    i--;
  else {
   for (tmp = 0; pin[tmp]; tmp++);
   i = tmp - 1;
  }
}

void loop() {

  if (irrecv.decode(&results)) {
 
  switch(results.value)
  {
    case CHP:
      up_led();
      break;
    case CHM:
      down_led();
      break;
    case PLUS:
      up_lux();
      break;
    case MOINS:
      down_lux();
      break;
  }
  Serial.println(i);
    analogWrite(pin[i], lux[i]);
    irrecv.resume(); // Recevoir la prochaine valeur
  }
}

J'ai donc essayé de commander par 4 interrupteurs afin d'enlever la librairie IR pensant que cela pouvait venir de là, mais rien ne change.

Si quelqu'un peut m'apporter une réponse car après étude des datasheets je n'ai toujours pas trouvé réponse à mon problème.
Merci !

bonjour,
déjà tu déclares où tes pins en output dans ton setup?

tu est sur une UNO?

analogWrite
passe le pinmode en output, mais
while(pin*)*
doit l'arreter avant.
l'explication se trouve certainement dans la tension aux bornes des leds, qui n'est pas la meme en fonction des couleurs.
je suppose que tu les as mises directement sur les pins, a travers une resistance.

Bonjour,

En complément pour référence : http://fr.wikipedia.org - Couleur, Longueur d’onde (nm), Tension de seuil (V)

L'ami René

Je pense que le problème vient de la :

while(pin[i])

'\0' c'est different de zéro, pas sûr que while() l'interprète comme zéro, donc sorte de la boucle comme tu l'as prévu.

D'ailleurs utiliser un while ici c'est un peut étrange, mieux vaut passer par un for :

for (i=0;i<4i++) analogWrite(pin[i],lux[i]);

Si jamais tu veux rendre ton code plus adaptatif, utilise sizeof()

for (i=0;i<(sizeof(pin)-1);i++) analogWrite(pin[i],lux[i]);

Bonjour

le char '\0' vaut bien 0 mais pour être cohérent, la constante 0 serait préférable.

Il y a un certain nombre d'erreurs liées au typage et aux valeurs min et max des types dans le programme :

void   up_lux()
{
  if((lux[i] + light) <= 255)
    lux[i] += light;
  else
    lux[i] = 255;
}

ce sont des octets non signés donc la condition du if est toujours vraie

void   down_lux()
{
  if((lux[i] - light) >= 0)
    lux[i] -= light;
  else
    lux[i] = 0;
}

Ici aussi les octets sont non signés donc le calcul ne peut pas donner un résultat négatif et la condition du if est toujours vraie.

void  down_led()
{
  byte tmp;
  if((i - 1) >= 0)
    i--;
  else {
   for (tmp = 0; pin[tmp]; tmp++);
   i = tmp - 1;
  }
}

Et enfin même chose ici.

As-tu essayé de titiller la pin 11 avec un petit programme de test ? du genre

void setup() {}

void loop() {
   static byte pwm = 0;
   analogWrite(11,pwm++);
   delay(50);
}