Go Down

Topic: Projet horloge simple (Read 489 times) previous topic - next topic

stribuda

Salut , je compte réaliser un projet qui consiste en une horloge commandé par arduino mega ( car j'ai besoin de bcp de sortie ) et sous forme de 6 afficheurs 7 segments ( 2 pour afficher les secondes , 2 pour afficher les minutes et 2 pour l'heure ) , je compte également ajouter un clavier numérique avec lequel l'utilisateur peu entrer l'heure , la minute et la seconde .
Mon code est simple a comprendre mais très long :

Code: [Select]
int s1 , s2 , m1 , m2 , h1 , h2 ;
byte afficheur_seconde_1[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 },
{ 1,0,1,1,1,1,1 },
{ 1,1,1,0,0,0,0 },
{ 1,1,1,1,1,1,1 },
{ 1,1,1,1,0,1,1 }},
afficheur_seconde_2[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 }},
afficheur_minute_1[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 },
{ 1,0,1,1,1,1,1 },
{ 1,1,1,0,0,0,0 },
{ 1,1,1,1,1,1,1 },
{ 1,1,1,1,0,1,1 }},
afficheur_minute_2[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 }},
afficheur_heure_1[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 },
{ 1,0,1,1,1,1,1 },
{ 1,1,1,0,0,0,0 },
{ 1,1,1,1,1,1,1 },
{ 1,1,1,1,0,1,1 }},
afficheur_heure_2[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 }};

void setup()
        {
        pinMode(0, OUTPUT);
        pinMode(1, OUTPUT);
        pinMode(2, OUTPUT);
        pinMode(3, OUTPUT);
        pinMode(4, OUTPUT);
        pinMode(5, OUTPUT);
        pinMode(6, OUTPUT);
        pinMode(7, OUTPUT);
        pinMode(8, OUTPUT);
        pinMode(9, OUTPUT);
        pinMode(10, OUTPUT);
        pinMode(11, OUTPUT);
        pinMode(12, OUTPUT);
        pinMode(13, OUTPUT);
        pinMode(14, OUTPUT);
        pinMode(15, OUTPUT);
        pinMode(16, OUTPUT);
        pinMode(17, OUTPUT);
        pinMode(18, OUTPUT);
        pinMode(19, OUTPUT);
        pinMode(20, OUTPUT);
        pinMode(21, OUTPUT);
        pinMode(22, OUTPUT);
        pinMode(23, OUTPUT);
        pinMode(24, OUTPUT);
        pinMode(25, OUTPUT);
        pinMode(26, OUTPUT);
        pinMode(27, OUTPUT);
        pinMode(28, OUTPUT);
        pinMode(29, OUTPUT);
        pinMode(30, OUTPUT);
        pinMode(31, OUTPUT);
        pinMode(32, OUTPUT);
        pinMode(33, OUTPUT);
        pinMode(34, OUTPUT);
        pinMode(35, OUTPUT);
        pinMode(36, OUTPUT);
        pinMode(37, OUTPUT);
        pinMode(38, OUTPUT);
        pinMode(39, OUTPUT);
        pinMode(40, OUTPUT);   
       }


void loop()
{
for (int pin=0 ; pin<7 ; pin++){
digitalWrite(pin     , afficheur_seconde_1[s1][pin]);
digitalWrite((pin+7) , afficheur_seconde_2[s2][pin]);
digitalWrite((pin+14), afficheur_minute_1[m1][pin]);
digitalWrite((pin+21), afficheur_minute_2[m2][pin]);
digitalWrite((pin+28), afficheur_heure_1[h1][pin]);
digitalWrite((pin+35), afficheur_heure_2[h2][pin]);
}

s1++;
if(s1>9)
{s1 = 0 ;
s2++ ;}
if(s2>5)
{s2=0;
m1++;}
if(m1>9)
{m1 = 0 ;
m2++ ;}
if(m2>5)
{m2=0;
h1++;}
if(h1>9)
{h1 = 0 ;
h2++ ;}
if((h2=2)&&(h1>3))
{h2=0;
h1;}
delay(990);}


La prochaine étape est celle qui m'ai difficile , je sais pas comment utiliser digitalRead() avec les 10 entrée numérique et obtenir ainsi les valeur entrée par l'utilisateur sur l'heure , la minute et la seconde .
Je compte après ça faire 2 mode avec cette horloge , mode horloge simple et chronomètre .

Merci de m'aider et si il y'a une faute dans mon programme n'hésité pas a me le montrer.

Domonet

Bonsoir,
ça ne devient pas limite en nombre de lignes d'entrée sortie ?
Pour la mise à l'heure, pour limiter le nombre de boutons, il est possible de n'influer que sur le délai pour accélérer le temps pour le réglage avec un seul bouton.
Personnellement je ferais le programme à l'inverse, un boucle qui ne fait rien, un sous programme précis pour la gestion de la seconde de base, et un sous programme d'avance du temps.
Les tests conditionnels dans le programme principal empêcheront qu'il soit stable dans la durée, puisque suivant les conditions remplies, il n'y aura pas le même nombre d'instruction à chaque tour.
Eventuellement utiliser un décodeur BCD/7 segment externe, coût supplémentaire, mais lignes libérées pour afficher dixièmes et centièmes en chrono, clignotement des deux points, boutons supplémentaires...
L'autre solution, au top en consommation de ports, multiplexer l'affichage, 7 lignes pour les 7 segments sur transistor pour booster l'ampérage de sortie, 1 ligne par afficheur sur transistor pour allumer un afficheur quelques millisecondes, puis passage au suivant...
BTS F2 en 94. Like électronique audio et tube, Programmation Basic, Pascal, C, Assembleur, un peu de html/php/mysql. Tout Linux.

