[RÉSOLU]Problème digitalWrite

Bonjour, Bonsoir à tous,

J'ai fais un programme pour contrôler 4 afficheurs S516EWA via des transistors (2N2907A).
Malheureusement en voulant éclaircir une fonction je me heurte à un problème.

Voilà mon programme :

/*
titre :pilotage de quatres afficheurs 7(S516EWA)segements avec un Arduino et 4 transistors

*/

// ajout des librairies



// déclaration de variables globales
int broche[7]={2,3,4,5,6,7,8};//connection à l'afficheur 7 segments:2=A 3=B 4=C 5=D 6=E 7=F 8=G
int transistor[4]={9,10,11,12};//Connection des transistors à l'arduino
int nombre[10][7]=//Nombres affichés sur le 7 segments
{
  {0,0,0,0,0,0,1},// nombre 0
  {1,0,0,1,1,1,1},// nombre 1
  {0,0,1,0,0,1,0},// nombre 2
  {0,0,0,0,1,1,0},// nombre 3
  {1,0,0,1,1,0,0},// nombre 6
  {0,1,0,0,1,0,0},// nombre 5
  {0,1,0,0,0,0,0},// nombre 6
  {0,0,0,1,1,1,1},// nombre 7
  {0,0,0,0,0,0,0},// nombre 8
  {0,0,0,0,1,0,0}// nombre 9
};
int etat_transistor[4][4]=
{
  {1,0,0,0},
  {0,1,0,0},
  {0,0,1,0},
  {0,0,0,1}
};
char * quel_unite[]=
{
  "s_u",
  "s_d",
  "m_u",
  "m_d"
};
word temps_actuel=0;
word temps_precedent=0;
int temps=0;//variable pour le temps
int s_u=0;//variable des unitées
int s_d=0;//variable des dizaines
int m_u=0;//variable des unitée de minute
int m_d=0;//variable des dizaines de minutes
int quoi_afficher=0;
// déclaration des constantes



// setup

void setup()
{
 for(int i=0; i<7; i++)//Réalisation d'une boucle for pour initialiser les broches en sortie
 {
  pinMode(broche[i],OUTPUT);
 };
 for(int i=0; i<4; i++)//Réalisation d'une boucle for pour initialiser les transistors en sortie
 {
  pinMode(transistor[i],OUTPUT);
 };
}

// déclaration des fonctions
void compter_temps()//fonction compter temps
{
 temps_actuel=millis();//Rapporte le temps depuis le branchage de l'arduino et le met dans temps_actuel
 temps=temps_actuel-temps_precedent;//Calcul de la durée
 if(temps>=1000)//Si la durée est egale au superieur à 1 second
 {
  s_u++;//ajouter +1 aux unitées des secondes
  temps_precedent=temps_actuel;//Modifier le temps precedent avec le temps actuel
 };
 if(s_u>9)//Si les unitées des secondes est superieurs à 9 remettre le compteur à 0
 {
  s_u=0;
  s_d++;//ajouter 1 aux dizaines des secondes
 };

 if(s_d>5)//Si les dizaines des secondes sont superieurs à 5 remettre le compteur à 0
  {
    s_d=0;
    m_u++;//ajouter 1 aux unitées des minutes
  };
 if(m_u>9)//Si les unitées des minutes sont superieurs à 9 remettre le compteur à 0
 {
  m_u=0;
  m_d++;//ajouter 1 aux dizaines des minutes
 };
 if(m_d>5)//Si les dizaines des minutes sont superieurs à 5 remettre le compteur à 0
 {
  m_d=0;
 };
}
void afficher_temps()
{
 for(int i=0; i<7; i++)//realisation d'une boucle for pour afficher les unitées des secondes par rapport au temps
 {
  digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);
 };
 delay(5);
 quoi_afficher=++;
 if(quoi_afficher>3)
 {
  quoi_afficher=0;
 };
 choisir_transistor();
}
void choisir_transistor()
{
  for(int i=0; i<4; i++)
  {
    digitalWrite(transistor[i],etat_transistor[quoi_afficher][i]);
  };
}
// programme

void loop()
{
 compter_temps();
 afficher_temps();
}

Ce qui me bloque c'est cela :

digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);

Je m'explique, ce que je voudrai faire c'est choisir le nombre que j'affiche avec donc "nombre" mais pour cela je veux choisir si c'est les unités des secondes, les dizaines des secondes ect... via un char.
Mais pour choisir quel chaîne de caractère choisir dans le char "quel_unite" je voudrai utilisé la variable quoi_afficher qui s'incrémente à chaque demande du void "afficher_temps".

Pour faire simple, ma question est : Puis-je faire ceci

digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);

ou es-ce impossible ?
Et si je peux le faire, pourquoi ai-je ce message d'erreur : invalid types 'int [10][7][char*]' for array subscript

Merci pour vos futurs réponses :slight_smile:

Et si je peux le faire, pourquoi ai-je ce message d'erreur : invalid types 'int [10][7][char*]' for array subscript

[color=blue]nombre[[/color][color=red]quel_unite[quoi_afficher][/color][color=blue]][[/color][color=purple]i[/color][color=blue]][/color]

nombre est un tableau à 2 dimensions, donc on écrit bien nombre[[color=red]x[/color]][[color=purple]y[/color]] pour accéder à un des éléments. ça c'est correct.

