Faire une horloge avec 4 7 segments displays

Il faut prendre la bonne librairie ..

Ce point là est important à comprendre

// réservé i2c SDA  DS3231     =A4;
// réservé i2c SCL  DS3231     =A5;

oui, le code compile bien chez moi et le texte défile sur le moniteur
n'ayant pas d'afficheurs sous la main, je n'ai pas pu tester cette partie
il faudra peut être ralentir la loop ( selon l'effet visuel qu'il y aura )

voici celle ( en fichier joint) qui est dans le répertoire librairie des mon IDE

DS3231.zip (43 KB)

Bonjour,
Pour le code tout est bon et je vous en remercie !
Mais pour la câblage j'ai quelques problèmes,
J'arrive trés bien a cabler cette partie: (Et le module RTC)

// reserve pour serial RX      = 0;
// reserve pour serial TX      = 1;
byte segment_a                 = 2;//segment a  du jeu d'afficheurs 1
byte segment_b                 = 3;//segment b  du jeu d'afficheurs 1
byte segment_c                 = 4;//segment c  du jeu d'afficheurs 1
byte segment_d                 = 5;//segment d  du jeu d'afficheurs 1
byte segment_e                 = 6;//segment e  du jeu d'afficheurs 1
byte segment_f                 = 7;//segment f  du jeu d'afficheurs 1
byte segment_g                 = 8;//segment g  du jeu d'afficheurs 1
byte segment_dp                = 9;//segment dp du jeu d'afficheurs 1

Mais pas la suite

byte digit_dizaines_heures     =10;//transistor sur anode digit dizaines  d'heures   afficheurs 1
byte digit_heures              =11;//transistor sur anode digit             heures   afficheurs 1
byte digit_dizaines_minutes    =12;//transistor sur anode digit dizaines de minutes  afficheurs 1
//reserve led temoin           =13
byte digit_minutes             =14;//A0 transistor sur anode digit             minutes  afficheurs 1
byte digit_dizaines_secondes   =15;//A1 transistor sur anode digit dizaines de secondes afficheurs 1
byte digit_secondes            =16;//A2 transistor sur anode digit             secondes afficheurs 1
// libre                       =A3;
// reserve i2c SDA  DS3231     =A4;
// reserve i2c SCL  DS3231     =A5;

Car je ne sais pas sur quelle broches de mes 4 digits les branchée
Au cas ou voici les digits que j'utilise : https://core-electronics.com.au/media/catalog/product/cache/1/image/fe1bcd18654db18f328c2faaaf3c690a/7/-/7-segment_display_-_20mm__red___com-11405__01.jpg

Cordialement,

je suis surpris que tu ai pu raccorder les segments et pas les anodes/cathodes
si tu sais ou sont les uns, tu dois savoir ou sont les autres.

la photo ne sert à rien, il faut la référence qui doit être inscrite sur le coté de l'afficheur

voir aussi si sur ton site vendeur, s'il y a un schéma

attention pour le branchement des segments, ne pas oublier de mettre des résistances

la référence est HS420561K-32, c'était dans un pack amazon et j'avais deja reussis a l'allumer pas besoin de résistances

Cordialement,

Alors, comme je fait pour le cablage ?

si tu descends dans la page du lien suivant, tu y verras les caracteristiques de ton afficheur
ICI

ici, les indications ci dessous (à verifier)
Top Row: 1 A F 2 3 B
Bottom Row: E D DP C G 4

J'ai suivi tout ce que vous m'avez envoyer mais je ne parviens toujours pas a mon but

Cordialement,

c'est quoi ton problème? c'est quoi ton but?

Mon probleme est que le premier digit ne sallume pas et les autres affiches de la mer**

Et mon but et des creer une horloge avec un module RTC et 4 digit

Cordialement,

dis moi de quel type est ton afficheur
anodes communes ou cathodes communes?

comment as tu branché ton afficheur?

as tu utilisé des résistances de limitation du courant?

sans réponse de ta part, j'ai fais une maquette.

il a d'abord fallu que je sonne mon afficheur 4 digits pour retrouver le brochage
ce que j'ai fais avec des résistances de 270ohms
mon afficheur est à cathodes communes. j'ai monté 7 résistances sur les anodes.

pour tester mon prg
il y avait des erreurs dans l'allumage des segments.
exemple un 0 s'affichait en P.
une fois ce prob revu, j'avais D10 qui ne fonctionnait pas.
je l'ai remplacé par A1

ensuite, j'ai modifié le début du prg pour que tous les chiffres défilent sur les 4 digits.

l'affichage de l'heure est ok et le dp clignote bien

