Horloge Réveil-Matin (Partie I)

L'objet de cet article est de présenter la réalisation d'une horloge réveil matin basée sur un Arduino-Uno. Plusieurs aspects de ce projet seront traités, notamment le choix des composants, le câblages et la programmation objet en C++.

Cahier des charges

Dans ce projet, il s'agit de construire un réveil-matin.
Ce réveil matin est doté d'un écran LCD pour afficher l'heure. Un potentiomètre permet d'en régler le contraste.
Trois boutons poussoir permettent de procéder aux différents réglages selon les fonctionnalités suivante :
  • Le premier bouton (bouton de commande) permet de gérer le modes de l'horloge. Il existe trois mode de fonctionnement :
    • Le mode normal : l'heure est affichée au format HH:MN:SS.
    • Le mode de mise à l'heure : la valeur de l'heure est figée à l'heure en cours, au format HH:MN pour le réglage des heures et des minutes.
    • Le mode de réglage de l'alarme : la valeur de l'heure de déclenchement de l'alarme est affichée au format HH:MN pour le réglage.
  • Le second bouton, situé à gauche de l'écran, permet de décrémenter une valeur.
  • Le troisième bouton, situé à droite de l'écran, permet d'incrémenter une valeur.
Pour chaque mode, le fonctionnement des bouton est le suivant :
  • En mode normal :
    • Une pression brève du bouton de commande permet de faire défiler les modes.
    • Une pression longue (> 1s) du bouton de commande permet de valider le mode affiché. L'horloge change alors de mode.
    • Les deux autres boutons de réglage sont inopérants.
  • En mode de réglage de l'heure :
    • Une pression brève du bouton de commande permet de passer du réglage des heures au réglage des minutes et alternativement. La valeur en cours de réglage est signalée sur l'écran LCD par le clignotement respectivement des minutes ou de l'heure affichée.
    • Une pression sur le bouton de réglage, situé à gauche de l'écran LCD, décrémente la valeur des heures ou des minutes en cours de réglage.
    • Une pression sur le bouton de réglage, situé à droite de l'écran LCD, incrémente la valeur des heures ou des minutes en cours de réglage.
    • Une pression longue (> 1s) du bouton de commande permet de valider la valeur du réglage. L'heure modifiée est alors affichée et l'horloge repasse en mode normal.
  • En mode de réglage de l'alarme :
    • Une pression brève du bouton de commande permet de passer du réglage des heures au réglage des minutes et alternativement pour l'heure de déclenchement de l'alarme. La valeur en cours de réglage est signalée sur l'écran LCD par le clignotement respectivement des minutes ou de l'heure affichée.
    • Une pression sur le bouton de réglage, situé à gauche de l'écran LCD, décrémente la valeur des heures ou des minutes en cours de réglage.
    • Une pression sur le bouton de réglage, situé à droite de l'écran LCD, incrémente la valeur des heures ou des minutes en cours de réglage.
    • Une pression longue (> 1s) du bouton de commande permet de valider la valeur du réglage. L'heure de déclenchement de l'alarme est enregistrée et l'horloge repasse en mode normal.
L'alarme est activée par une pression longue du bouton de commande lorsque l'heure est affichée en mode normal. Une petite cloche s'affiche alors à droite de l'écran LCD pour indiquer que l'alarme est activée. L'alarme peut être désactivée aussi par une pression longue du même bouton lorsque l'alarme est activée.
L'alarme sonore se déclenche lorsque que l'heure courante est égale à l'heure de déclenchement. Pour arrêter le signal sonore, une pression brève de n'importe quel bouton est nécessaire.

Logique de fonctionnement

Le cahier des charges décrit ci-dessus peut paraître complexe à mettre en oeuvre. Cependant, on peut en simplifier la représentation sous la forme d'un automate à états finis dont le graphe est présenté ci-dessous :

Evénements de l'automate

Les événements de l'automate, représentés par des cercles roses dans le graphe ci-dessus, sont déclenchés dans la boucle loop() de l'Arduino en fonctions des valeurs lues sur les différents composants. Il sont au nombre de cinq&nbsp:
  1. Pression brève sur le bouton de commande.
  2. Pression longue (> 1s) sur le bouton de commande.
  3. Pression sur le bouton de décrémentation.
  4. Pression sur le bouton d'incrémentation.
  5. La valeur SS (dans HH:MN:SS) a changé.

Les états de l'automate

