Affichage des articles dont le libellé est DS1307. Afficher tous les articles
Affichage des articles dont le libellé est DS1307. Afficher tous les articles

GrandRoue: Horloge murale

Je vous présente ma dernière "création": une horloge murale (qui essaie d'être) design: GrandRoue

Elle est basée sur:
  • un Arduino (bien-sûr !) , pour le moment c'est un Duemilanove mais ce sera une version Standalone dans la version finale de cette horloge
  • un DS1307 RTC, pour lequel j'avais déjà fait une première approche dans ce billet
  • un MAX7219, driver de LED, permettant de piloter jusqu'à 64 LED. Ca tombre bien: j'en ai 60 dans mon horloge ... sa mise en oeuvre est décrite ici
Les 60 LED sont dispatchées sur le pourtour de la "roue", et représentent chacune un 60ième d'heure.
Pour distinguer l'aiguille de l'heure des minutes et secondes, j'ai choisi le concept suivant:
  • l'aiguille des heures est représentée par 3 LED allumées
  • l'aiguille des minutes par 2 LED allumées
  • l'aiguille des secondes par 1 LED

Fonctionnalités offertes:
Et bien elle donne l'heure !
Ni plus (pour le moment) ni moins ...
Il est bien-sûr possible de régler cette heure, et l'heure courante est conservée en cas de coupure de courant par la pile du module DS1307

Ajout en Version 02: la luminosité des aiguilles est ajustée en fonction de la luminosité ambiante.
Je pensais aussi rajouter une fonction minuterie (pour cuire les oeufs ;) ), voire une fonction réveil, mais je ne sais pas si je vais m'y pencher ...
Je rajouterai aussi certainement des petits effets lumineux qui tourneront toutes les heures, histoire de rendre le tout vraiment original

La GrandRoue en photos, et vidéo:
Pas facile de prendre des photos quand il fait sombre ...



