Vendredi, octobre 7 2011

DIY – Horloge binaire, shield arduino

Et beh, s’il y a bien un montage qui m’a fait c…. a mis du temps à être au point, c’est bien celui-là ! Souvenez-vous, la première version date de là : Horloge binaire partie 1

C’est à ce genre d’occasion qu’on se rend compte qu’entre un prototype qui fonctionne, et une version finalisée reprenant les différentes contraintes (espace disponible, coût, concommation, etc…) il y a beaucoup de travail.

L’idée est donc d’avoir un shield arduino permettant de piloter un panneau de LED de manière à afficher l’heure en binaire : La colonne de droite affiche les unités des secondes sur 4 led, la suivante les dizaines sur 3 leds, la suivante les unités des minutes, etc…
Les contraintes techniques étaient « simples » : toute l’électronique doit tenir sur la taille d’un shield pour Arduino Uno, l’affichage étant quand à lui déporté sur un autre circuit. Le montage ne doit pas consommer de manière excessive car il peut être amené à fonctionner sur pile, et l’heure ne doit pas connaitre une trop grande dérive.

Il a finalement fallu que je reparte à zero par rapport à la version précédente, le circuit étant très difficilement routable sur les dimentions d’un shield, et la dérive temps un poil trop importante au final (mais raisonnable tout de même, c’est surtout l’encombrement du circuit qui a joué).

Schema horloge binaire

Cliquer pour télécharger le schéma en PDF

La base temps à 1Hz faite par un quartz et un diviseur de fréquence a été remplacé par un MAX1302 de chez maxim, avec son quartz, ce qui fait déjà un sérieux gain de place.
L’affichage des LEDs est géré comme s’il s’agissait d’une matrice de LED, par multiplexage : un 74HC595 envoi les 8bits de chaque ligne (seuls 6 sont utilisés en réalité), le choix des lignes se fait via les 4 transistors. Les valeurs des résistances est de 220 ohms pour chaque.
Les transistors et le HC595 arrivent sur des barrettes sécables, permettant de relier le shield au panneau de LED via un cable souple de 10 fils  (14 si vous déportez les boutons de réglage en façade)

Typon horloge binaire RTC

Cliquer pour télécharger le typon en PDF

Placemen des composants

Placement des composants horloge binaire

Pour la façade, comme je l’ai dit, les LEDs seront en matrice, le schéma n’est donc pas très compliqué, et le typon non plus :

schema facade horloge binaire RTC

schema façade horloge binaire RTC

Typon facade horloge binaire RTC

Cliquer pour télécharger le typon en PDF

Pour la réalisation de la façade, seules les cathodes sont soudés au circuit, les anodes sont pliées en surface et reliées entre elles (les pistes rouges sur l’image ci-dessus)

La gestion de l’horloge et de l’affichage se fait ensuite par un petit programme arduino. Si vous regardez le code de près, vous constaterez quelques « bidouilles » logicielles pour remédier aux contraintes techniques : les colonnes ne sont pas dans l’ordre logique du 74HC595, mais inversées 2 par 2, pour des facilités de routage.

Horloge_binaire_code_source

Et voilà le résultat :

Horloge binaire : le résultat

Horloge binaire : le résultat

(La feuille est là simplement pour pouvoir prendre les LEDs en photo sans effets de halo dans l’objectif…)
Et pour ceux qui veulent un petit apperçu du fonctionnement, voici la vidéo !

Vidéo Horloge binaire

Dimanche, août 14 2011

Fabriquer un lecteur de carte MicroSD pour Arduino

Pour mon projet de datalogger, il me fallait un lecteur de cartes SD ou MicroSD. N’en ayant pas sous la main, j’en ai fabriqué un à partir d’un adaptateur SD / MicroSD. Il y a plusieurs avantages à cela:

  • l’encombrement très réduit.
  • Le coût dérisoire ( < 10 € avec la carte MicroSD ).
  • la simplicité.
