Go Down

Topic: [Partage] méthode .print() : ajout printf et print de nombres entiers formatés (Read 320 times) previous topic - next topic

bricoleau

Bonjour

Si vous aussi, vous en avez un peu marre de programmer des trucs du style
Code: [Select]
Serial.print("Duree = ");
//affichage des millisecondes sur 3 chiffres
if (duree < 100) Serial.print('0');
if (duree <  10) Serial.print('0');
Serial.print(duree);
Serial.println(" ms");

Voici une petite bibliothèque printExt.h qui amène deux extensions à la méthode .print(), utilisables dans les Serial.print(...) mais aussi dans LCD.print(...) ou toute autre classe dérivée de la classe Print.

Après téléchargement et installation, il suffit d'ajouter un
Code: [Select]
#include "printExt.h"
en début de programme pour en bénéficier.


1. Extension print_f => ajoute un équivalent de la fonction standard printf()

Exemple :
Code: [Select]
Serial.println(f("Duree = %03d ms", duree));

f(format, ...) est une fonction de même prototype d'appel que la fonction standard printf.

format est une chaîne de caractères qui peut aussi être laissée en flash.
Par exemple :
Code: [Select]
const char format[] PROGMEM = "Duree = %03d ms";
...
Serial.println(f_P(format, duree));

ou encore :
Code: [Select]
Serial.println(f(F("Duree = %03d ms"), duree));

Limitation : de manière similaire à la fonction sprintf disponible dans l'environnement arduino, les nombres flottants n'y sont pas gérés.

Attention également à l'augmentation de la taille de l'exécutable généré, lorsque l'on utilise les fonctions de la famille de printf().


2. Extension printInt => pour imprimer tous types de nombres entiers bien formatés

Serial.print(I(nombre, taille));
Serial.print(I(nombre, taille, separation));
Serial.print(I(nombre, taille, separation, separateur));


taille est le nombre de caractères souhaités au global (incluant éventuellement signe et séparateur).

Le nombre est complété à gauche par des zéro.
Si le nombre est signé, le signe est systématiquement imprimé (même un +).
Si le nombre est trop grand pour la taille désirée, il est quand même imprimé dans son intégralité.

separation est un paramètre facultatif. Il permet de définir la taille des paquets de chiffres à séparer.
Par défaut ce paramètre est à zéro.
La valeur 3 sépare par milliers.
La valeur 2 peut être pratique pour afficher un numéro de téléphone stocké dans un unsigned long.

separateur est également facultatif. Il permet de définir de caractère à utiliser pour séparer les chiffres. Sa valeur par défaut est le caractère blanc ' '.


Serial.print(N(nombre, taille));
Serial.print(N(nombre, taille, separation));
Serial.print(N(nombre, taille, separation, separateur));


C'est tout pareil que I(...), sauf que le nombre est complété à gauche par des blancs au lieu de zero.
Et du coup le signe des nombres signés est collé au premier chiffre significatif.


Serial.print(B(nombre));

Pour imprimer en binaire propre, précédé de "0b", pour ne jamais avoir d'ambiguïté dans l'interprétation de ce qu'on a sous les yeux.

Le nombre de bits imprimés est 8, 16 ou 32, en fonction du type de la variable nombre (signée ou non).
Là encore je trouve ça plus pratique que le Serial.print(nombre, BIN);

Marche aussi très bien pour le type char.

Serial.print(H(nombre));

Même principe que B(nombre), mais en hexadécimal.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

bricoleau

N'hésitez pas à installer et tester cette lib.

Le code est un peu frais, la possibilité de bugs résiduels n'est pas à exclure.
Vous pouvez signaler ici toute bizarrerie.

Normalement cela fonctionne aussi sous ESP8266

Pour rappel : printf() est disponible en natif sous arduino DUE & ESP8266.
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

68tjs


hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...



Go Up