voici le prg qui fonctionne chez moi

reviens nous dire que c'est ok chez toi

#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;
// reserve pour serial RX      = 0;
// reserve pour serial TX      = 1;
byte segment_a                 = 2;//segment a  du jeu d'afficheurs 1
byte segment_b                 = 3;//segment b  du jeu d'afficheurs 1
byte segment_c                 = 4;//segment c  du jeu d'afficheurs 1
byte segment_d                 = 5;//segment d  du jeu d'afficheurs 1
byte segment_e                 = 6;//segment e  du jeu d'afficheurs 1
byte segment_f                 = 7;//segment f  du jeu d'afficheurs 1
byte segment_g                 = 8;//segment g  du jeu d'afficheurs 1
byte segment_dp                = 9;//segment dp du jeu d'afficheurs 1

byte digit_dizaines_heures     =15;//transistor sur anode digit dizaines  d'heures   afficheurs 1
byte digit_heures              =11;//transistor sur anode digit             heures   afficheurs 1
byte digit_dizaines_minutes    =12;//transistor sur anode digit dizaines de minutes  afficheurs 1
//reserve led temoin           =13
byte digit_minutes             =14;//A0 transistor sur anode digit             minutes  afficheurs 1
byte digit_dizaines_secondes   =10;//A1 transistor sur anode digit dizaines de secondes afficheurs 1
byte digit_secondes            =16;//A2 transistor sur anode digit             secondes afficheurs 1
// libre                       =A3;
// reserve i2c SDA  DS3231     =A4;
// reserve i2c SCL  DS3231     =A5;
int digit=0;
int valeur = 0;
int memo_secondes=0;
unsigned long temps_top = 0;
boolean top = false;
boolean dp = true;
int dgp=0;
int h=0;
int mn=0;
int s=0;
//boolean DPB = true;
void setup() {
  clock.begin();
  Serial.begin(115200);
for (int f = 2; f < 10;f++){pinMode(f,OUTPUT); digitalWrite(f,LOW);}
for (int f = 11;f < 18;f++){pinMode(f,OUTPUT);digitalWrite(f,HIGH);}//Désactivation de tous les digits
 for (int f= 0;f<10;f++){//inscrit un trait horizontal sur les digits
  digit=digit_dizaines_heures;valeur=f;aiguillage();delay(200);// inscrit zéro sur les dizaines heures
  digit=digit_heures;valeur=f;aiguillage();delay(200); // inscrit zéro sur les heures
  digit=digit_dizaines_minutes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les dizaines minutes
  digit=digit_minutes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les minutes
  //digit=digit_dizaines_secondes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les dizaines secondes
  //digit=digit_secondes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les secondes
 }
  clock.setDateTime(__DATE__, __TIME__);
  dt = clock.getDateTime();
  h=atoi(clock.dateFormat("H", dt));Serial.print(h);
  Serial.print(":");
  mn= atoi(clock.dateFormat("i", dt));Serial.print(mn);
  Serial.print(" ");
  s=atoi(clock.dateFormat("s", dt));Serial.print(s);
  Serial.println(" ");
}

void loop() {
   dt = clock.getDateTime();
  if (memo_secondes!=atoi((clock.dateFormat("s", dt)))){dp=!dp;memo_secondes=atoi((clock.dateFormat("s", dt)));Serial.print("_______________________dp = ");Serial.println(dp);}

     //dizaines heures
if ((atoi(clock.dateFormat("H", dt)))>10)
  {digit=digit_dizaines_heures;valeur=(atoi(clock.dateFormat("H", dt)))/10;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}  
 else{valeur=0;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}
delay(5); //heures
  {digit=digit_heures;valeur=((atoi(clock.dateFormat("H", dt)))%10);dgp=dp;aiguillage();dgp=dp;Serial.print(valeur);Serial.print (" ");}   
 delay(5);    //dizaines minutes
if ((atoi(clock.dateFormat("i", dt)))>10)
  {digit=digit_dizaines_minutes;valeur=((atoi(clock.dateFormat("i", dt)))/10);dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}   
 else{valeur=0;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}
delay(5); //minutes
  {digit=digit_minutes;valeur=((atoi(clock.dateFormat("i", dt)))%10);dgp=0;aiguillage();Serial.print(valeur);Serial.println (" ");}   
 delay(5);    //dizaines secondes
/*if ((atoi(clock.dateFormat("s", dt)))>10)
  {digit=digit_dizaines_secondes;valeur=((atoi(clock.dateFormat("s", dt)))/10);dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");} 
//secondes
else{valeur=0;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}
  {digit=digit_secondes;valeur=((atoi(clock.dateFormat("s", dt)))%10);aiguillage();dgp=0;Serial.print(valeur);Serial.println (" ");}  
*/

}

