Autres articles / Other articles

TEMPVS FVGIT

publication: 18 décembre 2023 / mis à jour 18 décembre 2023

Read this page in english

 

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:

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:

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