TEMPVS FVGIT
publication: 18 décembre 2023 / mis à jour 18 décembre 2023
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Et si les romains avaient pu programmer l’affichage de l’heure sous forme numérique?
Voilà un projet intéressant qui combine plusieurs fichiers. Dans ce chapitre, nous n’allons pas donner l’intégralité du code utilisé ici. Ce serait trop long.
Les codes sources de ce chapitre sont disponibles ici:
https://github.com/MPETREMANN11/ESP32forth/tree/main/__my%20projects/display/OLED%20SSD1306%20128x32/TEMPVS%20FVGIT
L’ensemble du projet contient ces fichiers:
- autoexec.fs contenu chargé au démarrage de ESP32forth
- clepsydra.fs conversion nombres en chiffres romains
- config.fs paramètres de configuration globale
- main.fs fichier principal chargeant les autres fichiers du projet
- oledTools.fs complète le vocabulaire oled
- RTClock.fs gère l’horloge temps réel
- strings.fs gère le traitement des chaînes alphanumériques
L’enchaînement du chargement des fichiers du projet est écrit dans main.fs:
s" /spiffs/strings.fs" included s" /spiffs/RTClock.fs" included s" /spiffs/clepsydra.fs" included s" /spiffs/config.fs" included s" /spiffs/oledTools.fs" included
La plupart des fichiers de ce projet sont indépendants, à l’exception de clepsydra.fs qui est dépendant de strings.fs.
Romani non ustulo nulla
Les romains ne connaissaient pas le chiffre 0. Alors comment peut-on afficher 13:00 ou 00:15 en chiffres romains?
Pour résoudre le problème des heures après minuit, par exemple 00:15, les japonais (habitants du JAPON) vont nous être d'une grande aide. Si un jour vous allez dans ce pays, vous serez étonné de voir des boutiques ouvertes jusqu'à 25:00!
Cette boutique est ouverte de 09:00 à 25:00! Hé oui. Pourtant, les horloges du JAPON font aussi 24 heures. On savait les japonais travailleurs, mais au point de faire des journées de 25 heures, on a le droit d’avoir quelques doutes...
En fait, il y a une explication très logique. Après 12:00, il est 12:01, etc... Et donc, après 23:59, il est 24:00, puis 24:01. Donc, si une boutique ferme à 25:00, il faut comprendre qu'elle ferme à 01:00 pour nous.
Si on transpose ceci sur notre horloge romaine, quand il sera 00:00, on pourra afficher XXIV ou mieux XXIII:LX (23:60).
Romani horas et minuta2
Pour résoudre le cas des heures comme 01:00, 02:00... 23:00, en toute logique, après 12:59, on peut très bien afficher 12:60, puis la minute d'après 13:01... 12:60 en chiffres romains: XXII:LX.
C’est ce qui est réalisé dans le mot tempusTo$
:
: tempusTo$ { HH MM -- }
HH 0 = MM 0= AND if
60 to MM
23 to HH
THEN
HH 0 > MM 0= AND if
60 to MM
-1 +to HH
then
HH 0 <= if
24 to HH
then
HH roman tempus $!
[char] : tempus c+$! \ add char :
MM roman tempus append$
tempus
;
Dans le premier test if..then, on teste si on est à 00:00. Dans ce cas, on force l’heure à 23 et les minutes à 60.
Dans le second test, si l’heure est supérieure à 00 et les minutes à 00, on décrémente l’heure et on force les minutes à 60. L’inconvénient est que si l’heure est à 00, on la fait passer à -1.
Dans le dernier test, si l’heure est nulle ou négative, on la force à 24.
On peut utiliser le mot .tempus
qui a servi à la mise au point pour vérifier
ce bon fonctionnement:
--> 23 59 .tempus XXIII:LIX ok --> 0 0 .tempus XXIII:LX ok --> 0 1 .tempus XXIV:I ok --> 1 0 .tempus XXIV:LX ok --> 1 1 .tempus I:I ok
Haec omnia integramus pro ESP32forth3
En l’état du projet, on doit entrer manuellement l’heure initiale:
22 19 start
Signifie qu’on initialise l’heure à 22:19. Cette initialisation s’effectue très simplement:
0 RTC.setTime
Ensuite on initialise l’afficheur OLED 128x32:
Oled128x32Init 1 OledTextsize WHITE OledTextc
Et pour finir, on va récupérer l’heure courante et l’afficher:
OledCLS OledDisplay 16 20 OledSetCursor RTC.getTime drop tempusTo$ s>z OledPrintln OledDisplay
J’ai fait des tests avec un affichage plus grand. Le problème, pour la chaîne XXIII:XXVIII, il n’y a pas assez de place pour afficher cette chaîne.
Voici la boucle finale à exécuter pour lancer l’affichage de l’heure en chiffres romains:
oled : start ( HH MM -- ) 0 RTC.setTime \ define current time Oled128x32Init 1 OledTextsize WHITE OledTextc begin OledCLS OledDisplay 16 20 OledSetCursor RTC.getTime drop tempusTo$ s>z OledPrintln OledDisplay 1000 ms key? until ; forth
Le programme peut être amélioré en récupérant l’heure depuis un serveur de temps. Voir chapitre Récupérer l'heure depuis un serveur WEB.
Il est également possible d’utiliser les fonctions de timers pour libérer l’interpréteur. Voir chapitre Clignotement d'une LED par timer.
Pour terminer, l’assemblage des différents fichiers de ce projet et les quelques tests et aménagements m’ont occupé une après-midi.
Je tiens cependant à insister sur quelques points:
- faites toujours une copie dans le dossier de votre projet d’un fichier à usage général. Par exemple, pour le fichier strings.fs;
- si vous copiez un composant général, par exemple strings.fs ou RTClock.fs, ne faites des modifications que sur ces fichiers copiés dans le dossier de votre projet. Versionnez ces modifications et indiquez la date de modification dans le commentaire de tête du fichier modifié.
Au fil de vos projets, il est possible que vous vous retrouviez avec un même fichier copié dans différents dossiers et modifié. Cette solution est préférable à celle d’un fichier unique rempli de paramètres d’ajustement.
Legal: site web personnel sans commerce / personal site without seling