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.