LCD texto subrayado

Hola foro..

Esto de nuevo foro esta bastante bueno, no habia tenido de echarle un vistazo, y me parecio muy buen cambio de ambiente. 8)

Bueno, a lo nuestro... Una pregunta muy simple, alguien sabe como poner texto subrayado en un LDC de esos tipicos que se controlan con HD44780 ( es uno 20x4 con un modulo serial) . Tengo esa duda, ya que si no existe comando, la unica opcion seria creando (dibujando) el caracter con una raya abajo y alargaria mucho el codigo en arduino..
Alguna idea..? seria de buena ayuda.
saludos!

Tienes que dibujarlo graficamente.

Este es el mapa de caracteres para tu LCD:

Necesitas ayuda para eso?

creo que lo hice un par de veces con el LCD conectado directo al arduino.. pero con el modulo serial cambian las cosas ahora no?..

No, funciona de la misma manera. Son diferentes formas de comunicarse, eso es todo.
El LCD es el que tiene la memoria de los caracteres y tu puedes agregar 7 caracteres customizados a la vez.

Si tienes Mac, puedes usar este programa para generar los caracteres.

Para PC, puedes usar este de Parallax (nunca lo use, pero creo que es bueno).

Aqui tienes dos formas de construir caracteres:

La intuitiva:

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);




void setup() {
  
  // Creando un caracter customizado
byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
};
lcd.createChar(0, smiley);
// ----------------------------
  lcd.begin(16, 2);  
  
  lcd.clear();
  lcd.print("hello");
  delay(500);
  lcd.clear(); 
  lcd.write(0);
  
  
}

void loop() {}

Y la forma mas comun:

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


void setup() {

lcd.clear();
lcd.begin(16, 2); // 20 ROWS / 4 LINES
  
// Creando un caracter customizado
uint8_t B_[8] =  {0x00, 0x11, 0x00, 0x00, 0x11, 0x0e, 0x00, 0x00}; // Smiley
lcd.createChar(1, B_);
lcd.home(); 
// ----------------------------


  lcd.print("hello");
  delay(500);
  lcd.clear();
  lcd.write(1);
}

void loop() {}

hmm se me esta haciendo complicado..

antes, yo simplemente ocupaba la funcion createChar() de la libreria LiquidCrystal.. pero ahora que tengo el modulo Serial, no necesito cargar esa libreria, solo envio los datos por puerto serial, y se escriben directamente en el LCD.

como creo un caracter por puerto serial.. primero supongo que el micro que funciona con el modulo serial, tendria que reconocer por un flag que los datos que estoyenviando son para crear un caracter, de la misma forma que hago por ejemplo para que sepa que quiero mover el cursor, o cambiar el contraste o cualquier otra opcion, pero en la hoja de datos del modulo, no sale algun comando para que sepa que quiero crear en la memoria del LCD un caracter especial..

la opcion que veo, seria desconectar el modulo, conectar el LCD directo al arduino, cargar el carater especial en la memoria, y volver a conectar el modulo LCD.. esa seria una opcion, siempre y cuando la memoria donde se guarda el caracter, no sea volatil. si no.. habria que pensar otra idea..

nose si estoy mal, o estoy haciendo una tormenta en un vaso de agua y es mas simple de lo que creo..

Alonso como bien dices, si la interfaz serie a la que está acoplada la pantalla no soporta esa función no podrás usarla.
En cuanto a grabarlos directamente a la pantalla, no va a ser posible, ya que los carácteres se guardan en una RAM.

Un saludo

En controlador del LCD se puden crear unos cuantos caracteres definidos por el usuario. Si no son muchas letars subrayadas las que necesitas pudes crearlas tu mismo.

No se de donde sacan que no se puede hacer.

Un Serial-LCD tiene las mismas capacidades.

Ya es muy tarde aca para generar codigo, pero si ya tienes to Serial LCD conectado, solo tienes que probar el codigo y decrime si funciona con "serial.println();"

Hay varios viejos thread en Arduino dedicados a este tema.

Aqui tienes este thread para ir probando.

Edit: OK, un poco de tiempo me quedo antes de irme a dormir...

