Aide afficheur 7 segment

Bonjour à tous,

Je suis débutante en arduino et j'ai déjà plusieurs problèmes :sweat_smile:
Je travaille avec une carte avec un atmega328p qui fonctionne comme un arduino uno il me semble.
Je veux programmer un afficheur 7 segments allant de 0 à 9 avec un registre à décalage 74hc595.
J'ai trouvé de nombreux codes sur internet mais aucun ne fonctionne correctement :cry: (celui ci dessous affiche n'importe quoi sur le 7 segment).
De plus, je voudrais programmer 2 bouton poussoir pour qu'il puisse faire +1 ou -1 sur l'afficheur, comment faire?

Voici le code:

// pin 11 of 74HC595 (SHCP)
const int bit_clock_pin = 16;
// pin 12 of 74HC595 (STCP)
const int digit_clock_pin = 15;
// pin 14 of 74HC595 (DS)
const int data_pin = 14;

// digit pattern for a 7-segment display
const byte digit_pattern[16] =
{
  B00111111,  // 0
  B00000110,  // 1
  B01011011,  // 2
  B01001111,  // 3
  B01100110,  // 4
  B01101101,  // 5
  B01111101,  // 6
  B00000111,  // 7
  B01111111,  // 8
  B01101111,  // 9
  B01110111,  // A
  B01111100,  // b
  B00111001,  // C
  B01011110,  // d
  B01111001,  // E
  B01110001   // F
};

unsigned int counter = 0;

void setup()
{
  pinMode(data_pin, OUTPUT);
  pinMode(bit_clock_pin, OUTPUT);
  pinMode(digit_clock_pin, OUTPUT);  
}
 
void update_one_digit(int data)
{
  int i;
  byte pattern;
  
  // get the digit pattern to be updated
  pattern = digit_pattern[data];

  // turn off the output of 74HC595
  digitalWrite(digit_clock_pin, LOW);
  
  // update data pattern to be outputed from 74HC595
  // because it's a common anode LED, the pattern needs to be inverted
  shiftOut(data_pin, bit_clock_pin, MSBFIRST, ~pattern);
  
  // turn on the output of 74HC595
  digitalWrite(digit_clock_pin, HIGH);
}

void loop()
{ 
  int i;
  unsigned int digit_base;
  
  counter++;
  
  digit_base = 16;

  // get the value to be displayed and update one digit
  update_one_digit(counter % digit_base);
  
  delay(500);
}

Merci d'avance je vous en serais très reconnaissante

hello
ton code a été fait pour un afficheur à "anodes communes".

c'est bien le cas pour ton afficheur ?

j'ai été voir, je crois que mon afficheur possède des anodes et cathodes selon le schéma que j'ai^^

schéma montage 7 segments.png

Bonjour,

D'après la doc, il s'agit bien d'un afficheur à anodes communes.

D'après ce que je vois dans la table digit_pattern :

B00111111, // 0

Envoyer des 1 pour allumer les 6 LEDs du ZERO sur un afficheur semble correspondre plutôt à un afficheur à cathode commune.
Personnellement pour un afficheur à anode commune j'enverrais plutôt le contraire :

B01000000, // 0

La pin 10 du 74HC595 reliée au GND ? j'ai un doute, plutôt au +5V :

Oui, mais il y a inversion des bits dans le shiftOut

 shiftOut(data_pin, bit_clock_pin, MSBFIRST, ~pattern);

Yo ! ça roule comme ça alors.
Si cela affiche n'importe quoi, il reste l'erreur de câblage ...

Effectivement, il y a sans doute une erreur de câblage. Tu es sure que tu n'a pas inversé les signaux SHCP et STCP.
Sinon essaies d'allumer les segments un par un pour voir s'il sont bien dans l'ordre attendu.

hbachetti:
La pin 10 du 74HC595 reliée au GND ? j'ai un doute, plutôt au +5V :

C'est plus qu'un doute. Lorsque la pin 10 est à 0 le registre à décalage est bloqué en reset.

Si le n'importe quoi varie toutes les demi secondes, et qu'il y a une erreur de cablage, elle ne peut porter que sur les affectations de segments (liaison partie parallele du 495 -> segments)
essayez (par un programme séparé) d'envoyer :

B00000001
puis
B00000010, B00000100 etc (les vamleurs étant multipliées par 2 à chaque fois: 8 essais)
pour voir quel(s) segment(s) est/sont affecté(s) -kamil m'a doublé-

Je ne pense pas avoir inversé les signaux (j'ai vérifié avec un prof d'IUT), pareil pour le cablage...

Est ce que votre affichage de n'"importe quoi" est modifié toutes les 0.5 secondes? (ça voudrait dire que le 495 fonctionne en registre à décalage)

Clara78000:
Je ne pense pas avoir inversé les signaux (j'ai vérifié avec un prof d'IUT), pareil pour le cablage...

Le programme est correct, ça ne peut être qu'une erreur de câblage (différence entre le câblage et les pins déclarées dans le programme).

oui, il fonctionne avec un registre à décalage ^^

Donc, il affiche diverses sortes de n'importe quoi? Il ne vous reste "qu"'à tester les segments un par un (par logiciel, en envoyant des pussances de 2; c'est plus facile qu'avec des yeux), comme Kamil et moi avons suggéré independamment...

exactement, je vais essayer de tester cela merci :smiley: