18) Expérimentation d’un afficheur graphique monochrome.

C’était promis en Page 8 de ce didacticiel, cette saga devait se terminer par une version n°5 qui intègrerait un afficheur de type graphique. Les références sont kyrielles, avec des dimensions et des caractéristiques très différentes d’un modèle à l’autre. Leurs prix d’achat aussi incitent à éliminer ceux qui sont en couleur, les grandes définitions, les écrans tactiles etc. Le choix pour cette application s’est porté sur l’écran OLED de la Fig.87 monochrome blanc ou bleu pilotable par I2C de définition 128 x 64 Pixels de 1,3 Pouces. Seulement quatre broches de pilotage sont nécessaires pour le gérer. Muni d’un contrôleur SSD1306 ils sont lumineux, donc sans rétro-éclairage, de couleur blanche ou bleue selon la référence approvisionnée. (REMARQUE : Il existe en 0,96 pouces de diagonale. C’est bien celui qui fait 1,3 pouces qui est mis en Å“uvre.) ATTENTION : Certaines références ne sont pas compatibles avec U8glib.h donc vérifier à la commande. Comme tous les composants populaires, on trouve en ligne une bibliothèque pour les rendre directement et facilement utilisables. Dans notre cas on va utiliser la classique U8glib.h qui accompagne ce didacticiel dans le dossier <Bibliothèques>. Également fourni le document Bibliothèque U8glig.PDF à imprimer Recto/Verso pour réaliser un petit livret au format A5 qui résume sur vingt pages les méthodes de U8glib.h.

Études en préambule à l’établissement du « cahier des charges ».

Nous savons qu’avant d’investir des heures pour créer des démonstrateurs, il importe de définir avec précision ce que l’on cherche à obtenir sur l’appareil. Les possibilités sont tellement nombreuses, qu’avant de réfléchir à cette étape, il me semble important d’envisager une possibilité d’un indicateur de CO2 du type circulaire, qui toutefois impose une étude de faisabilité. Il sera relativement aisé de programmer des échelles linéaires comme celle émulée sur la Fig.74 en Page 35, car ça se résume à programmer des segments de droite ou des rectangles. En revanche, un indicateur circulaire comme celui schématisé sur la Fig.88 semble particulièrement séduisant. Toutefois, immédiatement la complexité jaillit et il importe avant de rêver, de vérifier que c’est possible. Les problèmes qui immédiatement viennent à l’esprit pour une telle approche sont les suivants :
1) La bibliothèque ne sait pas tracer des arcs de cercle d’ouverture quelconque.
2) Sera t’il possible de tracer les valeurs assez petites et bien disposées ?
3) Comment tracer les graduations linéaires aux angles espérés ?
4) Sera t’il possible de tracer l’aiguille dans un nombre de positions suffisant pour donner l’impression d’une rotation « continue » ?
• Décision : L’écran présentant une définition non négligeable, la valeur du taux de CO2 sera également indiquée en numérique et mise en évidence par des caractères « de taille double ».

Problème n°1. La bibliothèque accepte de tracer des cercles qui débordent du cadre d’affichage. On va donc décentrer le tracé de ce dernier vers le bas. Pour avoir le meilleur affichage possible le cercle sera de la plus grande taille possible compatible avec l’angle total à balayer. Après de nombreux essais, la décision prise consiste à placer l’indicateur analogique le plus à gauche possible. Les coordonnées du centre du cercle seront à X = 35 et Y = 35. (Valeurs en pixels.) Le rayon du cercle sera également de 35 PIXELs. Avec ces valeurs la zone visible ouvre bien pour l’angle de 300° avec toutefois un « aplatissement » vers le bas. Du coup il y a discontinuité avec la graduation pour la valeur zéro et également un trou pour la graduation de 5000. Pour des raisons esthétiques ces discontinuités sont comblées par deux petits segments horizontaux qui sur la Fig89 ont été surchargés en rouge. Toujours pour des raisons esthétiques, on peut y remarquer que le texte ppm en bas du cadran est devenu PPM.

Problème n°2. La plus petite police de 4 x 6 est illisible et ses majuscules sont moches. Un bon compromis pour les écrans textuels est 6 x 10, mais ils sont alors trop grands pour l’indicateur circulaire. Soit on ne les affiche pas, soit on les construit. Après réflexion, ne pas les afficher conduit à une économie substantielle de code, et se traduit par un écran épuré qui ne manque pas de charme. L’allure globale que présentera l’écran d’affichage des données est proposée sur la Fig.90 avec des subtilités qui ne sautent pas aux yeux. Par exemple le caractère ‘%’ n’est pas affiché directement après la valeur, mais légèrement décalé. De même que placer un espace d’un caractère entre la valeur de la température et le ‘C‘ était trop important visuellement. Le ‘C‘ est donc placé plus proche. Quand au caractère ‘°’ il n’existe pas, ou du moins si on tente de l’afficher, il est alors précédé du caractère ‘A‘. Du coup, ce caractère « degré » est construit par écriture de quatre PIXELs.

