Table des matières

Horloge 4x7 segments

Le projet

Contact : C. Simon

Prétexte : les réveils matin vendus de nos jours ignorent superbement que l'affichage nocturne devrait être rouge, pour éviter d'éblouir.

En fait : j'avais envie d'utiliser des afficheurs 7 segments, et un module d'horloge (Real Time Clock = RTC).

Webographie et composants

Difficultés

L'afficheur est mal identifié. Il est écrit 05641 A/B… C'est un B (A et B différent par la polarité des LED).

Les sorties de l'Arduino (qui dans le code sont nommées GND1, GND2, GND3, GND4 pour chaque chiffre) devraient être renommées COM1, COM2…

Après avoir fait des échanges entre niveaux HIGH et LOW pour tenir compte du type A↔B de l'afficheur, on tatonne un peu pour trouver comment insérer l'allumage périodique d'un point décimal clignotant. Aussi des tatonnements pour essayer de régler la luminosité en jouant sur les temps d'allumage/extinction, mais on provoque assez vite un scintillement désagréable. En outre, certains segments ne sont pas franchement éteint mais restent un peu lumineux… Code final ci-dessous.

Voici le résultat.

Reste à faire

Il reste des entrées analogiques sur l'Arduino Nano. Si on arrive à régler la luminosité, on peut envisager une luminosité variable automatiquement en fonction de l'éclairage ambiant.

On peut encore envisager de mettre des boutons (réglage alarme ?).

Mais il n'y a plus de sorties pour contrôler autre chose : pas de musique ni d'éclairage progressif. Moche, et ce ne sera pas mieux avec un Uno. Il va falloir trouver un décodeur ou autre chose.

Code

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;


int aPin = 2;  //                     A
int bPin = 3;  //             ________
int cPin = 4;  //           |                   |
int dPin = 5;  //       F  |                   |  B
int ePin = 6;  //           |         G       |
int fPin = 7;  //            |________|
int gPin = 8;  //           |                   |
int dotPin = 13;
int GND1 = 9;  //        |                   |
int GND2 = 10; //   E |                   |   C
int GND3 = 11; //       |________|
int GND4 = 12; //       
int num;       //         D
int dig1 = 0;
int dig2 = 0;
int dig3 = 0;
int dig4 = 0;

int HTime = 1;
int LTime = 1;
int OTime = 0;

int secondes = 0 ;
int minutes = 0 ;
int heures = 0;
void setup()
{
  pinMode(aPin, OUTPUT);
  pinMode(bPin, OUTPUT);
  pinMode(cPin, OUTPUT);
  pinMode(dPin, OUTPUT);
  pinMode(ePin, OUTPUT); 
  pinMode(fPin, OUTPUT);
  pinMode(gPin, OUTPUT);
  pinMode(dotPin, OUTPUT);
  pinMode(GND1, OUTPUT);
  pinMode(GND2, OUTPUT);
  pinMode(GND3, OUTPUT);
  pinMode(GND4, OUTPUT);
//  Serial.begin(9600);

  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
//    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
  

void loop()
{
  DateTime now = RTC.now();
  secondes = now.second(); 
  minutes = now.minute();
  heures = now.hour();

  dig1 = minutes % 10 ;
  dig2 = minutes/10 ;
  dig3 = heures % 20 ;
  dig4 = heures/10;


    
  digitalWrite( GND1, LOW);
  digitalWrite( GND2, LOW);
  digitalWrite( GND3, LOW);
  digitalWrite( GND4, LOW);

  delay(OTime);
  
  digitalWrite( GND4, HIGH);    //digit 4
  pickNumber(dig4);
  delay(HTime);
  digitalWrite( GND4, LOW);
  delay(LTime);   
  
  digitalWrite( GND3, HIGH);    //digit 3
  if(secondes % 2) { digitalWrite( dotPin, LOW); } 
  pickNumber(dig3);
  delay(HTime);
  digitalWrite( GND3, LOW);
  digitalWrite( dotPin, HIGH);
  delay(LTime);
  
  digitalWrite( GND2, HIGH);   //digit 2
  pickNumber(dig2);
  delay(HTime);
  digitalWrite( GND2, LOW);
  delay(LTime); 
  
  digitalWrite( GND1, HIGH);   //digit 1
  pickNumber(dig1);
  delay(HTime);
  digitalWrite( GND1, LOW);
  delay(LTime);

}
 
void pickNumber(int x){
   switch(x){
     case 1: one(); break;
     case 2: two(); break;
     case 3: three(); break;
     case 4: four(); break;
     case 5: five(); break;
     case 6: six(); break;
     case 7: seven(); break;
     case 8: eight(); break;
     case 9: nine(); break;
     default: zero(); break;
   }
}

void clearLEDs()
{  
  digitalWrite(  2, HIGH); // A
  digitalWrite(  3, HIGH); // B
  digitalWrite(  4, HIGH); // C
  digitalWrite(  5, HIGH); // D
  digitalWrite(  6, HIGH); // E
  digitalWrite(  7, HIGH); // F
  digitalWrite(  8, HIGH); // G
}

void one()
{
  digitalWrite( aPin, HIGH);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, HIGH);
  digitalWrite( ePin, HIGH);
  digitalWrite( fPin, HIGH);
  digitalWrite( gPin, HIGH);
}

void two()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, HIGH);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, LOW);
  digitalWrite( fPin, HIGH);
  digitalWrite( gPin, LOW);
}

void three()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, HIGH);
  digitalWrite( fPin, HIGH);
  digitalWrite( gPin, LOW);
}

void four()
{
  digitalWrite( aPin, HIGH);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, HIGH);
  digitalWrite( ePin, HIGH);
  digitalWrite( fPin, LOW);
  digitalWrite( gPin, LOW);
}

void five()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, HIGH);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, HIGH);
  digitalWrite( fPin, LOW);
  digitalWrite( gPin, LOW);
}

void six()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, HIGH);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, LOW);
  digitalWrite( fPin, LOW);
  digitalWrite( gPin, LOW);
}

void seven()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, HIGH);
  digitalWrite( ePin, HIGH);
  digitalWrite( fPin, HIGH);
  digitalWrite( gPin, HIGH);
}

void eight()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, LOW);
  digitalWrite( fPin, LOW);
  digitalWrite( gPin, LOW);
}

void nine()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, HIGH);
  digitalWrite( fPin, LOW);
  digitalWrite( gPin, LOW);
}

void zero()
{
  digitalWrite( aPin, LOW);
  digitalWrite( bPin, LOW);
  digitalWrite( cPin, LOW);
  digitalWrite( dPin, LOW);
  digitalWrite( ePin, LOW);
  digitalWrite( fPin, LOW);
  digitalWrite( gPin, HIGH);
}