void aiguillage()
  {
        switch (valeur)
        { 
         case 0://             A B C D E F G    //chiffre 0
           actionDigital(digit,1,1,1,1,1,1,0,dgp);
           break ;
         case 1://             A B C D E F G    //chiffre 1
           actionDigital(digit,0,1,1,0,0,0,0,dgp);
           break ;
         case 2://             A B C D E F G    //chiffre 2
           actionDigital(digit,1,1,0,1,1,0,1,dgp);
           break ;
         case 3://             A B C D E F G    //chiffre 3
           actionDigital(digit,1,1,1,1,0,0,1,dgp);
           break ;
         case 4://             A B C D E F G    //chiffre 4
           actionDigital(digit,0,1,1,0,0,1,1,dgp);
           break ;
         case 5://             A B C D E F G    //chiffre 5
           actionDigital(digit,1,0,1,1,0,1,1,dgp);
           break ;                         
         case 6://             A B C D E F G    //chiffre 6
           actionDigital(digit,1,0,1,1,1,1,1,dgp);
           break ;       
         case 7://             A B C D E F G    //chiffre 7
           actionDigital(digit,1,1,1,0,0,0,0,dgp);
           break ;
         case 8://             A B C D E F G    //chiffre 8
           actionDigital(digit,1,1,1,1,1,1,1,dgp);
           break ;
         case 9://             A B C D E F G    //chiffre 9
           actionDigital(digit,1,1,1,1,0,1,1,dgp);
           break ;
         default:
         break;
       }
   }


 
   //                                A        B         C          D           E        F        G
  void actionDigital(byte digit,byte un,byte deux,byte trois,byte quatre,byte cinq,byte six,byte sept,byte dgpt)
  {
     digitalWrite(digit_dizaines_heures,  HIGH);    //desactive le digit dizaines de heures
     digitalWrite(digit_heures, HIGH);              //desactive le digit heures
     digitalWrite(digit_dizaines_minutes, HIGH);    //desactive le digit dizaines de minutes
     digitalWrite(digit_minutes, HIGH);             //desactive le digit minutes
     digitalWrite(digit_dizaines_secondes,HIGH);    //desactive le digit dizaines de secondes
     digitalWrite(digit_secondes, HIGH);            //desactive le digit secondes
     digitalWrite(digit, LOW);                      //active le digit concerne 
     digitalWrite(segment_a, un);                   //Segment A
     digitalWrite(segment_b, deux);                 //Segment B
     digitalWrite(segment_c, trois);                //Segment C
     digitalWrite(segment_d, quatre);               //Segment D
     digitalWrite(segment_e, cinq);                 //Segment E
     digitalWrite(segment_f, six);                  //Segment F
     digitalWrite(segment_g, sept);                 //Segment G
     digitalWrite(segment_dp, dgpt);                //Segment digital point
  }

@dfg la barre d’espace et le return sont cassés sur votre clavier ? :slight_smile:

for (int f = 2; f < 10;f++){pinMode(f,OUTPUT); digitalWrite(f,LOW);}
for (int f = 11;f < 18;f++){pinMode(f,OUTPUT);digitalWrite(f,HIGH);}//Désactivation de tous les digits
 for (int f= 0;f<10;f++){//inscrit un trait horizontal sur les digits
  digit=digit_dizaines_heures;valeur=f;aiguillage();delay(200);// inscrit zéro sur les dizaines heures
  digit=digit_heures;valeur=f;aiguillage();delay(200); // inscrit zéro sur les heures
  digit=digit_dizaines_minutes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les dizaines minutes
  digit=digit_minutes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les minutes
  //digit=digit_dizaines_secondes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les dizaines secondes
  //digit=digit_secondes;valeur=f;aiguillage();delay(200); // inscrit zéro sur les secondes
 }

c’est un peu dense à lire, non?

hello JM
c'est une vieille habitude.
lorsque qu'une partie de code est opérationnelle, je la "tasse bien" de façon à ce qu'elle prenne le moins de lignes possible.
lorsqu'il faut parcourir l'écran, c'est moins rasoir si le programme est court.

il m'arrive aussi de déplacer ces parties opérationnelles dans d'autres onglets, tout en sachant que je n'aurais plus à les regarder.

OK
Pas super simple à lire quand c’est posté ici

Il y a des éditeurs de code qui permettent de « replier » des blocs de texte c’est pratique pour cela mais l’IDE arduino ne le fait pas en effet