Problème n°3. La réponse à cette question se trouve sur la Fig.90 et dans le chapitre qui suit.

Problème n°4. Le démonstrateur P16_Cadran_analogique.ino prouve que l’on peut tracer les vecteurs représentant l’aiguille tous les degrés entre les deux graduations limites. Visuellement c’est largement suffisant, inutile de calculer avec plus de précision angulaire, d’autant plus que ce type de cadran analogique est fait pour être consulté d’un peu loin ou rapidement. Dans ce contexte le degré est suffisant, une précision plus grande exigerait une définition plus importante de l’afficheur.

Un petit fifrelin de Théorie géométrico-mathématique.

Pléonasme « un Petit fifrelin », qui traduit assez bien le fait que l’on ne va pas trop se prendre la tête. Nous allons à peine survoler un ou deux détails pour comprendre les séquences qui sur l’écran tracent des traits inclinés. Les bibliothèques … c’est génial ! Mais elles ne peuvent jamais se substituer totalement à un travail d’analyse. Tracer un cercle avec la bibliothèque de l’afficheur OLED est enfantin, tracer un segment également. Alors pourquoi diable se prendre la tête avec de la trigonométrie ? Pour frimer ? (Comme « faire-valoir » à une soirée mondaine ou lors d’un discours politique … évitez, le sujet n’est pas porteur !)
La réponse à cette question tient en deux questions :
– Comment tracer les graduations du cadran analogique ?
– Comment tracer l’aiguille analogique qui tourne autour d’un axe de rotation virtuel ?
Pour les graduations, il serait possible de s’en tirer en imprimant une grille de 128 x 46 carrés. Puis on tracerait le cercle qui sur la Fig.91 est repéré 1. On ajouterait un cercle plus petit 2 correspondant à l’extrémité des graduations. On crayonnerait pour tracer les onze petits traits. Feutre de couleur en main chaque petit carré sous ces tracés serait colorié, ainsi seraient représentés tous les pixels représentant les graduations. Fastoche, en plus ça ne prend que trois jours. Puis, on repèrerait les coordonnées de l’origine et de l’extrémité de chaque graduation et la procédure u8g.drawLine() se chargerait du reste. C’est une solution. Pas très élégante, vorace en temps pour tracer le modèle et inutilement couteuse en octets de programme car il faudrait définir, puis tracer une image de 64 x 64 pixels soit 512 octets. Le problème de l’aiguille analogique qui tourne ne serait pas résolu pour autant. Pour sortir de cette impasse … vive la trigonométrie apprise en terminale, même si pas trop n’en faut !

Que ce soit pour tracer des graduations qui convergent vers un centre virtuel ou représenter une aiguille qui tourne, et dont l’extrémité se déplace sur un cercle, dans les deux cas on « tourne en rond ». Traduisez : Il faut calculer la position d’un point situé sur un cercle. Pour vous en convaincre, observez la Fig.91 sur laquelle le cercle extérieur du cadran analogique est situé en 1. Toutes les graduations convergent vers le centre de ce cercle. Leurs extrémités sont situées sur le cercle 2. (Je vous l’avais bien dit que l’on allait faire des ronds !) Observons aussi l’aiguille qui tourne autour du pivot virtuel centré en A. Comme sa longueur est constante, son extrémité B se trouve forcément sur un cercle ayant pour rayon la distance AB. Pour tracer un segment tel que celui en vert épais, il suffit donc de déterminer la position de ces ses extrémités C et D. Mis à part pour A qui se trouve au centre de la figure, tous les autres points sont situés sur des « vecteurs rayons » d’inclinaisons connues et dont l’extrémité est située sur un cercle.

Et rond, et rond petit patapon.

