Besoin d'aide pour programmer une horloge sur arduino avec un écran 4x7 segments

Résolu
Edgard-Ledouillet Messages postés 4 Date d'inscription mercredi 6 mars 2019 Statut Membre Dernière intervention 30 janvier 2020 - Modifié le 30 janv. 2020 à 09:20
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 30 janv. 2020 à 14:13
Bonjour, je réalise une horloge avec un écran à 7 segments (4x7) et j'ai réaliser un code d'où ressortent plusieurs problème;

-En premier lorsqu'une de mes variables atteignent "10" elles affiches "A" que j'ai déduis comme en Hexadécimal et je ne sait pas pourquoi.

-Ensuite quand ma variable "Heures2" arrive à "6" elle rajoute bien +1 a la variable "Heures1" mais continue jusqu'à "7" pour reprendre a "1". Je pense que le "10" provient du plus "+1" de la variable "Minutes1".

-Et pour finir, lorsque "24" s'affiche des résultat se produisent aléatoirement; des fois le programme repart a "21" et d'autres il continue à "30" pour reprendre a "11".

Merci de vos réponses.
-CODE-
-------------------------------------------------------------------------------------------------------------------------------
#include "TM1637.h"                                // appel de la bibliothèque

                                                    // affectation des broches  
#define CLK 3                 
#define DIO 4


TM1637 aff_segments(CLK,DIO);           // Déclaration de l'écran comme "aff_segments"

byte secondes=0;                               
byte Minutes1=0;
byte Minutes2=0;                     //Déclaration des variables de temps
byte Heures1=0;
byte Heures2=0;

void setup()
{
  aff_segments.init();
  aff_segments.set(2);
  aff_segments.display(3,0);          // on affiche "0" sur les quatres segments
  aff_segments.display(2,0);
  aff_segments.display(1,0);
  aff_segments.display(0,0);
  
}
void loop() 
{
  if (1>0)                                //valeur infinie
  {
    secondes=secondes+1;
    
    if (secondes==1)                   // Timer de 60s
    {
      secondes=0;                                 // remise de "secondes" à 0
      Minutes1=Minutes1+1;              // +1 à "Minutes1" et display de "Minutes1" sur le segment 3
     aff_segments.display(3,Minutes1);
    }
    
    if (Minutes1==10)                                      // 
    {
      Minutes1=0;                            // remise de "Minutes1" à 0
      Minutes2=Minutes2+1;                    // +1 à "Minutes2" et display de "Minutes2" sur le segment 2
     aff_segments.display(2,Minutes2);
    }
     
     if (Minutes2==6)                                     // si "Minutes2"=6 continue jusqu'a 7 (problème)
    {
      Minutes1=0;                                       // remise de "Minutes1" à 0
      Minutes2=0;                                       // remise de "Minutes2" à 0
      Heures1=Heures1+1;                       // +1 à "Heures1" et display de "Heures1" sur le segment 1
     aff_segments.display(1,Heures1);
    }
     if (Heures1==10)                                   // si "Heures1"=10
    {
      Minutes1=0;                                        // remise de "Minutes1" à 0
      Minutes2=0;                                      // remise de "Minutes2" à 0
      Heures1=0;
      Heures2=Heures2+1;                               // +1 à "Heures2" et display de "Heures2" sur le segment 0
     aff_segments.display(0,Heures2);
    }
    if (Heures2==2 & Heures1==4)                // SI "Heures2"=2 ET "Heures1"=4 (24)
    {
      Minutes1=0;                       // remise de "Minutes1" à 0
      Minutes2=0;                       // remise de "Minutes2" à 0
      Heures1=0;                        // remise de "Heures1" à 0
      Heures2=0;                        // remise de "Heures2" à 0
    }
    
  }
 delay(10);                         
// Délai de une seconde
---------------------------------------------------------------------------------------------------------------------------------------
A voir également:

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 30 janv. 2020 à 16:48
Bonjour.

Je ne fais pas d'Arduino, donc je ne pourrais pas t'aider sur la partie technique d'affichage.

En revanche l'algo d'affichage, ça je peux ! Les vérifications et les affichages ne vont pas ensemble tout simplement. C'est la même erreur partout. Par exemple, si tu arrives sur la condition Minute1 == 10, et que Minute2 vaut déjà 6, et bien tu incrémentes Minute2 (à 7), puis l'affiche. Forcément, tu ne rentreras alors pas dans la condition "if (Minutes2==6)" juste après.
La plus grande heure possible est 23h. 24h n'existe pas (on dit 00h). Une journée de 24h va de 00h à 23h.

Ce que tu fais est "logique" mais n'est pas la meilleure manière de faire les choses. Devoir gérer des "retenues" dans tous les sens, c'est assez lourd et difficile à relire et maintenir. Une bien meilleure solution, serait de n'avoir que des secondes, et d'en déduire minutes, heures et secondes à partir du temps écoulé.

Par exemple:
1 h => 3600 secondes
1 min => 60 secondes

3725 secondes écoulés c'est:

3725 / 3600 => 1 heure
3725 % 3600 => il reste 125 sec

125 / 60 => 2 minutes
125 % 60 => Il reste 5 sec

Donc ça donne 01h 02min 05sec. Avec simplement des divisions et des modulos (reste de la division). On obtient un bon résultat, plus facilement.

Pour savoir comment afficher un nombre à 2 chiffres, tu regardes juste si c'est < 10 (auquel cas tu affiches 0 et le nombre), ou >= 10 (auquel cas tu affiches nombre / 10 et nombre % 10).

Bonne chance !
0
Rejoignez-nous