Attention, la tension d’alimentation et des différents signaux est en 3.3v. Ne le branchez surtout pas sur un arduino 5V sans utiliser des résistances pour réduire la tension à 3.3v !
Le projet nécessite seulement des barettes sécables males, droites ou coudées ainsi qu’un adaptateur de cartes MicroSD.
Il suffit ensuite de souder la barettes sur les contacts cuivrés de l’adaptateur.
Voilà, votre lecteur de carte est prêt à être embarqué ! Temps de réalisation: 5 min :-)

Lundi, juillet 18 2011

Fabrication de circuit imprimé (PCB)

Et oui, ça fait partis des nouveautés : j’ai démarré une activité de fabrication de circuit imprimé ! :)
Bon, c’est pas tout a fait une vraie activité dans le sens où elle est loin de m’occuper à temps plein aujourd’hui, mais voilà, disons qu’il faut bien débuter… d’autant que d’autres surprises viendront….

Pour faire simple, si vous cherchez quelqu’un pour vous sortir quelques prototypes de PCB, je vous ai réalisé une page vous permettant de calculer les coûts et de passer commande. Il n’y a pas de minimum de commande, (ni de maximum, mais bon, pour de grosses séries, autant le dire tout de suite, ça sera moins cher en chine ;) (mais je serais plus réactif pour les délais serrés))

En espérant que ça vous plaira : Fabrication PCB

Samedi, juillet 16 2011

Projet DataLogger pour vélo

Encore un projet dans les cartons. Concevoir un petit enregistreur me permettant de stocker sur une carte SD plusieurs paramètres lorsque je fais des sorties à vélo. Je souhaiterai enregistrer:

  • La date / heure
  • La position GPS
  • La vitesse
  • Le cap
  • la cadence de pédalage
  • l’accélération X Y et Z
  • la température
  • Le rythme cardiaque
L’ensemble des données sont récupérées / calculées par un Atmega 328 embarquant du code Arduino. Les données sont ensuite enregistrées sur carte SD et présentées en temps réel sur l’écran.

Voilà un schéma de principe du système. 

Mercredi, mai 11 2011

Arduino – Un petit SpaceInvader

Hier j’ai reçu un petit shield LCD couleur pour mon Arduino que j’avais commandé. Il s’agit d’un modèle avec un écran nokia de 128x128pixels, et 3 boutons en façade.

Shield LCD pour Arduino

Shield LCD pour Arduino

Comme je suis quelqu’un d’assez impatient, j’ai voulu tester au plus vite ce petit joujou :) . Déjà, point assez agréable, quelqu’un a déjà fourni un travail remarquable et une librairie toute prête permet d’effectuer les affichages de base (pixel, ligne, rectangle, texte, etc…). Vous pourrez la trouver ici.

Mes premières impressions tout d’abord : bah ça reste un écran d’ancienne génération de téléphone portable, avec les défauts qui vont avec : très mauvais rendu des couleurs, angle de vision particulièrement limité, et vitesse…. euhhhh…. lente ;)
Mais bon, pour le prix, ça reste un petit affichage tout à fait correct, et on arrive a faire des petites choses marrantes avec.
Le positionnement des boutons m’as fait penser à une manette de jeux, avec gauche/droite et tir…. ce qui m’a donné envie d’essayer de faire un petit space invader, histoire de voire quelles performances je pouvais tirer d’un arduino pour ce type d’applications.
Au passage, un grand merci à Julien qui m’a permis d’améliorer ma compréhension de la programmation objet, et grâce à qui le code fourni est un peu plus propre ;) (J’ai pas encore tout nettoyé, mais promis la v2 sera plus propre ;) )

Space invader sur arduino

Space invader sur arduino

Le jeu est jouable, aves les ennemis qui bougent et la détection des collisions qui est fonctionnelle. Par contre il manque l’affichage des scores et quelques détails….
A priori, l’arduino arrive à gérér ça sans trop ramer, ce qui permet d’envisager quelques petites améliorations.

Le code source du projet

Ps : le code source est libre (domaine public)

Arduino – Un petit SpaceInvader

Hier j’ai reçu un petit shield LCD couleur pour mon Arduino que j’avais commandé. Il s’agit d’un modèle avec un écran nokia de 128x128pixels, et 3 boutons en façade.

Shield LCD pour Arduino

