Je suis nouveau, merci pour l'acceuil et desolé pour les plus chauvins si mon sujet n'est pas au bon endroit...
Je souhaiterai placer mon nombre à droite sur mon écran lcd c'est à dire que le dernier chiffre reste à droite et celui des dizaine à gauche et ainsi de suite. Sachant que c'est un compteur qui s'incremente geance à un bouton. J'utilise une carte arduino uno avec un écran lcd i2c.
Merci pour votre aide
la fonction sprintf() permet de créer du texte à partir de nombre et gère l'alignement et le padding.
un exemple:
void setup() {
Serial.begin(115200);
for (long i = 1; i < 150000; i *= 2) {
char buffer[20]; // s'assurer qu'il est assez grand pour le texte
snprintf(buffer, sizeof buffer, "% 8ld", i); // padding avec des espaces sur 8 positions
Serial.println(buffer);
}
}
void loop() {}
C'est pas du chauvinisme. C'est juste que la section "Tutoriels et cours" c'est prévu pour les tutoriels et les cours. Message déplacé.
Ce n'est pas précisé mais je suppose que tu utilises la librairie LiquidCrystal.
Elle te permet de positionner le curseur où tu veux avant d'écrire avec setCursor().
Tu peux déterminer la position du début de l'écriture en testant si la valeur à écrire est supérieure à 10, 100, 1000, ...
attention cependant si le nombre peut aussi diminuer, si on écrit 1000 par exemple et qu'ensuite on veut écrire 999, on verra 1999 si on ne prend pas le soin d'effacer le 1 du 1000 qu'on avait avant en première position.
l'avantage de sprintf() c'est qu'il met des espaces en padding donc on écrit toujours au même endroit et ça efface ce qu'il y avait avant. L'inconvénient c'est que c'est une fonction gourmande en mémoire flash par rapport à faire des if et setCursor()
J'utile la librairies LiquidCrystal_i2c 16x2
Pour etre plus precis, j'utilise un bouton pour l'incremention, c'est pour compter de 0 à 200000. le chiffre s'affiche à gauche et mon symbole d'unité est à droite (trop d'ecart).
voia mon problème
#include <Wire.h>
#include <hd44780.h> // https://github.com/duinoWitchery/hd44780
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header
#include <Toggle.h> // https://github.com/Dlloydev/Toggle
// LES 2 BOUTONS
const byte brochePlus = 2;
const byte brocheMoins = 3;
Toggle boutonPlus, boutonMoins;
// LE LCD
hd44780_I2Cexp lcd;
const int nbCols = 16;
const int nbLignes = 2;
// LE COMPTEUR
long compteur = 0;
const char unite[] = " mg";
const byte longueurUnite = sizeof unite - 1;
void afficherCompteur() {
static long compteurSurLCD = -100000;
const int tailleChampCompteur = 6;
char format[10]; // on fabrique dynamiquement le format de sprintf "%+ 6d", la notation * ne fonctionne pas sur UNO
char buffer[nbCols + 1]; // +1 pour le caractère nul de fin de chaîne
if (compteurSurLCD != compteur) {
snprintf(format, sizeof format, "%%+ %dd", tailleChampCompteur+1); // on fabrique un format avec la bonne dimension
snprintf(buffer, sizeof buffer, format, compteur);
lcd.setCursor(nbCols - tailleChampCompteur - longueurUnite, 0);
lcd.print(buffer);
compteurSurLCD = compteur;
}
}
void setup() {
Serial.begin(115200);
boutonPlus.begin(brochePlus);
boutonMoins.begin(brocheMoins);
int result = lcd.begin(nbCols, nbLignes);
if (result) {
Serial.print("LCD initialization failed: ");
Serial.println(result);
hd44780::fatalError(result);
}
lcd.clear();
lcd.print(F("Tare : "));
afficherCompteur(); // va positionner le curseur juste après le nombre
lcd.print(unite);
}
void loop() {
boutonPlus.poll();
if (boutonPlus.onPress()) {
compteur++;
afficherCompteur();
}
boutonMoins.poll();
if (boutonMoins.onPress()) {
compteur--;
afficherCompteur();
}
}
j'utilise la bibliothèque hd44780 pour l'écran, elle est bien meilleure que LiquidCrystal_i2c.
la taille du champ pour le nombre est une constante (tailleChampCompteur) et donc pour le sprintf() je fabrique le format "%+ 6d" dynamiquement avant de l'utiliser dans la fonction pour imprimer au bon endroit mon compteur. Le '+' dans le format dit que l'on veut toujours afficher le signe (si c'est positif on aura par exemple "****+42" et si c'est négatif "****-42" par exemple où les * seront des espaces)