Les états de l'automate, représentés par des patatoïde bleu dans le graphe ci-dessous, définissent les données à afficher et le type d'affichage utilisé. Ils correspondent aux états de l'horloge définis dans le cahier des charges. Ils sont au nombre de huit :
  1. Affichage de l'heure (mode normal). L'affichage est au format HH:MN:SS. Il change toutes les secondes.
  2. Mise à l'heure. L'écran LCD affiche la mention « Réglage de l'heure » et l'heure figée au format HH:MN.
  3. Réglage Alarme. L'écran LCD affiche la mention « Réglage Alarme » et l'heure de déclenchement est affichée au format HH:MN.
  4. Réglage HH. L'écran LCD affiche la mention « Réglage de l'heure » et l'heure figée au format HH:MN. HH clignote.
  5. Réglage MN. L'écran LCD affiche la mention « Réglage de l'heure » et l'heure figée au format HH:MN. MN clignote.
  6. Réglage HH. L'écran LCD affiche la mention « Réglage Alarme » et l'heure de déclenchement au format HH:MN. HH clignote.
  7. Réglage MN. L'écran LCD affiche la mention « Réglage Alarme » et l'heure de déclenchement au format HH:MN. MN clignote.
  8. Alarme déclenchée. L'écran LCD affiche l'heure en cours au format HH:MN:SS, comme pour l'état 1. Mais HH:MN:SS clignote. En outre, un signal est émis par le dispositif sonore (un buzzer passif dans le modèle présenté).

Actions de l'automate

Chaque événement déclenche une action (symbolisée par une flèche) dont l'effet principal est un changement d'état de l'automate. Pour certains événements, il se peut que l'état suivant diffère en fonction des données. Par exemple, dans le cas de l'événement E sur l'état Affichage de l'heure, l'état suivant peut être changé, lorsque l'heure courante est égale à l'heure de déclenchement de l'alarme pour activer celle-ci. Les actions de l'automate sont énumérées dans le tableau ci-dessous en fonction de l'état et de l'événement survenu :


EtatEvénementActionEtat suivant
1
Affichage
de l'heure
Rien
2
Activation/Désactivation de l'alarme
1
Incrémentation de l'heure courante.
1
Si heure courante = heure alarme
Déclenchement de l'alarme
8
2
Mise à l'heure
Rien
3
Rien
4
3
Réglage
Alarme
Rien
1
Rien
6
4
Réglage HH
Rien
5
Enregistrement de HH:MN
1
Décrémentation de HH
4
Incrémentation de HH
4
5
Réglage MN
Rien
4
Enregistrement de HH:MN
1
Décrémentation de MN
5
Incrémentation de MN
5
6
Réglage HH
Rien
7
Enregistrement Alarme HH:MN
1
Décrémentation Alarme HH
6
Incrémentation Alarme HH
6
7
Réglage MN
Rien
6
Enregistrement Alarme HH:MN
1
Décrémentation Alarme MN
7
Incrémentation Alarme MN
7
8
Alarme
Déclenchée
Arrêt de l'alarme
1
Incrémentation de l'heure courante
8

Il est à signaler ici une distinction sémantique importante concernant le fonctionnement de l'alarme.
L'alarme est activée ou désactivée par une pression longue du bouton de commande dans l'état normal (événement B dans l'état 1). Mais, à ce moment, aucun signal n'est émis par le dispositif sonore.
L'alarme est déclenchée dans l'état normal lorsque l'heure courante est égale à l'heure de déclenchement de l'alarme (événement E dans l'état 1, si la condition d'égalité est satisfaite) si l'alarme a été activée auparavant. A ce moment là, le signal sonore est émis. Il peut être arrêté par une pression de n'importe quel bouton, sans pour autant désactiver l'alarme.

Conclusion

Ainsi se termine le présent article. Cependant le travail est loin d'être terminé. Et l'achèvement du projet va nécessiter encore plusieurs articles :
  • L'article suivant traitera de la partie électronique de l'horloge, notamment du câblage et de la nomenclature du projet.
  • Un article sera consacré à la prise en charge en C++ d'un bouton poussoir. La classe crée sera capable d'émettre les événements nécessaires au projet en distinguant la pression courte de la pression longue.
  • Un article présentera la programmation de l'horloge en C++.
  • Un article sera consacré à la prise en charge de l'affichage de l'horloge. Une abstraction de l'affichage sera présentée ainsi que des déclinaisons pour différents systèmes d'affichage : Série, LCD ou LED.
  • Dans un même ordre d'idée, un autre article proposera une abstraction pour la prise en charge de l'alarme sonore. Abstraction qui sera déclinée pour un buzzer passif.
  • La série d'article sera conclue avec l'utilisation d'un écran LCD comme prévu dans le cahier des charges.

Commentaires

Posts les plus consultés de ce blog

Afficheur à LED 7 segments (classe SegmentLedDisplay)

Piloter un clavier matriciel sur le bus I2C avec un PCF8574

Utiliser Visual Studio Code pour développer sur Arduino