Shield LCD pour Arduino

Comme je suis quelqu’un d’assez impatient, j’ai voulu tester au plus vite ce petit joujou :) . Déjà, point assez agréable, quelqu’un a déjà fourni un travail remarquable et une librairie toute prête permet d’effectuer les affichages de base (pixel, ligne, rectangle, texte, etc…). Vous pourrez la trouver ici.

Mes premières impressions tout d’abord : bah ça reste un écran d’ancienne génération de téléphone portable, avec les défauts qui vont avec : très mauvais rendu des couleurs, angle de vision particulièrement limité, et vitesse…. euhhhh…. lente ;)
Mais bon, pour le prix, ça reste un petit affichage tout à fait correct, et on arrive a faire des petites choses marrantes avec.
Le positionnement des boutons m’as fait penser à une manette de jeux, avec gauche/droite et tir…. ce qui m’a donné envie d’essayer de faire un petit space invader, histoire de voire quelles performances je pouvais tirer d’un arduino pour ce type d’applications.
Au passage, un grand merci à Julien qui m’a permis d’améliorer ma compréhension de la programmation objet, et grâce à qui le code fourni est un peu plus propre ;) (J’ai pas encore tout nettoyé, mais promis la v2 sera plus propre ;) )

Space invader sur arduino

Space invader sur arduino

Le jeu est jouable, aves les ennemis qui bougent et la détection des collisions qui est fonctionnelle. Par contre il manque l’affichage des scores et quelques détails….
A priori, l’arduino arrive à gérér ça sans trop ramer, ce qui permet d’envisager quelques petites améliorations.

Le code source du projet

Ps : le code source est libre (domaine public)

Dimanche, mai 8 2011

Arduino – Horloge binaire DIY – Part 1

Oui, je sais, ça faisait longtemps que je n’avais pas présenté de schéma. Et pour cause : je me bat avec celui-ci depuis presque 1 mois ! Au point que j’ai décidé de vous le publier en 2 parties ;)
Rassurez vous, la partie que je vais vous présenter est tout à fait fonctionnelle, mais je voulais vous présenter un joli projet fini, sous la forme d’un shield Arduino, (et éventuellement vous proposer un kit), mais je galère pas mal avec les prototypes…. (encore une fois, je me rend compte qu’il ne faut pas négliger les caractéristiques physiques des composants ;) )

Bref, voici donc une horloge à LED binaire fonctionnant avec un arduino

Horloge binaire - prototype

Horloge binaire - prototype

Pour ceux qui ne connaissent pas les horloges binaires, il s’agit de représenter les heures – minutes – secondes sous leurs équivalents en binaire, ce qui permet d’afficher l’heure grace à une rangée de LED.  Concernant l’affichage, il y a deux écoles : soit on affiche directement la conversion binaire pour chaque membre de l’heure, par exemple pour 10:00:45, on afficherais 101101 (soit 45 en binaire) pour les secondes, soit on décompose pour chaque membre les dizaines des unités, ce qui donnerais pour l’exemple précédent 100 et 101 (soit respectivement 4 et 5). C’est cette dernière méthode que j’ai choisi car elle permet de lire l’heure un peu plus simplement.

Je voulais une horloge relativement fiable, je ne me suis donc pas basé sur l’horloge interne de l’arduino, mais plutôt sur une base de temps externe à 1Hz, à base de quartz d’horlogerie.

Schéma horloge binaire

Schéma horloge binaire

R1 = 1Mo
R2 = 220Ko
C1 et c2 = 39pf
C3 = 100pf
Q1 = 32,768 KHz

Voici pour la partie matérielle, je vous met également les sources de mon code Arduino :

Code source horloge binaire

/*
Horloge binaire
Utilise 3 74HC595 pour gérer l’affichage Heure minutes secondes
On gère l’affichage sur colonnes separees pour les dizaines et les unites, afin de faciliter la lecture
*/ 

//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 12;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 11;

//Pin recevant les ticks d’horloge (1Hz)
const int Clock = 3;

//Pin boutton poussoir reglage heure
const int BouttonH = 7;
const int BouttonM = 6;

