Bonsoir tout le monde
J'ai monté une matrice de 20 leds (4x5) en utilisant le charliplexing.

et voilà le code :
int nbPins = 5;
int nbLeds = nbPins*(nbPins-1);
int pins[] = {8,9,10,11,12};
int leds[20][5] = { // DECLARATION DES PINS POUR CHAQUE LED : 0 = OUTPUT LOW, 1 = OUTPUT HIGH, 2 = INPUT
//1
{1,0,2,2,2},
{0,1,2,2,2},
{1,2,0,2,2},
{0,2,1,2,2},
//2
{2,1,0,2,2},
{2,0,1,2,2},
{2,2,1,2,0},
{2,2,0,2,1},
//3
{2,2,1,0,2},
{2,2,0,1,2},
{2,0,2,2,1},
{2,1,2,2,0},
//4
{2,2,2,1,0},
{2,2,2,0,1},
{2,1,2,0,2},
{2,0,2,1,2},
// 5
{0,2,2,2,1},
{1,2,2,2,0},
{0,2,2,1,2},
{1,2,2,0,2}
};
void setup() {
pinMode(13,OUTPUT); // VOYANT DE FONCTIONNEMENT
digitalWrite(13, HIGH);
}
void light(int led) {
for (int j=0;j<nbPins;j++) {
switch (leds[led][j]) {
case 0 :
pinMode(pins[j],OUTPUT);
digitalWrite(pins[j],LOW);
break;
case 1:
pinMode(pins[j],OUTPUT);
digitalWrite(pins[j],HIGH);
break;
case 2:
pinMode(pins[j],INPUT);
break;
}
}
}
void loop() {
light(2);
}
Je peux sans pb allumer chaque led indépendamment en appellant light(ledID).
Mon problème vient du fait que si je fais une boucle du style :
void loop() {
light(2);
delay(20ms);
light(5);
delay(20ms);
}
Je vais me retrouver avec une led autre que la 2 ou 5 qui "clignote" faiblement, comme si j'avais fait un analogWrite(pin,10); sur une pin qui à une PWM...
Je pense que cela est du au fait que entre la led 2 et la 5, on a delai d'execution pour switcher les 5 pins en output low/output high/input, et je me retrouve pendant un temps très court avec une configuration des pins du style :
{0,1,1,2,2}, donc deux pins en output high (par exemple) > deux leds allumées en même temps.
Auriez vous une idée de comment "gommer" ce delai ?
Merci ^^
melka