stribuda

#2
Mar 19, 2013, 12:34 am Last Edit: Mar 19, 2013, 12:53 am by stribuda Reason: 1
J'ai modifié le programme en ajoutant la partie qui concerne le clavier , jeter un coup d'oeuille pour me dire si il y'a une faute quelque part s'il vous plait , j'ai découvert aussi le shiftOut qui est trés éfficace , j'ai lut des tutoriel sur lui et je compte demain aller acheter l'arduino + le clavier + le registre 74 (shiftOut) + les afficheur BCD .
Merci de me répondre d'ici demain matin et me donner votre avis sur l'avancement :)
The code :
Code: [Select]
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {45, 44, 43, 42}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {48, 47, 46}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );




int s1 , s2 , m1 , m2 , h1 , h2 ;
byte afficheur_seconde_1[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 },
{ 1,0,1,1,1,1,1 },
{ 1,1,1,0,0,0,0 },
{ 1,1,1,1,1,1,1 },
{ 1,1,1,1,0,1,1 }},
afficheur_seconde_2[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 }},
afficheur_minute_1[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 },
{ 1,0,1,1,1,1,1 },
{ 1,1,1,0,0,0,0 },
{ 1,1,1,1,1,1,1 },
{ 1,1,1,1,0,1,1 }},
afficheur_minute_2[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 }},
afficheur_heure_1[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 },
{ 1,1,1,1,0,0,1 },
{ 0,1,1,0,0,1,1 },
{ 1,0,1,1,0,1,1 },
{ 1,0,1,1,1,1,1 },
{ 1,1,1,0,0,0,0 },
{ 1,1,1,1,1,1,1 },
{ 1,1,1,1,0,1,1 }},
afficheur_heure_2[10][7]={{0,0,0,0,0,0,1 },
{ 0,1,1,0,0,0,0 },
{ 1,1,0,1,1,0,1 }};

void setup()
        {
        pinMode(0, OUTPUT);
        pinMode(1, OUTPUT);
        pinMode(2, OUTPUT);
        pinMode(3, OUTPUT);
        pinMode(4, OUTPUT);
        pinMode(5, OUTPUT);
        pinMode(6, OUTPUT);
        pinMode(7, OUTPUT);
        pinMode(8, OUTPUT);
        pinMode(9, OUTPUT);
        pinMode(10, OUTPUT);
        pinMode(11, OUTPUT);
        pinMode(12, OUTPUT);
        pinMode(13, OUTPUT);
        pinMode(14, OUTPUT);
        pinMode(15, OUTPUT);
        pinMode(16, OUTPUT);
        pinMode(17, OUTPUT);
        pinMode(18, OUTPUT);
        pinMode(19, OUTPUT);
        pinMode(20, OUTPUT);
        pinMode(21, OUTPUT);
        pinMode(22, OUTPUT);
        pinMode(23, OUTPUT);
        pinMode(24, OUTPUT);
        pinMode(25, OUTPUT);
        pinMode(26, OUTPUT);
        pinMode(27, OUTPUT);
        pinMode(28, OUTPUT);
        pinMode(29, OUTPUT);
        pinMode(30, OUTPUT);
        pinMode(31, OUTPUT);
        pinMode(32, OUTPUT);
        pinMode(33, OUTPUT);
        pinMode(34, OUTPUT);
        pinMode(35, OUTPUT);
        pinMode(36, OUTPUT);
        pinMode(37, OUTPUT);
        pinMode(38, OUTPUT);
        pinMode(39, OUTPUT);
        pinMode(40, OUTPUT);
      char ss1 = keypad.getKey();
      char ss2 = keypad.getKey();
      char mm1 = keypad.getKey();
      char mm2 = keypad.getKey();
      char hh1 = keypad.getKey();
      char hh2 = keypad.getKey();
      int s1 = ss1 - '0';
      int s2 = ss2 - '0';
      int m1 = mm1 - '0';
      int m2 = mm2 - '0';
      int h1 = hh1 - '0';
      int h2 = hh2 - '0';
      correction();
      }

       

void loop()
{
 
for (int pin=0 ; pin<7 ; pin++){
digitalWrite(pin     , afficheur_seconde_1[s1][pin]);
digitalWrite((pin+7) , afficheur_seconde_2[s2][pin]);
digitalWrite((pin+14), afficheur_minute_1[m1][pin]);
digitalWrite((pin+21), afficheur_minute_2[m2][pin]);
digitalWrite((pin+28), afficheur_heure_1[h1][pin]);
digitalWrite((pin+35), afficheur_heure_2[h2][pin]);
}

s1++;
if(s1>9)
{s1 = 0 ;
s2++ ;}
if(s2>5)
{s2=0;
m1++;}
if(m1>9)
{m1 = 0 ;
m2++ ;}
if(m2>5)
{m2=0;
h1++;}
if(h1>9)
{h1 = 0 ;
h2++ ;}
if((h2=2)&&(h1>3))
{h2=0;
h1;}
delay(990);
}

Go Up