Merci beaucoup de ta réponse, dès que ma fonction tourne je me pencherais sur le bitwise pour alléger tout ça (j'ai peur que ce soit moins lisible pour moi, là c'est plus "graphique"). Je compte rajouter des animations et du texte par la suite...
Par contre la fonction ne marche toujours pas... La syntaxe?
Voici mon code allégé (seuls les chiffres 0, 1 et 2 et le: sont décris) et commenté pour que ce soit plus clair:
int LED[]= {5, 6, 7, 8, 9, 10, 11, 12};
int space=2; //Espace entre deux chiffres
int delai= 1; //Temps d'affichage d'une colonne
int secondes;
int secondesU; //U pour unités D pour Dizaines
int secondesD;
int minutes;
int minutesU;
int minutesD;
int heures;
int heuresU;
int heuresD;
long interval = 1000; //Le temps que dure la seconde
long previousMillis= 0;
int i;
int j;
int n;
boolean ZERO [8][4] = {
{0,1,1,0},
{1,0,0,1},
{1,0,0,1},
{1,0,0,1},
{1,0,0,1},
{1,0,0,1},
{1,0,0,1},
{0,1,1,0},
};
boolean UN [8][4] = {
{0,0,1,0},
{0,1,1,0},
{1,0,1,0},
{0,0,1,0},
{0,0,1,0},
{0,0,1,0},
{0,0,1,0},
{1,1,1,1},
};
boolean DEUX [8][4] = {
{0,1,1,0},
{1,0,0,1},
{0,0,0,1},
{0,0,1,0},
{0,1,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,1,1},
};
boolean DIX [8][2] = { // les deux points separant Heures Min et Sec
{0,0},
{1,1},
{1,1},
{0,0},
{0,0},
{1,1},
{1,1},
{0,0},
};
boolean initialisation [8]= {0, 0, 0, 0, 0, 0, 0, 0}; //Pour remettre à l'état bas les sorties avant l'affichage d'un autre chiffre
void AffColonnes (boolean tab [][4])
{
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,tab [i][0]); // Ma fameuse fonction qui remplacera les switch case
} // que je réduirais encore puisque je fais 4x la même chose
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,tab [i][1]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,tab [i][2]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,tab [i][3]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,initialisation [i]);
}
delay (delai * space);
}
void afficher (int chiffre)
{
switch(chiffre)
{
case 0 :
AffColonnes (ZERO [8][4]); //et que je suis censé rappeler comme ça
break;
// case 0 :
//
// for (i=0; i<8; i++)
// {
// digitalWrite(LED[i] ,ZERO [i][0]);
// }
// delay (delai);
// for (i=0; i<8; i++)
// {
// digitalWrite(LED[i] ,ZERO [i][1]);
// }
// delay (delai);
// for (i=0; i<8; i++)
// {
// digitalWrite(LED[i] ,ZERO [i][2]);
// }
// delay (delai);
// for (i=0; i<8; i++)
// {
// digitalWrite(LED[i] ,ZERO [i][3]);
// }
// delay (delai);
// for (i=0; i<8; i++)
// {
// digitalWrite(LED[i] ,initialisation [i]);
// }
// delay (delai * space);
// break;
case 1 :
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,UN [i][0]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,UN [i][1]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,UN [i][2]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,UN [i][3]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,initialisation [i]);
}
delay (delai * space);
break;
case 2 :
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,DEUX [i][0]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,DEUX [i][1]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,DEUX [i][2]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,DEUX [i][3]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,initialisation [i]);
}
delay (delai * space);
break;
case 10 :
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,DIX [i][0]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,DIX [i][1]);
}
delay (delai);
for (i=0; i<8; i++)
{
digitalWrite(LED[i] ,initialisation [i]);
}
delay (delai * space);
break;
}
}
void setup()
{
heures =15; //Je règle l'heure ici
minutes=35;
secondes=32;
Serial.begin (9600);
int i;
for (i=0; i<8; i++)
{
pinMode (LED[i], OUTPUT);
}
}
void loop()
{
// Serial.println (ZERO [0][0]);
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) // Un module real time clock remplacera tout ça
{ // et sera certainement l'objet de futurs posts d'aide ^^
previousMillis = currentMillis;
secondes++;
}
secondesD= secondes/10;
secondesU= secondes- (secondesD*10);
minutesD= minutes/10;
minutesU= minutes- (minutesD*10);
heuresD= heures/10;
heuresU= heures- (heuresD*10);
if(secondes == 60)
{
secondes = 0;
minutes++;
}
if(minutes == 60)
{
minutes = 0;
heures++;
}
if(heures == 24)
{
heures = 0;
}
afficher (heuresD);
afficher (heuresU);
afficher (10);
afficher (minutesD);
afficher (minutesU);
afficher (10);
afficher (secondesD);
afficher (secondesU);
delay (delai *12);
// afficher (0);
// afficher (1);
// afficher (2);
// afficher (3);
// afficher (4);
// afficher (5);
// afficher (6);
// afficher (7);
// afficher (8);
// afficher (9);
}
J'ai essayé avec boolean* tab [][4], et plusieurs manières d'écrire mais rien n'y fait, je ne peux pas compiler.
Encore merci pour votre aide!