mais il faut que x et y soient des entiers (et il est de bon goût de rester dans les indices associés au tableau)

or ici votre x est [color=red]quel_unite[quoi_afficher][/color] et le type du tableau [color=red]quel_unite[/color] c'est un char * --> donc ça ne va pas...

Merci de ta réponse.
Mais du-coup que dois-je faire pour choisir l'unité dans mon char ?

faut expliquer un peu mieux c'est quoi ce tableau de pointeurs sur chaînes de caractères...
qu'essayez vous de faire exactement ?

Ok je m'explique:
dans mon programme ça

digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);

c'est pour afficher un chiffre un des afficheurs 7 segments que j'utilise.
J'utilise une boucle for pour allumer chaqu'un des segments de l'afficheur pour former le chiffre

for(int i=0; i<7; i++)//realisation d'une boucle for pour afficher les unitées des secondes par rapport au temps
 {
  digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);
 };

broche sert donc à indiquer les broches sur lesquels écrire.
nombre sert à indiquer quoi écrire sur les broches.
quel_unite est pour choisir la variable que j'utilise pour donner le chiffre qui est écrit sur l'afficheur.
quoi_afficher est une variable qui est incrémentée à chaque sortie de la boucle for, elle me permet de savoir à quel unité j'en suis (si je suis aux unité des secondes ou au dixième des secondes (si je ne suis pas assez clair : 36s -> 3=dixième et 6= unité)pareil pour les minutes)
Donc il faut que nombre change en fonction de quel_unite d'où le nombre[quel_unite] mais aussi que quel_unite change en fonction de quoi_afficher
ça donnerai : digitalWrite(broche[i],nombre[quel_unite[0]])//0=unité des secondes
Pour le coup quel_unite prendrai la valeur 0 donc avec ce tableau
* *char * quel_unite[]= {   "s_u",   "s_d",   "m_u",   "m_d" };* *
la valeur "s_u" donc avec ma fonction "compter_temps" imaginons qu'il se sois passé 2s donc s_u=2 alors nombre[2] donc mon afficheur devrai afficher le chiffre 2
(je ne sais pas dutout si c'est clair... j'ai essayer de faire tout mon possible pour)

Vous devriez relire un peu la spec du langage C....

C’est un langage compilé le nom des variable disparaît à la compilation... et des chaînes de caractères dans le code ne référencent pas des variables...

Si vous avez un int x=36 et que vous voulez d’abord 3 et ensuite 6 alors les unités c’est x %10 et les dizaines c’est x/10 (en calcul entier)

Merci bien pour tes réponses (malgré que je n'ai pas compris la dernière). J'ai cependant réussi à comprendre mon erreur :
J'ai un tableau [4][3]
et dans mon digitalWrite j'avais ceci :

digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);

forcément ça ne pouvais pas fonctionner !
nombre[quel_unite[quoi_afficher]]
quel_unite est le tableau [4][3] et je n'avais mis que le 4

donc finalement ça donne :

char quel_unite[4][3]=
{
  "s_u",
  "s_d",
  "m_u",
  "m_d"
};

...

for(int i=0; i<7; i++)
 {
    for(int a=0; a<3; a++)
    {
      digitalWrite(broche[i],nombre[quel_unite[quoi_afficher][a]][i]);//
    }
 };

Merci bien pour ton aide :smiley:

pourquoi un char qui vaut ‘s’ ou ‘_’ ou ‘u’ etc serait un indice valide de votre tableau.. ça me parait être n’importe quoi...

il faudrait plutot que le tableau quel_unite soit un tableau de pointeurs sur les variables à afficher, non ?

Ou même bien plus simplement un tableau de 4 int (ou byte) contenant les 4 variables s_u, s_d, m_u, m_d

ça donnerai un truc de ce genre ? :

int quel_unite[4]{0,1,2,3};

...

void choisir_unite()
{
 quel_unite[0]=s_u;
 quel_unite[1]=s_d;
 quel_unite[2]=m_u;
 quel_unite[3]=m_d;
}

...

choisir_unite();
 for(int i=0; i<7; i++)//realisation d'une boucle for pour afficher les unitées des secondes par rapport au temps
 {
   digitalWrite(broche[i],nombre[quel_unite[quoi_afficher]][i]);
 };
 quoi_afficher++;
 if(quoi_afficher>3)//Si quoi_afficher dépasse 3
 {
  quoi_afficher=0;//remettre à 0 quoi_afficher
 };

crée un tableau de plus, par exemple

int valeurs[4]=0;

et ensuite tu décide que par exemple tes unités de secondes c'est valeurs[0] donc partout où tu utilisais s_u tu remplaces par valeurs[0]
idem pour les 3 autres variables, que tu vas remplacer par valeurs[1], valeurs[2] et valeurs[3]

donc pour l'affichage, tu finiras bien par avoir :

digitalWrite(broche[i],nombre[valeurs[quoi_afficher]][i]);

Je galère depuis des heures pour un truc tout con xD
Merci beaucoup pour ton aide !

Thoomass:
Je galère depuis des heures pour un truc tout con xD

Ça ça arrive très souvent à tout le monde :wink:

Comme Je le disais en #5, Le langage C++ est compilé

Vos chaînes de caractères "s_u", "s_d", "m_u", "m_d" n’ont absolument rien à voir avec Les variables du même nom (Car j’ai bien impression que c’est ce que vous essayez de faire)