Perso je préfère la lisibilité à la longueur avec une bonne souris on scroll vite :slight_smile:

dernière correction, dans la loop:
l'affichage ne fonctionnait pas correctement quand le nombre d'heures ou de minutes était inférieur à 10

void loop() {
   dt = clock.getDateTime();
  if (memo_secondes!=atoi((clock.dateFormat("s", dt)))){dp=!dp;memo_secondes=atoi((clock.dateFormat("s", dt)));Serial.print("_______________________dp = ");Serial.println(dp);}

     //dizaines heures
if ((atoi(clock.dateFormat("H", dt)))>=10)
  {digit=digit_dizaines_heures;valeur=(((atoi(clock.dateFormat("H", dt)))/10));dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}  
 else{digit=digit_dizaines_heures;valeur=0;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}
delay(5); //heures
  {digit=digit_heures;valeur=((atoi(clock.dateFormat("H", dt)))%10);dgp=dp;aiguillage();dgp=dp;Serial.print(valeur);Serial.print (" ");}   
 delay(5);    //dizaines minutes

if ((atoi(clock.dateFormat("i", dt)))>=10)
  {digit=digit_dizaines_minutes;valeur=((atoi(clock.dateFormat("i", dt)))/10);dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}   
 else{digit=digit_dizaines_minutes;valeur=0;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}
delay(5); //minutes
  {digit=digit_minutes;valeur=((atoi(clock.dateFormat("i", dt)))%10);dgp=0;aiguillage();dgp=0;Serial.print(valeur);Serial.println (" ");}     
delay(5);  
  /*
  //dizaines secondes
if ((atoi(clock.dateFormat("s", dt)))>=10)
  {digit=digit_dizaines_secondes;valeur=((atoi(clock.dateFormat("s", dt)))/10);dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");} 
  else{digit=digit_dizaines_secondes;valeur=0;dgp=0;aiguillage();Serial.print(valeur);Serial.print ("");}
  delay(5);//secondes
  {digit=digit_secondes;valeur=((atoi(clock.dateFormat("s", dt)))%10);aiguillage();dgp=0;Serial.print(valeur);Serial.println (" ");}  
  delay(5);
  */
}

Ok je testerais sa plus tard mais est-ce qu'il y a moyen que vous m'écriviez tout le câblage ?

Exemple :

BROCHES DIGITS ARDUINO
1 A1
2 2

ect ...

Sa serais vraiment cool de votre part meme si vous en avez fait beaucoup pour moi jusqu'a présent.
Cordialement,

rappel: les afficheurs 7 segments ne sont qu'un ensemble de leds
ces leds doivent etre limitées en courant sous peine de destruction.(de la led et/ou de la sortie du µ)
il faut mettre des leds de limitation sur les segments a,b,c,d,e,f,g,dp.
perso j'ai mis des 270 ohms.

va voir sur ce lien ICI, tu y verras un schéma de cablage correct.

convention de numérotation des pinoches de l'afficheur
l'afficheur dans le sens de la lecture des chiffres, façade vers toi.

en bas à gauche nous mettons le N°1 puis en suivant vers la droite il y a les n° 2,3,4,5,6
au dessus du 6, c'est à dire en haut à droite, il y a le 7 puis en continuant vers la gauche il y a le 8,9,10,11,12.

autrement dit on démarre en bas à gauche et on numérote en sens inverse des aiguilles d'une montre.

pattes arduino 10 2 7 11 12 3
role de la patte K1 a f K2 K3 b
pattes afficheur 12 11 10 9 8 7

AFFICHEUR 420561

pattes afficheur 1 2 3 4 5 6
role de la patte e d dp c g K4
pattes arduino 6 5 9 4 8 14

K1, K2, K3, K4 sont les cathodes des digits 1, 2, 3, 4
digit 1 est pour les dizaines d'heure
digit 2 est pour les heures
digit 3 est pour les dizaines de minute
digit 4 est pour les minutes

rappel dans le programme tu risques d'avoir la version que j'ai corrigée suite à mon prob avec D10
donc la connection de D10 sera à mettre en conformité dans le programme:
en ligne 16 du prg, il faudra remplacer =15 par =10
et en ligne 21, il faudra remplacer =10 par =15
je te rappelle que 14 arduino est A0 .

tu ne cableras pas 15 et 16 car tu n'affiches pas des secondes

J'ai tout fait comme vous me l'avez dit mais sa m'affiche

au demarrage, les digits doivent chacun à leur tour , de gauche à droite, afficher les chiffres de 0 à 9
s'ils ne le font pas, c'est que tu à un problème de cablage.