//const int MULTIPLEX = 5; //delai de boucle pour le multiplexage en milliseconde
const int MULTIPLEX = 200;
// On garde l’état précédent de la clock : S’il était à 0 et que la clock est à 1, on est sur un nouveau top, sinon, c’est toujours le même top.
int last_state = 0;
int cur_state = 0; //l’etat actuel de la Clock
int demisec = 0;
int increment = 0; //s’il faut incrémenter le compteur, increment vaut 1.

//On gère les dizaines et les unités séparement car elles ne font pas parties de la meme colonne d’affichage.
int HeureD = 0;
int HeureU = 0;
int MinuteD = 0;
int MinuteU = 0;
int SecondeD = 0;
int SecondeU = 0;

//Variables pour les conversion binaires
int bSecondeD = 0;
int bSeconde = 0;
int bMinuteD = 0;
int bMinute = 0;
int bHeureD = 0;
int bHeure = 0;

//Variables d’etat des boutons
int sBouttonH = 1; //etat du boutton de reglage heure (1 = relache)
int clkBouttonH = 0; //on memorise depuis combien de top est appuyé le bouton
int sBouttonM = 1;
int clkBouttonM = 0;

//variable pour le multiplexage :
// on n’eclaire pas toutes les leds en meme temps, on le fait bloc par blog (HH, puis MM, puis SS)
int multiplex = 0;

//Variable de debug : Si debug = 1, alors on active le port serie.
int debug = 1;

void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(Clock, INPUT);
pinMode(BouttonH, INPUT);
if(debug == 1)
Serial.begin(9600);
last_state = digitalRead(Clock);
}

