LCD Zeichen in einem sprintf einbauen

Ich habe folgende Frage habe mal 2 Sonderzeichen gebastelt

byte Aus[8] =
{
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B11111,
};

byte Ein[8] =
{
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
};

void setup() {
  lcd.begin(16,2);
  lcd.createChar(0, Aus);
  lcd.createChar(1, Ein);
  lcd.setCursor(0,0);

    lcd.print((char)0);
    lcd.print((char)1);

}

Ich möchte die beiden Charakters in meinem sprintf String einbauen, geht es ?

sprintf(szStrEA,"E:%02d:%02d A:%02d:%02d",EStunden,EMinuten,AStunden,AMinuten);

So geht das eher nicht, weil der Zeichengenerator in der Bibliothek oder im Display-Chip sitzt. Manchen Controllern kann man benutzerdefinierte Zeichen beibringen, schau mal in Deiner Bibliothek nach. Die müssen dann aber mit dem char Code ausgegeben werden, unter dem sie im Zeichengenerator gespeichert sind.

also du könntest es entweder hardcoded mit \x1 ausgeben oder auch als Parameter übergeben.

Nur klappt es nicht mit char 0. Daher leicht geändert auf char 1 und 2

#include <Wire.h>
#include <NoiascaLiquidCrystal_I2C.h>  // download library from https://werner.rothschopf.net/202003_arduino_liquid_crystal_umlaute.htm

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


byte Aus[8] =
{
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B11111,
};

byte Ein[8] =
{
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
};

void setup() {
  Wire.begin();                        // start I2C before you use the LCD
  lcd.init();                          // initialize the LCD
  lcd.backlight();

  lcd.begin(16, 2);
  lcd.createChar(2, Aus);
  lcd.createChar(1, Ein);
  lcd.setCursor(0, 0);

  lcd.print((char)2);
  lcd.print((char)1);

  lcd.setCursor(0, 1);
  //lcd.sprintf(szStrEA,"E:%02d:%02d A:%02d:%02d",EStunden,EMinuten,AStunden,AMinuten);

  int eStunden = 1;
  int eMinuten = 2;
  char szStrEA[41];
  byte special = 2;
  sprintf(szStrEA, "E:%02d:%02d \x1 bzw %c", eStunden, eMinuten, special);

  lcd.print(szStrEA);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Bei einem HD44780 Controller werden die Zeichen von 0 bis 7 von 8 bis 15 wiederholt also statt \0 kannste \8 nehmen.

Grüße Uwe

lcd.print(szStrEA); geht natürlich nicht, wenn in szStrEA eine 0 vorkommt, die nicht als Endekennung gedacht ist.

  lcd.write((char)0); wäre aber kein Problem
  lcd.write(szStrEA,20); geht auch, nur kann die 20 nicht als strlen(szStrEA) ausgerechnet werden.

Aber wegen der Sonderrolle der 0 in Texten ist dein Verzicht auf dieses Sonderzeichen natürlich der bessere Weg.