Une horloge numérique

Toutes les discussions sur l'Arduino !

Modérateur : MOD

Avatar du membre
likiki
Causant
Messages : 296
Enregistré le : dim. 29 avr. 2012, 15:21
Echelle pratiquée : H0 3R
Prénom : Christian
Site Internet : http://passionnement.forumactif.org
Localisation : Corbeil Essonne
Âge : 52

Re: Une horloge numérique

Message par likiki » dim. 23 nov. 2014, 00:20

Petites améliorations de cette horloge.

Choix de la vitesse de défilement du temps (1/1 - 1/87 - 1/160).

Réglage de l'heure de démarrage.

Le programme (non optimisé) :
/*
*********************************
*                               *
* Horloge numerique sans shield *
*                               *
*     C.ARFEL dit Likiki   V2   *
*                               *
*********************************
*/

#include "LiquidCrystal.h" //ajout de la librairie
#define B_ok 34 // Definition des pin bouton
#define B_P 38  // Idem
#define B_M 42  // Idem

LiquidCrystal lcd(13,12,11,10,9,8,7,6,5,4); //liaison bits de données Arduino ==> afficheur LCD

int Bouton_ok ; // Etat bouton OK
int Bouton_P ;  // Etat bouton +
int Bouton_M ;  // Etat bouton -
int Echelle = 1 ;   // Contiendra la valeur de l'echelle choisi
long Choix = 00; // Contiendra la valeur du réglage temps

char Message1[ ] = "Horloge." ;
char Message2[ ] = "sans shield." ;
char Message3[ ] = "Choix Echelle." ;
char Message4[ ] = "1 / 1     " ;
char Message5[ ] = "1 / 87    " ;
char Message6[ ] = "1 / 160   " ;
char Message7[ ] = "Reglage Heures" ;
char Message8[ ] = "Reglage Minutes" ;


long Secondes = 0; // initialisation des variables
long Affi_sec = 0;
long Min = 00;
long Heur = 00;