void loop() {

// est-on sur un nouveau top ?
cur_state = digitalRead(Clock);

//est-ce qu’un boutton est appuyé ?
sBouttonH = digitalRead(BouttonH);
if(sBouttonH == 1)//si le boutton H a ete relache, on remet tout a 0
clkBouttonH = 0;
sBouttonM = digitalRead(BouttonM);
if(sBouttonM == 1)//si le boutton M a ete relache, on remet tout a 0
clkBouttonM = 0;

if(debug == 1)
Serial.println(« debut top »);

if((cur_state == 1) && (last_state == 0)) // Si l’horloge viens de passer à 1, on est sur un top
demisec = demisec++;
if(demisec > 1)
//On a besoin de 2 tops pour une seconde
{
increment = 1; // on va donc pouvoir incrementer le compteur
last_state = cur_state; //on met à jour last_state
//Et on en profite pour vérifier depuis combien de temps le bouton est appuyé
if(sBouttonH == 0)
{
clkBouttonH = clkBouttonH++;
//si Le bouton était déjà appuyé la seconde precedente, alors on incremente.
if(clkBouttonH > 2)
{
//on incremente l’heure
if(HeureU < 11)
HeureU = HeureU++;
if(HeureU == 4 && HeureD == 2) //minuit, on remet tout à 0
{
HeureU = 0;
HeureD = 0;
}
else if(HeureU == 10)
{
HeureD = HeureD++;
HeureU = 0;
}
}
}
//idem pour les minutes
if(sBouttonM == 0)
{
clkBouttonM = clkBouttonM++;
//si Le bouton était déjà appuyé la seconde precedente, alors on incremente.
if(clkBouttonM > 2)
{
//on incremente les minutes
if(MinuteU < 11)
MinuteU = MinuteU ++;
if(MinuteU == 10)
{
MinuteD = MinuteD++;
MinuteU = 0;
}
if(MinuteD == 6) //on ne depasse pas les 60 minutes…
{
MinuteD = 0;
}
}
}

}
else
{
last_state = cur_state; //sinon, on se contente de rafraichir last_state
}

/// Si on doit incrémenter l’horloge :
if(increment == 1)
{

if(SecondeU < 11)
SecondeU = SecondeU ++;
if(SecondeU == 10)
{
SecondeD = SecondeD++;
SecondeU = 0;
}
if(SecondeD == 6)
{
SecondeD = 0; //on remet le compteur des secondes à 0;
if(MinuteU < 11)
MinuteU = MinuteU ++;
if(MinuteU == 10)
{
MinuteD = MinuteD++;
MinuteU = 0;
}

if(MinuteD == 6)
{
MinuteD = 0;
if(HeureU < 11)
HeureU = HeureU++;
if(HeureU == 4 && HeureD == 2) //minuit, on remet tout à 0
{
HeureU = 0;
HeureD = 0;
}
else if(HeureU == 10)
{
HeureD = HeureD++;
HeureU = 0;
}
}

}
//on a finit d’incrementer, on repasse donc le flag increment à 0
increment = 0;
//On repasse demisec = 0
demisec = 0;
//on met à jour l’affichage
if(debug == 1)
{
Serial.print(HeureD);
Serial.print(HeureU);
Serial.print(« : »);
Serial.print(MinuteD);
Serial.print(MinuteU);
Serial.print(« : »);
Serial.print(SecondeD);
Serial.println(SecondeU);
}

//on convertis l’affichage en binaire , de maniere a ce que les dizaines et unites tiennent sur 1 octet
bSecondeD = SecondeD << 4; //decalage a gauche de 4 bit pour les dizaines
bSeconde = bSecondeD | SecondeU;  //OU logique pour « assembler » les dizaines et les unites
bMinuteD = MinuteD << 4;
bMinute = bMinuteD | MinuteU;
bHeureD = HeureD << 4;
bHeure = bHeureD | HeureU;
if(debug == 1)
{
Serial.print(« Binaire Heures:Minutes:Secondes  « );
Serial.print(bHeure,BIN);
Serial.print(« : »);
Serial.print(bMinute,BIN);
Serial.print(« : »);
Serial.println(bSeconde,BIN);
Serial.print(« Etat du bouton Heures : »);
Serial.println(sBouttonH);
Serial.print(« Etat du bouton Minutes : »);
Serial.println(sBouttonM);
}
}
////on envoie l’heure sur le 74HC595
digitalWrite(latchPin, LOW);
//on multiplexe l’affichage

if(multiplex == 0)
{
shiftOut(dataPin, clockPin, MSBFIRST, bHeure);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les secondes
}
if(multiplex == 1)
{
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, bMinute);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les secondes
}
if(multiplex == 2)
{
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, bSeconde);//on envoie les secondes
}
multiplex = multiplex++;
if(multiplex>2)
multiplex = 0;
/*
// shift the bytes out:
shiftOut(dataPin, clockPin, MSBFIRST, bHeure);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, bMinute);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, bSeconde);//on envoie les secondes
*/
digitalWrite(latchPin, HIGH);
if(debug == 1)
{

Serial.print(« multiplex : « );
Serial.println(multiplex);
}

//on attend quelques millisecondes, pour pas saturer l’arduino (surtout utile en cas d’utilisation du port serie)
delay(MULTIPLEX);

}

Arduino – Horloge binaire DIY – Part 1

Oui, je sais, ça faisait longtemps que je n’avais pas présenté de schéma. Et pour cause : je me bat avec celui-ci depuis presque 1 mois ! Au point que j’ai décidé de vous le publier en 2 parties ;)
Rassurez vous, la partie que je vais vous présenter est tout à fait fonctionnelle, mais je voulais vous présenter un joli projet fini, sous la forme d’un shield Arduino, (et éventuellement vous proposer un kit), mais je galère pas mal avec les prototypes…. (encore une fois, je me rend compte qu’il ne faut pas négliger les caractéristiques physiques des composants ;) )

Bref, voici donc une horloge à LED binaire fonctionnant avec un arduino

Horloge binaire - prototype

Horloge binaire - prototype

Pour ceux qui ne connaissent pas les horloges binaires, il s’agit de représenter les heures – minutes – secondes sous leurs équivalents en binaire, ce qui permet d’afficher l’heure grace à une rangée de LED.  Concernant l’affichage, il y a deux écoles : soit on affiche directement la conversion binaire pour chaque membre de l’heure, par exemple pour 10:00:45, on afficherais 101101 (soit 45 en binaire) pour les secondes, soit on décompose pour chaque membre les dizaines des unités, ce qui donnerais pour l’exemple précédent 100 et 101 (soit respectivement 4 et 5). C’est cette dernière méthode que j’ai choisi car elle permet de lire l’heure un peu plus simplement.