void setChar(byte pos,byte b1,byte b2,byte b3,byte b4,byte b5,byte b6,byte b7,byte b8) {
  //character designer here: http://www.geocities.com/dinceraydin/lcd/charcalc.htm
  //pos from 0-7 (max 8 custom characters)
  Serial.print(0xFE,BYTE); //HD44780 command (254)
  Serial.print(64+pos*8,BYTE); //CG RAM start
  Serial.print(b1,BYTE);
  Serial.print(b2,BYTE);
  Serial.print(b3,BYTE);
  Serial.print(b4,BYTE);
  Serial.print(b5,BYTE);
  Serial.print(b6,BYTE);
  Serial.print(b7,BYTE);
  Serial.print(b8,BYTE);
  Serial.print(254,BYTE); //switch to command mode to leave
  Serial.print(1,BYTE);  //then do something (clear screen)
}

void setup() {
  Serial.begin(9600);

  }


void loop() {
  
    setChar(0,159,159,159,159,159,159,159,159); //black box
  for (int i=0; i<8; i++) { //print custom chars
    Serial.println(i,BYTE);
    delay(250);
} }

Prueba este codigo con tu Serial LCD conectado, la consola de Serial de Arduino no lo va a reconocer, solo tu LCD.

Si la controladora de la interfaz es pasiva, probablemente se pueda, si es activa y no tiene esa función implementada pues no.
Y por lo que había comentado me había parecido que era del segundo tipo...

OK, ahora tengo un poco mas de tiempo para esto.

Ya que existe este thread, no es mala idea dedicarle mas tiempo a informar mejor como funciona un Serial-LCD.
Me imagino que Alonso no va a tomarse todo este trabajo para subrayar texto, pero es importante que futuros miembros de Arduino en el foro en Español sepan que si es posible generar caracteres pre-determinados via Serial-LCD.

La comunicacion via Serial es otro modo de comunicacion, asique siempre y cuando tu LCD tenga la opcion de escribir en su memoria (como la mayoria lo tienen), va a ser posible crear caracteres pre-definidos.
Es la manera en que te comunicas con tu LCD la unica diferencia ("lcd.print();" vs "serial.print();").
Un poco de Google (tu mejor amigo), y encontraras un monton de ejemplos de proyectos con Serial-LCD's generando graficos pre-determinados.

Como funciona un Serial-LCD
Un Serial-LCD esta compuesto de un modulo standard LCD conectado a un controlador PIC que traduce todos los comandos a I2C, SPI o RS232/TTL.

El modo de 3 cables es similar a Serial LCD, solo que utiliza otras librerias.

Comunicacion via Serial al LCD
Cuando te comunicas a un LCD, los parametros basicos son E(enable), W(write), DB4-DB7(4-Bits), DB0-DB7(8-Bits).
Esos comandos son los mismos en Serial-LCD, solo cambia la forma en que los comandos son enviados. Solo tienes que "traducir" los comandos a 8-bits o 4-bits.
Por lo tanto, todas las caracteristicas de tu LCD nunca se pierden, como blink, wrap, custom_char, etc.

Creando caracteres especiales (Proof of concept)

Ejemplos:
-Esta es una forma muy creativa de escribir graficos via Serial-LCD..
Este metodo podria aplicarse al problema original de este post, pero es complicarse mucho la vida.... Aunque vale la pena intentarlo.

Nisiquiera utiliza la libreria de Serial, y ha creado una manera directa de enviar informacion al LCD. Creo que este ejemplo es brillante.
Para modificar este codigo a tu LCD, hay que modificar parametros en el timming.

Esta tarde estuve probando con Shift Registers, porque de hecho es parte de uno de mis proyectos y estos son los resultados:

Como comente anteriormente la manera de transmitir datos son diferentes, pero el mismo concepto.

Les debo un codigo que funcione con Serial, pero si quieren adelantarse solo tienen que buscar en Google "Serial LCD custom characters", y van a aparecer varios ejemplos.

Lo que no encontre son ejemplos especificos, pero mas que nada gente resolviendo pequeños problemas de codigo, mas que nada para otros controladores que de todas maneras son compatibles con el ambiente de Arduino, y otro ejemplo en Arduino.
El tema es que es posible, pero la verdad es que no existe mucho material exclusivo para Arduino, asique no es mala idea armar un ejemplo con todo el codigo para aprender mejor exclusivamente para Arduino.
Lo dejo en mi "TO DO List" ya que no tengo un Serial LCD a mano, pero hay bastante material en pequeños pedazos que muestran que es posible.

En resumen. Si se puede.

Yo no he dicho que no se pueda nunca, he dicho que si no es pasiva o de ser activa no tiene implementada esa funcionalidad la interfaz serie, no se podrá.
Pero si Google dice que siempre se puede pues oye...

Os paso una web donde podéis hacerlo online.

http://icontexto.com/charactercreator/

Yo hice los dos caracteres de la derecha.