Pracer un cercle point par point dans une matrice cartésienne consiste à déterminer la position de chaque élément dans un repère orthogonal centré dans la zone concernée. Pour simplifier les études, nous avons tout bénéfice à centrer le repère sur le centre des cercles 1, 2 et 3. On aboutit à la Fig.92 qui inclut les ingrédients indispensables à la cuisine mathématique qui va suivre. La saveur de notre recette réside dans des entités bien connues nommés SINUS et COSINUS qu’il faut faire mijoter à feux doux. Pour les coordonnées du point A c’est facile, deux fois zéro puisque le centre du repère YoX est placé précisément au centre du cercle 1. Nous savons que le point B se trouve sur un cercle de centre A et de rayon R égal à AB. Par définition des entités trigonométriques, nous avons la position horizontale H = R Cosinus (α) = AB Cosinus (α). De façon analogue, la position verticale V = R Sinus (α) = AB Sinus (α). Donc, pour tracer l’aiguille en fonction de son orientation angulaire il suffira de déterminer la valeur de a en fonction du taux de CO2 et de calculer V et H avec les formules trigonométriques. Nous avons bien de la chance, car l’IDE d’Arduino a bien écouté ses Professeurs quand il étudiait pour passer son BAC. Il connait parfaitement sa trigonométrie et met à notre disposition les fonctions sin(Alpha) et cos(Alpha). C’est génial de simplicité, il suffit d’utiliser ces outils logiciels pour nos formules.
– Génial, génial … pas tant génial que ça Totoche.
– Ben pourquoi Dudule, t’es encore en train de râler ?
– Parce que l’angle Alpha il est toxique !
РHa bon pourquoi ̤a ?
– Ben parce qu’il doit être exprimé en Radians, pas en Degrés !

Glups, faut immédiatement en informer le Ministre des angles. Bon, pas de quoi se rouler dans la poussière de colère. Il suffit de savoir que 360° correspondent à 2 x Ï€ Radians. Et Ï€ c’est ce nombre transcendantal qui fait environ 3,141592654 et des broutilles. En langage C il n’est donc pas bien compliqué de convertir un angle exprimé en degrés en son équivalent exprimé en radians. Une simple proportionnalité entre 360° et 6.2831852 encore que le compilateur du langage C d’Arduino manipule la constante PI prédéfinie sous forme d’un float. Et pour ceux à qui multiplier PI par deux et comparer avec du 360 donne des migraines, il y a en plus une fonction radians(Angle) qui retourne en Radians la valeur du paramètre Angle exprimé en degrés. L’est pas belle la vie arduinotique ?

Tracer l’aiguille analogique.

Grâce aux formules de la trigonométrie, vous aller voir que finalement animer un rayon vecteur virtuel devient un jeu d’enfant. Pour le prouver, nous allons analyser la séquence qui dans le logiciel de démonstration est chargée de faire bouger cette aiguille virtuelle et voir que la procédure se résume à pas grand chose. Dans cette séquence X et Y sont les coordonnées de l’extrémité du segment de droite à tracer et qui représente l’aiguille. Angle est la variable de type int qui contiendra la valeur de l’inclinaison exprimée en degrés. Alpha de type float est l’identificateur de l’angle exprimé en radians. Cette séquence se trouve intégrée dans la boucle de base et explorée à chaque passage dans void loop(). La valeur du CO2 est ajustée avec le potentiomètre de A7.

Reste deux petits détails à résoudre. Le premier consistera à transposer les valeurs du taux de CO2 qui vont de 0 à 5000 en 0
à 360 avec la procédure map(). Avec le codage proposé ci-avant, lorsque Alpha varie entre 0 et 359 l’aiguille balaye l’amplitude de la flèche rouge. Hors il faudra procéder en

 

deux secteurs : 0 à 150 deviendra 210 à 359 et 151 à 300 deviendra 0 à 150. L’amplitude angulaire pour Alpha passant de 360 à 300°. À regarder le listage donné Fig.94 de la séquence du tracé des graduations angulaires, on constate que l’on a procédé en deux secteurs en faisant appel à une seule procédure de calculs.

Les seuils critiques de CO2.

Profitons de la définition suffisante de l’afficheur pour gérer les dépassements du seuil 599PPM pour le taux de CO2 pour ajouter à l’écran la cause de l’alerte sonore. Comme pour les autres versions, une LED rouge s’illuminera, et un BIP sonore sera émis une fois par seconde. Enfin, pour informer l’usager, les petits textes encadrés de la Fig.95 viendront s’ajouter aux informations visualisées. En A c’est le seuil 600 qui est indiqué, alors qu’en B c’est 1000PPM qui sont dépassés. Les valeurs des trois paramètres continuent à être inscrites. Quand le taux de CO2 dépasse les 1300PPM l’aiguille virtuelle pénètre dans le cadre d’alerte, toutefois, comme on peut le constater en B ce n’est absolument pas une gène.
REMARQUE : Pas encore effectué lors des photographies de la Fig.95 le rayon du disque central de l’aiguille virtuelle a été augmenté d’un PIXEL pour des raisons d’esthétique.

La suite est ici.