Horloge binaire RVB

Après avoir récupéré tout plein de LEDs RGB (rouge, vert et bleu dans la même LED), j'ai pu réaliser une idée qui me trottait dans la tête depuis un petit moment, une horloge binaire avec un affichage simultané de l'heure (en bleu), des minutes (en rouge) et des secondes (en vert). Chaque LED affiche donc une couleur, combinaison de ces trois couleurs.

L'horloge est contrôlée par un Arduino, qui pilote un driver de LEDs TLC5940 de Texas Instrument, qui permet de générer 16 signaux PWM. L'avantage d'utiliser des signaux modulés est de pouvoir régler la luminosité des LEDS en fonction des combinaisons de couleurs. En effet avec des signaux tout ou rien, une couleur seule (rouge par exemple) serait beaucoup moins brillante que le blanc, qui est générée en allumant les 3 couleurs. Le TLC5940 est disponible en sample sur le site de TI. Par contre j'en avait commandé 5, et j'en ai reçu seulement un...

Pour l'application, j'utilise la bibliothèque TLC pour Arduino, qui permet de communiquer avec ces contrôleurs de LED de manière très facile. Pour le décompte du temps, j'ai fait au plus simple, sans utiliser les timers de l'ATMega, d'ailleurs comme écrit dans les commentaires, l'horloge ne pourra pas fonctionner correctement très longtemps. En même temps je ne sais pas quelle est la précision des timers...

#include "Tlc5940.h"

byte s;  // seconds, in GREEN
byte m;  // minutes, in RED
byte h;  // hours, in BLUE

static unsigned long time; // "cheap" timer

void setup()
{
  // Initialisation of the TLC
  Tlc.init();
  Tlc.clear();
  Tlc.update();
  delay(1);

  // Set the hour here...
  h = 10;
  m = 30;
  s = 0;

  time = millis();
}

void loop()
{

  // if 1000ms are passed, update the clock.
  // /!\ the clock will die after the millis() counter
  // will roll back to 0, but it will stand at least
  // for about 50 days, which is enough for my test...
  if (millis() - time > 999)
  {
    time += 1000;
    updateClock();
    for (byte i=0; i<6; i++)
      setColor(i);
    Tlc.update();
    delay(1); // 1ms delay to update TLC
  }
}

// This function is called every second,
// and update the hours, minutes and seconds.
void updateClock()
{
  ++s;

  if (s>59)
  {
    s = 0;
    ++m;
  }

  if (m>59)
  {
    m = 0;
    ++h;
  }

  if (h>11) // 12 hours version, I don't have enough outputs for 24 hours...
  {
    h = 0;
  }
}

// This function sets the levels of each color
// in order to have better colors with the same
// level of brigthness (instead of just setting
// the signals full on or off)
void setColor(byte n)
{
  boolean g = (s & (1<<n));
  boolean r = (m & (1<<n));
  boolean b = (h & (1<<n));

  int red, green, blue;

  if (!r && !g && !b)
  {
    //BLACK
    red = 0;
    green = 0;
    blue = 0;
  }
  else if (!r && !g && b)
  {
    //BLUE
    red = 0;
    green = 0;
    blue = 4000;
  }
  else if (!r && g && !b)
  {
    //GREEN
    red = 0;
    green = 4000;
    blue = 0;
  }
  else if (!r && g && b)
  {
    //CYAN
    red = 0;
    green = 1500;
    blue = 1500;
  }
  else if (r && !g && !b)
  {
    //RED
    red = 4095;
    green = 0;
    blue = 0;
  }
  else if (r && !g && b)
  {
    //MAGENTA
    red = 3000;
    green = 0;
    blue = 2000;
  }
  else if (r && g && !b)
  {
    //YELLOW
    red = 3000;
    green = 2000;
    blue = 0;
  }
  else
  {
    //WHITE
    red = 3000;
    green = 2000;
    blue = 1000;
  }

  Tlc.set(n,red);
  Tlc.set(n+6,green);
  if (n<4)
    Tlc.set(n+12,blue);
}

Pour terminer ce projet, je compte utiliser un module RTC (Real Time Clock) qui me permettra de sauvegarder l'heure après la mise hors tension de l'Arduino, et utiliser des balles de ping-pong pour diffuser la lumière des LEDs !

Commentaires

Pour commenter cet article, merci de m'écrire directement par mail : mailto