Cette version est juste un test pour voir ce que pouvait donner une horloge avec ce design: elle fait 50cm, les LED sont "plantées" par l'arrière, dans de l'Isorel. Elles sont soudées sur de petites platines d'essais.
Dans la version finale, les LED seront sur des PCB par groupe de 8, et une plaque de plexi opaque couvrira les LED pour mieux diffuser la lumière (les plaques de plexi sont vendues en 50cm de côté, d'où la taille retenue ...)

Explications techniques:
Le sketch peut être décomposé en 2 grandes fonctions:
  • La gestion du DS1307, comprenant la récupération de l'heure courante, le réglage, l'enregistrement d'une nouvelle heure. Le tout est déjà expliqué ici
  • L'affichage de l'heure sur le cercle de LED. Cette fonction est gérée par le MAX7219.
Le MAX7219 gérant les LED sous forme de matrice de 8x8 éléments, j'ai numéroté mes LED comme suit:


C 1  2  3  4  5  6  7  8
R -----------------------
1 0  1  2  3  4  5  6  7
2 8  9  10 11 12 13 14 15
3 16 17 18 19 20 21 22 23
4 24 25 26 27 28 29 30 31
5 32 33 34 35 36 37 38 39
6 40 41 42 43 44 45 46 47
7 48 49 50 51 52 53 54 55
8 56 57 58 59

Il y a donc dans le sketch une petite moulinette permettant de passer d'un adressage matriciel à un adressage linéraire ...

DS1307: Le temps qui passe ...

Depuis un bon moment nous recherchons, ma femme & moi, une horloge qui soit originale et design.

On ne peut pas dire que les différentes marques (ou no-marques) fassent franchement des efforts sur le design dans ce qu'on trouve dans les diverses enseignes, à quelques exceptions près, hors de prix - cela va de soi.

Pas grave: je vais la faire maison.

Je commence donc cette étude par le coeur de ce que sera ma future horloge: le DS1307 RTC.

Présentation du module

Le module DS1307 RTC (pour Real Time Clock) est une horloge en mesure de fournir secondes, minutes, heures, jour, mois & année avec prise en compte des années bisextiles  jusqu'en 2100, ce qui devrait me laisser le temps de finaliser cette horloge ;).
Une pile de sauvegarde peut être mise en place pour conserver les données en cas de coupure de l'alim extérieure.

Le DS1307 s'interface sur un bus I²C, à l'adresse 68.

Il y a donc 2 liaisons data, à relier aux broches 4 (sda) & 5 (scl) de l'Arduino et 2 liaisons pour l'alimentation en 5v du module.

Mise en oeuvre du module
Pour tester le DS1307, je suis parti de l'exemple dispo sur bildr.org.

J'ai écrit un petit sketch permettant d'afficher le temps qui passe sur le port série, avec possibilité de régler les heures et les minutes.
Ca fonctionne, le gros challenge ayant été la gestion des rebonds.

Attention aussi à ne pas faire la même erreur que moi, en plaçant un des inter sur la pin 1, qui est la sortie Tx !

Le montage
Voici la liste des entrées-sorties:

E/S num:
--------

Broche  Signal        Fonction  
|-0      Rx           
|-1      Tx              
|-2      inter          Interrupteur réglage
|-3      PWM/Inter      Interrupteur '+'
|-4      I2C            SDA DS1307
|-5      PWM/I2C        SCL DS1307
|-6      PWM           
|-7      Entree         Interrupteur '-'
|-8      Entree       
|-9      PWM          
|-10     PWM          
|-11     PWM           
|-12     Entree        
|-13     Entree        

Entrees analogiques:
--------------------
|-14    
|-15    
|-16    
|-17    
|-18    
|-19    
|-20    

Le sketch


Lecture des données en provenance du DS1307:

Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
second = bcdToDec(Wire.receive());
minute = bcdToDec(Wire.receive());
hour = bcdToDec(Wire.receive() & 0b111111);
if (hour>12)
{
 hour=hour-12;
 meridian=true;
}
else
{
 meridian=false;
}

Je gère les heures supérieures à 12 car je ne travaillerai pas avec un affichage sur 24 heures.
La récupération est limitée aux heures, minutes, secondes car il n'y aura pas de gestion de la date.

Modification des données dans le DS1307:

Wire.beginTransmission(DS1307_ADDRESS);
Wire.send(0); 
Wire.send(decToBcd(second));
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour));
Wire.send(0);
Wire.endTransmission();
Là encore, seules les heures, minutes, secondes sont traitées

Réglage de l'heure:
while (digitalRead(inter_enter)==HIGH){
 if (digitalRead(inter_moins)==LOW){
  data=data-1;
  if (data>maximum){
   data=maximum;
  }
 }
 if (digitalRead(inter_plus)==LOW){
  data=data+1;
  if (data>maximum){
   data=0;
  }
 }
 if (type_data=="h"){
  hour=data;
 }
 else
 {
  minute=data;
 }
 print_serie();
 delay(900);
  
}

Tant que le bouton Enter n'est pas actionné, on checke l'état des boutons + et - pour modifier la donnée 'data'. En fonction de son type ('h' ou 'm'), on réinitialise la valeur si on dépasse le maximum autorisé (12 pour 'h', 60 pour 'm').
Le réglage des secondes n'est pas prévu: on réinitialise arbitrairement les secondes en fin de réglage.
A l'issue de chaque appui, on affiche l'heure modifie (fonction print-série)

Téléchargement du sketch complet:
Le sketch complet est téléchargeable ici. Comme les autres sketchs de ce blog, il est bien-sûr libre de modifications et de redistribution.

Conclusion
Ca marche, et tout le mérite en revient aux auteurs de bildr.org.
Je reviendrai bientôt pour une mise en oeuvre un peu plus aboutie de l'affichage (parce que sur la console de l'IDE Arduino, c'est quand même pas très bô ...), mais pour le moment, j'attends les composants ...