Positionnement d'un texte

SetCursor permet de positionner un texte par son extrémité gauche
Est-il possible de le faire par son extrémité droite?

La raison de ma demande : mon texte varie en longueur mais je voudrais que son extrémité droite reste fixe

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

1 Like

J'ai encore du mal à comprendre

Il me semble que je suis pourtant bien dans la bonne section International Français .. non? .
capture 2022-06-02 à 09.52.16

Bonjour

Il me semble que je suis pourtant bien dans la bonne section International Français .. non? .

oui, car @UKHeliBob vient de faire le nécessaire après avoir trouvé le message dans la partie anglophone

il écrit qu'il a déplacé le message

Merci au passage à @UKHeliBob pour son travail quotidien de 'relocalisation' :+1:

Ah ok ... je chercherai comment me positionner directement dans cette section

voci le lien d'accès direct à la partie Francophone :

https://forum.arduino.cc/c/international/francais/49

Bonjour jo6466

Voilà une façon de faire:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

	const int lcdMaxPos = 20;
	String lcdText = "ARDUINO";
void setup()
{
	lcd.init();                      // initialize the lcd 
	lcd.backlight();
	lcd.setCursor(lcdMaxPos-lcdText.length(),0);
	lcd.print(lcdText);
}


void loop()
{
}

En déduisant la longueur du texte du nombre de colonnes pour trouver la position de départ.

Cordialement
jpbbricole

Je comprends l'idée mais je n'arrive pas à l'appliquer à mon écran oled 128x64
J'obtiens cette erreur de compilation : invalid operands of types 'const int' and 'char [50]' to binary 'operator-'

Mon code adapté est le suivant :

sprintf(BUFFER_H, "%.d:%.2d", hour(Heure_P), minute(Heure_P));    // creation et remplissage de la variable "BUFFER_H"
    ecranOLED.setFont(&FreeSansBold16pt7b);
    ecranOLED.setTextColor(WHITE);
    ecranOLED.setCursor (oledMaxPos-BUFFER_H.lenght(), 0);
    ecranOLED.display();

On a qu'une partie du code mais on peut supposer que BUFFER_H est un tableau de char donc ce n'est pas une classe et donc il n'y a pas de méthode length().
Par contre il y a strlen(BUFFER_H)

Il faut que tu précises quelle(s) bibliothèque(s) graphique(s) tu utilises pour ton écran

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Il existe dans cette bibliothèque la méthode getTextBounds :

void Adafruit_GFX::getTextBounds(const char *str, int16_t x, int16_t y,
                                 int16_t *x1, int16_t *y1, uint16_t *w,
                                 uint16_t *h)
@brief  Helper to determine size of a string with current font/size.
        Pass string and a cursor position, returns UL corner and W,H.
@param  str  The ASCII string to measure
@param  x    The current cursor X
@param  y    The current cursor Y
@param  x1   The boundary X coordinate, returned by function
@param  y1   The boundary Y coordinate, returned by function
@param  w    The boundary width, returned by function
@param  h    The boundary height, returned by function

Avec ça, tu peux connaitre la largeur d'un texte, c'est à dire le nombre de pixels qu'il va utiliser sur ton écran. Après appel de la fonction, le paramètre w renvoie ce nombre. Il te suffit alors de positionner ton texte à la bonne abscisse de ton écran :
int position = limiteDroite - w;

Merci Lesept ... GetTextBounds fonctionne parfaitement

Autre question ... avec ces instructions j'affiche Les heures et les minutes avec le même jeux de caractères
Serait-il possible d'afficher les heures et les minutes avec des caractères différents?
J'ai essayé ceci mais cela ne marche pas :

 sprintf(BUFFER_H1, "%, hour(Heure_P)); // creation et remplissage de la    variable "BUFFER_H1"
    ecranOLED.setFont(&FreeSansBold16pt7b);
    sprintf(BUFFER_H2, "%.2d", minute(Heure_P)); // creation et remplissage de la variable "BUFFER_H2"
    ecranOLED.setFont(&FreeSans6pt7b);

    sprintf(BUFFER_H,BUFFER_H1,BUFFER_H2); // creation et remplissage de la variable "BUFFER_H"
    ecranOLED.setTextColor(WHITE);
    ecranOLED.print(BUFFER_H);

L'utilisation des polices est décrite ici :

A priori ton code est bon, il faut en effet utiliser setFont() mais il faut déclarer les polices utilisées au début de ton code :

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_SSD1306.h> // Hardware-specific library
#include <Fonts/FreeMonoBoldOblique12pt7b.h>
#include <Fonts/FreeSerif9pt7b.h>

Je l'ai déjà fait

#include <Fonts/FreeSans6pt7b.h>  
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>
#include <Fonts/FreeSansBold16pt7b.h>

Le résultat est que les heures et les minutes sont affichées avec le petit jeu de caractères

Là tu n'écris pas sur l'écran... mais dans un buffer. Il faut assigner la police juste avant d'écrire sur l'écran.

Je rappelle mon but

  1. afficher sur une même ligne l'heure et la minute avec un caractère X et afficher la seconde avec un caractère Y
  2. centrer cette ligne sur l'écran avec la fonction getTextBounds

Le point 1 marche très bien avec 1 Sprintf pour l'heure et la minute et 1 sprintf pour la seconde

Cela me semble mission impossible

Tu dois écrire les heures dans un premier buffer, puis les minutes dans un second. Ensuite, tu choisis la police des heures et tu affiches le premier buffer. Puis tu choisis la police des minutes et tu affiches le second buffer. Un truc comme ça :

sprintf(BUFFER_H, "%2d", heure(Heure_P));
sprintf(BUFFER_M, "%2d", minute(Heure_P));
ecranOLED.setFont(&FreeSansBold16pt7b);
ecranOLED.setCursor(xheure, yheure);
ecranOLED.print(BUFFER_H);
ecranOLED.setFont(&FreeSans6pt7b);
ecranOLED.setCursor(xminute, yminute);
ecranOLED.print(BUFFER_M);

c'est ce que j'ai fait mais comment utiliser ensuite la fonction getTextBounds si j'ai deux variables?