void vitesse() // Fonction affichage choix vitesse
{
  
        if (Echelle == 1){
          lcd.setCursor(0,1);
          lcd.print(Message4);
        }
        
        if (Echelle == 2){
         lcd.setCursor(0,1);
         lcd.print(Message5);
        }
        
        if (Echelle == 3){
          lcd.setCursor(0,1);
          lcd.print(Message6);
        }  


void Heure() // Fonction affichage choix heure
{
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(Message7);
          lcd.setCursor(6,1);
          lcd.print(Heur);

         
}  

void Minutes() // Fonction affichage choix heure
{
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print(Message8);
          lcd.setCursor(6,1);
          lcd.print(Min);

         
}  


void choix_vitesse() // Fonction selection vitesse
{
        debutvitesse:
        
        Bouton_P = digitalRead(B_P);
        Bouton_M = digitalRead(B_M);
        Bouton_ok = digitalRead(B_ok);
        delay(100);
  
        if (Bouton_P == LOW && Echelle < 3){
          Echelle ++  ;
          delay(100);
          vitesse();
        }
        
        if (Bouton_M == LOW && Echelle > 1){
          Echelle -- ;
          delay(100);
          vitesse();
        }
        
        if (Echelle == 1){
          Choix = 1;
        }
        
        if (Echelle == 2){
         Choix = 87; 
        }
        
        if (Echelle == 3){
          Choix = 160;
        }
               
        if (Bouton_ok == HIGH){
        
         goto debutvitesse;
        } 
        
        else {
         
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.println("Reglage de la");
        lcd.setCursor(0,1);
        lcd.print (" VITESSE OK ");
         
         delay(2000);
          
        }
        
}

void reglage_heure(){
  
        debutheure:
  
        Bouton_P = digitalRead(B_P);
        Bouton_M = digitalRead(B_M);
        Bouton_ok = digitalRead(B_ok);
        delay(100);
        
        
        Heure();
        
        if (Bouton_P == LOW && Heur < 23){
          Heur ++  ;
          delay(100);
          Heure();
        }
        
        if (Bouton_M == LOW && Heur > 0){
          Heur -- ;
          delay(100);
          Heure();
        }
        
        if (Bouton_ok == HIGH){
        
         goto debutheure;
        } 
        
        else {
         
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.println(" Reglage de");
         lcd.setCursor(0,1);
         lcd.print (" l'heure OK");
         
         delay(2000);
          
        }        
  
}


void reglage_minute(){
  
        debutminute:
  
        Bouton_P = digitalRead(B_P);
        Bouton_M = digitalRead(B_M);
        Bouton_ok = digitalRead(B_ok);
        delay(100);
        
        Minutes();
        
        if (Bouton_P == LOW && Min < 59){
          Min ++  ;
          delay(100);
          Minutes();
        }
        
        if (Bouton_M == LOW && Min > 0){
          Min -- ;
          delay(100);
          Minutes();
        }
        
        if (Bouton_ok == HIGH){
        
         goto debutminute;
        } 
        
        else {
         
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.println(" Reglage des");
         lcd.setCursor(0,1);
         lcd.print (" minutes OK");
         
         delay(2000);
          
        }
        
       
  
}



void setup() {
  
        lcd.begin(16, 2); // Définition de l'ecran LCD 16 caracteres avec 2 ligne
        lcd.setCursor(0,0);
        lcd.print(Message1);  // Affichage d'un texte sur la 1er ligne
        lcd.setCursor(0,1);
        lcd.print(Message2);
        
        delay(2000);
        
        lcd.clear();
        
        lcd.setCursor(0,0);
        lcd.print(Message3);  // Affichage d'un texte sur la 1er ligne
        lcd.setCursor(0,1);
        lcd.print(Message4);  // Affichage d'un texte sur la 2eme ligne
        
        pinMode(B_ok, INPUT) ; // pin correspondante en entrée
        pinMode(B_P, INPUT) ;  // idem
        pinMode(B_M, INPUT) ;  // idem
    




void loop() {
  

        choix_vitesse(); // Direction sous routine choix de la vitesse
        
        reglage_heure(); // Direction sous routine choix de l'heure
        
        reglage_minute(); // Direction sous routine choix des minutes
        
        
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print("Vitesse 1/");
            lcd.print(Choix);
            lcd.setCursor(9,1); // Ligne 1 position 9
            lcd.print (":"); // on affiche
            lcd.setCursor(5,1); // Ligne 1 position 5
            lcd.print (":"); // on affiche
        
        Horloge:    
            
        if (millis() >= Secondes) {
           
            lcd.setCursor(3,1);
            lcd.print (Heur);
          
            lcd.setCursor(7,1);
            lcd.print (Min);
            
            lcd.setCursor(11,1);
            Affi_sec ++;
            lcd.print (Affi_sec);
             
            
            if (Affi_sec == 59) {
              
              Min ++;
              Affi_sec = 0;
              lcd.setCursor(11,1);
              lcd.print ("  ");
              
            }
            
            if (Min == 59) {
              
              Heur ++;
              Min = 0;
              lcd.setCursor(7,1);
              lcd.print ("  ");
              
            }
            
            if (Heur == 24) {
              
              Heur = 0;
              Min = 0;
              lcd.setCursor(3,1);
              lcd.print ("  ");
              
            }
  
            Secondes = millis() + (1014/Choix); // 1014 pour ralentir la pendule mdr

            }
        
         goto Horloge;
        
}

// 



 // Sur un UNO, l'horloge avance de 2s par heure.
 // Mais une precision de 1 000 000 de secondes n'etait pas recherché
 // puisque pas de référence de temps.

La petite vidéo :



Si la vidéo ne s'affiche pas elle est ici ==> https://www.youtube.com/watch?v=1bEzsifuN-0

:ange:
Cordialement,

Christian.

Avatar du membre
groumfit
Papotier
Messages : 143
Enregistré le : sam. 25 oct. 2014, 11:25
Prénom : Denis
Âge : 63

Re: Une horloge numérique

Message par groumfit » dim. 23 nov. 2014, 09:42

Bonjour Christian,
Une pure merveille ! :applause:
Tout le confort moderne. Et aussi bel usage de ta platine : ça fait propre.
:applause: :applause:
J'y arriverai ... demain !

Avatar du membre
likiki
Causant
Messages : 296
Enregistré le : dim. 29 avr. 2012, 15:21
Echelle pratiquée : H0 3R
Prénom : Christian
Site Internet : http://passionnement.forumactif.org
Localisation : Corbeil Essonne
Âge : 52

Re: Une horloge numérique

Message par likiki » lun. 24 nov. 2014, 16:57

Merci Denis.
Cordialement,

Christian.

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une horloge numérique

Message par Sash28 » mar. 09 déc. 2014, 09:20

Super, je l'attendais cette horloge!
Au lieu de 1/87, peut-on mettre 1/20, 1/45?? Si oui, faut-il changer un autre endroit du programme afin que cela soit pris en compte.
Je découvre Arduino, je suis donc encore loin de tout comprendre. Je n'ai fait que de la programmation en basic il y a 12 ans et depuis plus rien.

Merci.

Avatar du membre
Arduino
Prolixe
Messages : 1699
Enregistré le : mer. 25 sept. 2013, 17:14

Re: Une horloge numérique

Message par Arduino » mar. 09 déc. 2014, 10:07

sash28 a écrit :Super, je l'attendais cette horloge!
.....
Je découvre Arduino, je suis donc encore loin de tout comprendre. Je n'ai fait que de la programmation en basic il y a 12 ans et depuis plus rien.

Merci.
Le BASIC t'a permis de comprendre la structure d'un programme, comme les boucles ou bien les tests conditionnels, ainsi que la nature des variables.

Tout cela va t'aider pour Arduino, mais maintenant, il est temps de te consacrer à un langage plus universel, et plus rapide, le C. Il convient très bien pour Arduino, mais pas de panique, Arduino a aussi son langage propre, réduit à quelques expressions. Et en connaissant quelques ordres d'Arduino, on peut déjà commencer de petits projets.

Si tu en as l'occasion, je te conseille de lire (ou relire) mes articles parus dans LR sur Arduino ; les deux premiers pour connaitre les possibilités d'Arduino, puis les suivants qui donnent des exemples pour le train électrique.

Et ici, il y a suffisamment de monde pour t'aider. Alors, bienvenue !

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une horloge numérique

Message par Sash28 » mar. 09 déc. 2014, 10:21

Oui je vais en effet ressortir ces articles mais déjà en lisant tout ce que je peux trouver ici et là, je comprends un peu mieux les programmes. Maintenant, il va falloir passer aux choses sérieuses.
Le C pour les nuls, ça existe :mdr2: :mdr:

Merci à tous en tout cas.

Avatar du membre
likiki
Causant
Messages : 296
Enregistré le : dim. 29 avr. 2012, 15:21
Echelle pratiquée : H0 3R
Prénom : Christian
Site Internet : http://passionnement.forumactif.org
Localisation : Corbeil Essonne
Âge : 52

Re: Une horloge numérique

Message par likiki » mar. 09 déc. 2014, 18:02

sash28 a écrit :Super, je l'attendais cette horloge!
Au lieu de 1/87, peut-on mettre 1/20, 1/45?? Si oui, faut-il changer un autre endroit du programme afin que cela soit pris en compte.
Je découvre Arduino, je suis donc encore loin de tout comprendre. Je n'ai fait que de la programmation en basic il y a 12 ans et depuis plus rien.

Merci.
Pour changer les échelles de temps, il suffit de modifier les lignes suivantes :

char Message4[ ] = "1 / 1     " ;
char Message5[ ] = "1 / 87    " ; // remplacer 87 par l'échelle voulu
char Message6[ ] = "1 / 160   " ; // remplacer 160 par l'échelle voulu
char Message7[ ] = "Reglage Heures" ;
char Message8[ ] = "Reglage Minutes" ;

.
.
.

void choix_vitesse() // Fonction selection vitesse
{
        debutvitesse:
        
        Bouton_P = digitalRead(B_P);
        Bouton_M = digitalRead(B_M);
        Bouton_ok = digitalRead(B_ok);
        delay(100);
  
        if (Bouton_P == LOW && Echelle < 3){
          Echelle ++  ;
          delay(100);
          vitesse();
        }
        
        if (Bouton_M == LOW && Echelle > 1){
          Echelle -- ;
          delay(100);
          vitesse();
        }
        
        if (Echelle == 1){
          Choix = 1;
        }
        
        if (Echelle == 2){
         Choix = 87; // remplacer 87 par l'échelle voulue
        }
        
        if (Echelle == 3){
          Choix = 160; // remplacer 160 par l'échelle voulue
        }
               
        if (Bouton_ok == HIGH){
        
        
C'est pas plus compliqué que cela.

:siffle:
Cordialement,

Christian.

Sash28
Causant
Messages : 211
Enregistré le : mer. 01 juil. 2009, 08:00
Âge : 45

Re: Une horloge numérique

Message par Sash28 » mar. 16 déc. 2014, 17:26

Merci à toi.

Répondre