Estoy haciendo un pequeño aparato que usa LCD. Todo va perfecto, pero me di cuenta que no se puede desplegar las ñ ni las vocales con tilde en el LCD, cosa que me molesta mucho.
Entonces me puse a buscar por todo lado, y simplemente no encontré en ningún lado una solución a esto.
A pesar que busqué bastante, no encontré la solución, así que me puse a resolverlo yo mismo.
Solucioné el problema. Lo hice creando nuevos caracteres con la opción que brinda el LCD para crear cualquier caracter (función lcd.createChar). Ahora ya puedo mostrar vocales con tilde y también ñ. Eso sí, solo minúsculas, debido a que el LCD no admite más que 7 caracteres nuevos, y lamentablemente no alcanza para las mayúsculas mas.
No está perfecto, porque quedan un poco desalineados, pero es lo que hay, el LCD no da para mas...
Por si a alguien le sirve, comparto el código.
//este es el proc básico para imprimir tildes y ñ
void lcdPrint2(String s1)
{
char c,d;
for (byte a=0; a<s1.length(); a++)
{
d=c=s1.charAt(a);
if (c=='á') d=1;
else if (c=='é') d=2;
else if (c=='í') d=3;
else if (c=='ó') d=4;
else if (c=='ú') d=5;
else if (c=='ñ') d=238;
else if (c=='Á') d=1; //sustituye porque solo hay campo para 7 definiciones, y no alcanza para las mayúsculas
else if (c=='É') d=2;
else if (c=='Í') d=3;
else if (c=='Ó') d=4;
else if (c=='Ú') d=5;
else if (c=='Ñ') d=238;
lcd.print(d);
}
}//lcdPrint2(String s1)
void lcdCreateChar(char cod, const char *cpm)
{
byte c[8];
for (byte a=0; a<8; a++)
{
c[a]=pgm_read_byte_near(cpm+a);
}
lcd.createChar(cod,c);
}
// á a con tilde
char const lcdDibA[8] PROGMEM =
{
B00010,
B00100,
B00000,
B01110,
B00001,
B01111,
B10001,
B01111
};
// é e con tilde
char const lcdDibE[8] PROGMEM =
{
B00001,
B00010,
B00000,
B01110,
B10001,
B11111,
B10000,
B01110
};
// í i con tilde
char const lcdDibI[8] PROGMEM =
{
B00010,
B00100,
B00000,
B01100,
B00100,
B00100,
B00100,
B01110
};
// ó o con tilde
char const lcdDibO[8] PROGMEM =
{
B00010,
B00100,
B00000,
B01110,
B10001,
B10001,
B10001,
B01110
};
// ú u con tilde
char const lcdDibU[8] PROGMEM =
{
B00010,
B00100,
B00000,
B10001,
B10001,
B10001,
B10011,
B01101
};
//ya hay ñ (enne) hecha
/* El LCD no soporta mas que 8 definiciones. No alcanza para las mayúsculas, pero son estas.......
// Á
byte A2[8] =
{
B00010,
B00100,
B01110,
B10001,
B10001,
B11111,
B10001,
B10001
};
// É
byte E2[8] =
{
B00010,
B00100,
B00000,
B11111,
B10000,
B11110,
B10000,
B11111
};
// Í
byte I2[8] =
{
B00010,
B00100,
B00000,
B01110,
B00100,
B00100,
B00100,
B01110
};
// Ó
byte O2[8] =
{
B00010,
B00100,
B00000,
B01110,
B10001,
B10001,
B10001,
B01110
};
// U
byte U2[8] =
{
B00010,
B00100,
B10001,
B10001,
B10001,
B10001,
B10001,
B01110
};
// Ñ
byte N2[8] =
{
B01101,
B10010,
B00000,
B10001,
B11001,
B10101,
B10011,
B10001
};*/
void lcdIni()
{
pinMode(lcd_pinApagaPantalla, OUTPUT);
lcdEncender(v);
lcd.begin(16, 2);
lcdCreateChar(1, lcdDibA);
lcdCreateChar(2, lcdDibE);
lcdCreateChar(3, lcdDibI);
lcdCreateChar(4, lcdDibO);
lcdCreateChar(5, lcdDibU);
//6 sería 'ñ', pero ya está en la 238
}//lcdIni()
Para usar este código, desde setup se debe llamar a la función lcdIni()
Luego, para imprimir un String cualquiera, se debe usar la función lcdPrint2.
Ejemplo:
void setup()
{
lcdini();
lcd.setCursor(0,0);
lcdPrint2(F("Tildes y ñ"));
lcd.setCursor(0,1);
String s;
s=F("a:á i:í o:ó n:ñ");
// 1234567890123456
lcdPrint2(s);
}//setup()
Nota importante: Los archivos fuente deben estar codificados con ANSI, no con UTF-8. Así lo hice yo, y así lo utilizo.
Si se quiere codificar y usar utf-8, se puede, pero sería necesario modificar bastante la función lcdPrint2 (no sería una modificación pequeña a esa función, habría que hacerla nuevamente).