afficher sur des 7 segment un nombre recu par le port serie

bonjour,

voila mon problème c’est la dernière partie d’un projet qui vise a faire un déconteur automatique pour le tir a l’arc (la n’est pas le problème) mais j’ai un problème avec les afficheur 7segment qui reçoivent le décompte par l’intermédiaire du port série sur une carte arduino nano qui contrôle une petite carte de puissance car les afficheurs choisis sont très gourmand (0.5A par segment) mais voila je n’arrive pas a afficher les nombres que mon autre arduino envoi. Comme le serial ne transmet que du texte j’ai utiliser la fonction atoy étant donner que je doit manipuler les nombres pour les l’afficher. (j’ai utiliser un multiplexage.)

voici le code de l’arduino nano (celle du controleur):

/*    
A a la pin 3
B a la pin 4
C a la pin 5
D a la pin 6
E a la pin 7
F a la pin 8
G a la pin 9
*/

#define A 2
#define B 3
#define C 4
#define D 5
#define E 6
#define f 7
#define G 8

#define alim_1 11
#define alim_2 12
#define alim_3 13

char afficheur;
char data[3];
unsigned int nombre;

void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(G, OUTPUT);
  
  pinMode(alim_1, OUTPUT);
  pinMode(alim_2, OUTPUT);
  pinMode(alim_3, OUTPUT);
  
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(G, HIGH);
  
  digitalWrite(alim_1, LOW);
  digitalWrite(alim_2, LOW);
  digitalWrite(alim_3, LOW);
  
  Serial.begin(9600);
}
void loop()
{
    if (Serial.available() == 3)
    {
        Serial.readBytes(data, 3);
        nombre = atoi(data);
    } 
    afficher(nombre);    
}
void afficher(int chrono)
{
  int unite, dizaine, centaine;
  if (chrono >= 100)
  {
    centaine =  chrono / 100;    
  }
  dizaine = chrono - (centaine * 100);
  dizaine = dizaine / 10;
  unite = chrono - (dizaine * 10) - (centaine * 100);
  
  afficheur = (millis() % 15)/5;
  
  if(afficheur = 0)
  {  
    digitalWrite(alim_1, HIGH);
    digitalWrite(alim_2, LOW);
    digitalWrite(alim_3, LOW);
    printchiffre(centaine);
  }
  
  if (afficheur = 1)
  {
    digitalWrite(alim_1, LOW);
    digitalWrite(alim_2, HIGH);
    digitalWrite(alim_3, LOW);
    printchiffre(dizaine);
  }
    
  if (afficheur = 2)
  {
    digitalWrite(alim_1, LOW);
    digitalWrite(alim_2, LOW);
    digitalWrite(alim_3, HIGH);
    printchiffre(unite);
  }
}

void printchiffre(char chiffre)
{
  switch(chiffre)
  {
    case 0:
    
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(f, LOW);
    digitalWrite(G, HIGH);
    break;
    
    case 1:
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(G, HIGH); 
    break;
    
    case 2:
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(G, LOW);
    break;
    
    case 3:
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(G, LOW);
    break;
    
    case 4:
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(G, LOW);
    break;
    
    case 5:
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(G, LOW);
    break;
    
    case 6:
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(f, LOW);
    digitalWrite(G, LOW);
    break;
    
    case 7:
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
    digitalWrite(E, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(G, HIGH);
    break;
    
    case 8:
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, LOW);
    digitalWrite(f, LOW);
    digitalWrite(G, LOW);
    break;
    
    case 9:
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
    digitalWrite(E, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(G, LOW);
    break;
  }
}

et la partie du code qui envoi le temp sur le port serie (sur l’autre arduino):

void sendtime()
{ 
  Serial.print("*");
    if (temps >= 100)
    {
      Serial.print(temps);
      
    }
    else if(temps < 100 && temps >= 10)
    {
      Serial.print("0");
      Serial.print(temps);
    }
    else
    {
      Serial.print("00");
      Serial.print(temps);
    }
}

quelqu’un pourais me donner une explication de ce non fonctionnement ?

merci d’avance

Ton code je n'en sais rien mais j'avais regardé la faisabilité d'un produit équivalent et j'avais opté pour des registres à décalage chaînés. Un registre par afficheur. Ce n'est plus la peine de multiplexer les afficheurs. (1) Il faut 3 fils : horloge, donnée et latch pour éviter les états intermédiaires. J'avais utilisé un tableau pour décrire chiffre par chiffre quel segments devaient être allumés, cela fonctionnait parfaitement.

(1) le multiplexage ne fait rien gagner en consommation puisque pour avoir une puissance rétinienne équivalente on fait passer plus de courant pendant le temps de conduction. Donc au total la valeur de intégrale est la même.

qu'entends-tu par "je n'arrive pas à afficher"? car vu ton code, tu ne verras pas grand chose à part le dernier chiffre.

de quel genre de "carte de puissance" parles-tu?

photos, refs et schémas please

Problème sur les if() dans afficher()