Je voulais une horloge relativement fiable, je ne me suis donc pas basé sur l’horloge interne de l’arduino, mais plutôt sur une base de temps externe à 1Hz, à base de quartz d’horlogerie.

Schéma horloge binaire

Schéma horloge binaire

R1 = 1Mo
R2 = 220Ko
C1 et c2 = 39pf
C3 = 100pf
Q1 = 32,768 KHz

Voici pour la partie matérielle, je vous met également les sources de mon code Arduino :

Code source horloge binaire

/*
Horloge binaire
Utilise 3 74HC595 pour gérer l’affichage Heure minutes secondes
On gère l’affichage sur colonnes separees pour les dizaines et les unites, afin de faciliter la lecture
*/ 

//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 12;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 11;

//Pin recevant les ticks d’horloge (1Hz)
const int Clock = 3;

//Pin boutton poussoir reglage heure
const int BouttonH = 7;
const int BouttonM = 6;

//const int MULTIPLEX = 5; //delai de boucle pour le multiplexage en milliseconde
const int MULTIPLEX = 200;
// On garde l’état précédent de la clock : S’il était à 0 et que la clock est à 1, on est sur un nouveau top, sinon, c’est toujours le même top.
int last_state = 0;
int cur_state = 0; //l’etat actuel de la Clock
int demisec = 0;
int increment = 0; //s’il faut incrémenter le compteur, increment vaut 1.

//On gère les dizaines et les unités séparement car elles ne font pas parties de la meme colonne d’affichage.
int HeureD = 0;
int HeureU = 0;
int MinuteD = 0;
int MinuteU = 0;
int SecondeD = 0;
int SecondeU = 0;

//Variables pour les conversion binaires
int bSecondeD = 0;
int bSeconde = 0;
int bMinuteD = 0;
int bMinute = 0;
int bHeureD = 0;
int bHeure = 0;

//Variables d’etat des boutons
int sBouttonH = 1; //etat du boutton de reglage heure (1 = relache)
int clkBouttonH = 0; //on memorise depuis combien de top est appuyé le bouton
int sBouttonM = 1;
int clkBouttonM = 0;

//variable pour le multiplexage :
// on n’eclaire pas toutes les leds en meme temps, on le fait bloc par blog (HH, puis MM, puis SS)
int multiplex = 0;

//Variable de debug : Si debug = 1, alors on active le port serie.
int debug = 1;

void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(Clock, INPUT);
pinMode(BouttonH, INPUT);
if(debug == 1)
Serial.begin(9600);
last_state = digitalRead(Clock);
}

void loop() {

// est-on sur un nouveau top ?
cur_state = digitalRead(Clock);

//est-ce qu’un boutton est appuyé ?
sBouttonH = digitalRead(BouttonH);
if(sBouttonH == 1)//si le boutton H a ete relache, on remet tout a 0
clkBouttonH = 0;
sBouttonM = digitalRead(BouttonM);
if(sBouttonM == 1)//si le boutton M a ete relache, on remet tout a 0
clkBouttonM = 0;

if(debug == 1)
Serial.println(« debut top »);

if((cur_state == 1) && (last_state == 0)) // Si l’horloge viens de passer à 1, on est sur un top
demisec = demisec++;
if(demisec > 1)
//On a besoin de 2 tops pour une seconde
{
increment = 1; // on va donc pouvoir incrementer le compteur
last_state = cur_state; //on met à jour last_state
//Et on en profite pour vérifier depuis combien de temps le bouton est appuyé
if(sBouttonH == 0)
{
clkBouttonH = clkBouttonH++;
//si Le bouton était déjà appuyé la seconde precedente, alors on incremente.
if(clkBouttonH > 2)
{
//on incremente l’heure
if(HeureU < 11)
HeureU = HeureU++;
if(HeureU == 4 && HeureD == 2) //minuit, on remet tout à 0
{
HeureU = 0;
HeureD = 0;
}
else if(HeureU == 10)
{
HeureD = HeureD++;
HeureU = 0;
}
}
}
//idem pour les minutes
if(sBouttonM == 0)
{
clkBouttonM = clkBouttonM++;
//si Le bouton était déjà appuyé la seconde precedente, alors on incremente.
if(clkBouttonM > 2)
{
//on incremente les minutes
if(MinuteU < 11)
MinuteU = MinuteU ++;
if(MinuteU == 10)
{
MinuteD = MinuteD++;
MinuteU = 0;
}
if(MinuteD == 6) //on ne depasse pas les 60 minutes…
{
MinuteD = 0;
}
}
}

}
else
{
last_state = cur_state; //sinon, on se contente de rafraichir last_state
}

/// Si on doit incrémenter l’horloge :
if(increment == 1)
{

if(SecondeU < 11)
SecondeU = SecondeU ++;
if(SecondeU == 10)
{
SecondeD = SecondeD++;
SecondeU = 0;
}
if(SecondeD == 6)
{
SecondeD = 0; //on remet le compteur des secondes à 0;
if(MinuteU < 11)
MinuteU = MinuteU ++;
if(MinuteU == 10)
{
MinuteD = MinuteD++;
MinuteU = 0;
}

if(MinuteD == 6)
{
MinuteD = 0;
if(HeureU < 11)
HeureU = HeureU++;
if(HeureU == 4 && HeureD == 2) //minuit, on remet tout à 0
{
HeureU = 0;
HeureD = 0;
}
else if(HeureU == 10)
{
HeureD = HeureD++;
HeureU = 0;
}
}

}
//on a finit d’incrementer, on repasse donc le flag increment à 0
increment = 0;
//On repasse demisec = 0
demisec = 0;
//on met à jour l’affichage
if(debug == 1)
{
Serial.print(HeureD);
Serial.print(HeureU);
Serial.print(« : »);
Serial.print(MinuteD);
Serial.print(MinuteU);
Serial.print(« : »);
Serial.print(SecondeD);
Serial.println(SecondeU);
}

//on convertis l’affichage en binaire , de maniere a ce que les dizaines et unites tiennent sur 1 octet
bSecondeD = SecondeD << 4; //decalage a gauche de 4 bit pour les dizaines
bSeconde = bSecondeD | SecondeU;  //OU logique pour « assembler » les dizaines et les unites
bMinuteD = MinuteD << 4;
bMinute = bMinuteD | MinuteU;
bHeureD = HeureD << 4;
bHeure = bHeureD | HeureU;
if(debug == 1)
{
Serial.print(« Binaire Heures:Minutes:Secondes  « );
Serial.print(bHeure,BIN);
Serial.print(« : »);
Serial.print(bMinute,BIN);
Serial.print(« : »);
Serial.println(bSeconde,BIN);
Serial.print(« Etat du bouton Heures : »);
Serial.println(sBouttonH);
Serial.print(« Etat du bouton Minutes : »);
Serial.println(sBouttonM);
}
}
////on envoie l’heure sur le 74HC595
digitalWrite(latchPin, LOW);
//on multiplexe l’affichage

if(multiplex == 0)
{
shiftOut(dataPin, clockPin, MSBFIRST, bHeure);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les secondes
}
if(multiplex == 1)
{
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, bMinute);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les secondes
}
if(multiplex == 2)
{
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, 0);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, bSeconde);//on envoie les secondes
}
multiplex = multiplex++;
if(multiplex>2)
multiplex = 0;
/*
// shift the bytes out:
shiftOut(dataPin, clockPin, MSBFIRST, bHeure);//on envoie les heures
shiftOut(dataPin, clockPin, MSBFIRST, bMinute);//on envoie les minutes
shiftOut(dataPin, clockPin, MSBFIRST, bSeconde);//on envoie les secondes
*/
digitalWrite(latchPin, HIGH);
if(debug == 1)
{

Serial.print(« multiplex : « );
Serial.println(multiplex);
}

//on attend quelques millisecondes, pour pas saturer l’arduino (surtout utile en cas d’utilisation du port serie)
delay(MULTIPLEX);

}

- page 1 de 3