Texto en Movimiento en Un LCD Con Arduino
Texto en Movimiento en Un LCD Con Arduino
Comentarios(27)
Luis del Valle Hernández
Indice de contenidos
1 LCD Liquid Crystal Display
2 Conexiones de un LCD con Arduino
3 Ejemplo básico LCD con Arduino
4 Moviendo el texto horizontalmente en un LCD con Arduino
UNIRSE AL CURSO
Aceptas que almacene tu nombre y email para poder enviarte
información de Programarfacil.
No es el objetivo de este artículo explicar la física involucrada detrás de
los LCD, solo decir que utiliza las propiedades de la luz polarizada para
mostrarnos la información en una pantalla. A partir de una serie de filtros,
se consigue mostrar la información gracias a la iluminación de fondo.
Hay una amplia gama de pantallas LCDs que podemos utilizar con Arduino.
Aparte de las funcionalidades extra que nos puedan dar cada una de ellas,
las podemos diferenciar por el número de filas y columnas, su tamaño.
Por ejemplo, una pantalla LCD de 16×1 tendrá una fila de 16 caracteres
es decir, solo podremos mostrar 16 caracteres simultáneamente, al igual
que un LCD de 20×4 tendrá 4 filas de 20 caracteres cada una.
En este artículo vamos a trabajar con un LCD típico, de 16×2. Esto significa
que vamos a poder mostrar 16 caracteres en la primera fila y los mismos en
la segunda fila.
PIN FUNCIÓN
1 GND (Tierra)
2 5 Voltios
Montando el circuito
Una vez conocemos los conectores, ya podemos montar el circuito básico.
El material que vamos a utilizar es el siguiente
2 #include <LiquidCrystal.h> // Entre los símbolos <> buscará en la carpeta de librerías configurada
Una vez incluida, debemos indicar los pines que vamos a utilizar para
enviar los datos. esto lo hacemos a través del
constructor LyquidCrystal(…). Esta función permite diferente número de
parámetros que dependerá de la configuración que estemos utilizando. En
la llamada más básica, la que vamos a utilizar, debemos pasar como
parámetros el RS, la sincronización, y los 4 pines para enviar datos. La
función quedaría de la siguiente manera LyquidCrystal(RW,
sincronización, d4, d5, d6, d7). Si sustituimos estos datos con los pines de
Arduino tenemos lo siguiente.
1 // Lo primero is inicializar la librería indicando los pins de la interfaz
Función setup()
Con esto ya podemos pasar a la función setup(). Esta función nos sirve
para hacer una configuración inicial en nuestros programas. Lo primero
que hacemos es configurar el monitor serie y luego inicializamos la interfaz
del LCD con Arduino y especificamos las dimensiones (16 columnas y 2
filas).
1 void setup() {
3 Serial.begin(9600);
5 // Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
6 lcd.begin(COLS, ROWS);
7}
Función loop()
Ahora ya podemos empezar a escribir en la pantalla del LCD. Para ello
vamos a utilizar tres métodos:
1 void loop() {
2 // Limpiamos la pantalla
3 lcd.clear();
6 lcd.setCursor(0,0);
9 lcd.print("Hola Mundo!!!!!!");
2 lcd.setCursor(0,1);
5 lcd.print("Probando el LCD.");
9}
El algoritmo
Antes de empezar a programar, es conveniente plantear el algoritmo. Esto
nos ahorrará tiempo a la hora de codificar con el lenguaje nativo de
Arduino. Desarrollaremos la idea en sucesivos pasos bien estructurados
y ordenados. En este punto, no hay que profundizar en cuántas variables
o constantes necesito. Lo único que debemos plasmar son la secuencia
de pasos.
UNIRSE AL CURSO
Aceptas que almacene tu nombre y email para poder enviarte
información de Programarfacil.
Declaración de constantes y variables
Lo primero es declarar las constantes y variables necesarias. Algunas ya
las hemos visto en el ejercicio básico. Para este ejemplo he añadido una
constante, VELOCIDAD, que nos permitirá controlar la velocidad de
desplazamiento del texto. Además he creado una variable del tipo
String que contendrá el texto que queremos desplazar.
2 #include <LiquidCrystal.h> // Entre los símbolos <> buscará en la carpeta de librerías configurada
11
12 // Textos
Función setup()
La función setup() es exactamente igual que en el ejemplo básico.
1 void setup() {
5 // Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
6 lcd.begin(COLS, ROWS);
7}
Función loop()
Aquí es donde vamos a tener toda la lógica para mostrar el texto en
movimiento. Vamos a ir viendo parte por parte con la explicación necesaria
para que entiendas cómo lo he hecho. Lo primero que hacemos es obtener
el tamaño del texto es decir, el número de caracteres que tiene nuestro
texto. Para ello utilizamos la función length() que nos devuelve un número
entero indicando su tamaño.
1 void loop() {
4 int tam_texto=texto_fila.length();
2 {
4
5 // Limpiamos pantalla
6 lcd.clear();
8 //Situamos el cursor
9 lcd.setCursor(0, 0);
10
11 // Escribimos el texto
12 lcd.print(texto);
13
14 // Esperamos
15 delay(VELOCIDAD);
16 }
3 {
4 // Limpiamos pantalla
5 lcd.clear();
7 //Situamos el cursor
8 lcd.setCursor(i, 0);
10 // Escribimos el texto
11 lcd.print(texto_fila);
12
13 // Esperamos
14 delay(VELOCIDAD);
15 }
2 for(int i=16;i>=1;i--)
3 {
4 // Limpiamos pantalla
5 lcd.clear();
7 //Situamos el cursor
8 lcd.setCursor(i, 1);
10 // Escribimos el texto
11 lcd.print(texto_fila);
12
13 // Esperamos
14 delay(VELOCIDAD);
15 }
3 {
6 // Limpiamos pantalla
7 lcd.clear();
9 //Situamos el cursor
10 lcd.setCursor(0, 1);
11
12 // Escribimos el texto
13 lcd.print(texto);
14
15 // Esperamos
16 delay(VELOCIDAD);
17 }
Código completo
A continuación te dejo el código completo. Cualquier duda o sugerencia te
agradecería que dejaras un comentario en este artículo.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
C++
#include <LiquidCrystal.h> // Entre los símbolos <> buscará en la carpeta de librerías configurada
// Definimos las constantes
// Textos
void setup() {
Serial.begin(9600);
// Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
lcd.begin(COLS, ROWS);
void loop() {
int tam_texto=texto_fila.length();
lcd.clear();
//Situamos el cursor
lcd.setCursor(0, 0);
// Escribimos el texto
lcd.print(texto);
// Esperamos
delay(VELOCIDAD);
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(i, 0);
// Escribimos el texto
lcd.print(texto_fila);
// Esperamos
delay(VELOCIDAD);
}
// Desplazamos el texto hacia la izquierda en la segunda fila
for(int i=16;i>=1;i--)
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(i, 1);
// Escribimos el texto
lcd.print(texto_fila);
// Esperamos
delay(VELOCIDAD);
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(0, 1);
// Escribimos el texto
lcd.print(texto);
// Esperamos
delay(VELOCIDAD);
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <LiquidCrystal.h> // Entre los símbolos <> buscará en la carpeta de librerías configurada
// Textos
void setup() {
// Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
lcd.begin(COLS, ROWS);
void loop() {
int tam_texto=texto_fila.length();
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(0, 0);
// Escribimos el texto
lcd.print(texto);
// Esperamos
delay(VELOCIDAD);
}
// Desplazamos el texto hacia la derecha
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(i, 0);
// Escribimos el texto
lcd.print(texto_fila);
// Esperamos
delay(VELOCIDAD);
for(int i=16;i>=1;i--)
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(i, 1);
// Escribimos el texto
lcd.print(texto_fila);
// Esperamos
delay(VELOCIDAD);
// Limpiamos pantalla
lcd.clear();
//Situamos el cursor
lcd.setCursor(0, 1);
// Escribimos el texto
lcd.print(texto);
// Esperamos
delay(VELOCIDAD);
1 /**
2 GeekFactory - "Construye tu propia tecnologia"
3 Distribucion de materiales para el desarrollo e innovacion tecnologica
4 www.geekfactory.mx
5
6 EJEMPLO BÁSICO PARA EL USO DEL LCD 16X2 A TRAVÉS DE I2C
7
8 ESTE PROGRAMA MUESTRA UN MENSAJE EN UNA PANTALLA DE 16X2 Y REALIZA UNA
9 ANIMACION
10 DE DESPLAZAMIENTO DE UN EXTREMO A OTRO DE LA PANTALLA.
11 */
12 #include <Wire.h>
13 #include <LiquidCrystal_I2C.h>
14
15 // Constructor de la librería de LCD 16x2
16 // Aqui se configuran los pines asignados a la pantalla del PCF8574
17 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
18
19 void setup()
20 {
21 // Indicar a la libreria que tenemos conectada una pantalla de 16x2
22 lcd.begin(16, 2);
23 // Mover el cursor a la primera posición de la pantalla (0, 0)
24 lcd.home ();
25 // Imprimir "Hola Mundo" en la primera linea
26 lcd.print("Hola Mundo");
27 // Mover el cursor a la segunda linea (1) primera columna
28 lcd.setCursor ( 0, 1 );
29 // Imprimir otra cadena en esta posicion
30 lcd.print("GEEKFACTORY");
31 // Esperar un segundo
32 delay(1000);
33 }
34
35 void loop()
36 {
37 // EN EL CICLO PRINCIPAL SOLAMENTE RECORREMOS EL MENSAJE DE UN LADO A OTRO
38 // Variable para conteo de ciclos
39 int i;
40
41 // Desplazar la pantalla a la derecha 2 veces
42 for ( int i = 0; i < 5; i++ ) {
43 lcd.scrollDisplayRight();
44 delay (1000);
45 }
46
47 // Desplazar la pantalla a la izquierda 2 veces
48 for ( int i = 0; i < 5; i++ ) {
49 lcd.scrollDisplayLeft();
50 delay (1000);
51 }
}
1 /**
2 GeekFactory - "Construye tu propia tecnologia"
3 Distribucion de materiales para el desarrollo e innovacion tecnologica
4 www.geekfactory.mx
5
6 EJEMPLO BÁSICO PARA EL USO DEL LCD 16X2 A TRAVÉS DE I2C
7
8 ESTE EJEMPLO MUESTRA COMO IMPRIMIR EL VALOR DE UNA VARIABLE HACIA LA
9 PANTALLA LCD de 16x2 A TRAVÉS DE I2C. ESTO PUEDE SER UTIL PARA VISUALIZAR EL
10 VALOR LEIDO POR UN SENSOR, MOSTRAR UN CONTADOR, ETC. EN GENERAR SE PUEDE
11 UTILIZAR EN CUALQUIER INTERFAZ DE USUARIO A DESARROLLAR CON LA PANTALLA
12 LCD
13 DE 16X2.
14 */
15 #include <Wire.h>
16 #include <LiquidCrystal_I2C.h>
17
18 // Constructor de la librería de LCD 16x2
19 // Aqui se configuran los pines asignados a la pantalla del PCF8574
20 // Este constructor es para usar con el modulo I2C que se muestra en las
21 // fotografias de nuestro sitio web. Para otros modelos, puede ser necesario
22 // cambiar los valores de acuerdo al esquemático del adaptador I2C. Los pines
23 // del arduino SIEMPRE son los correspondientes al I2C (SDA y SCL)
24
25 // Constructor sin control de backlight (retroiluminacion)
26 //LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
27 // Constructor con control de backlignt (retroiluminacion)
28 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
29
30 void setup()
31 {
32 // Indicar a la libreria que tenemos conectada una pantalla de 16x2
33 lcd.begin(16, 2);
34 // Mover el cursor a la primera posición de la pantalla (0, 0)
35 lcd.clear();
36 // Imprimir "Hola Mundo" en la primera linea
37 lcd.print(" GEEKFACTORY.MX ");
38 // Esperar un segundo
39 delay(1000);
40 }
41
42 void loop()
43 {
44 // Actualizar la pantalla completa cada segundo
45 lcd.clear();
46 // Imprimir encabezado
47 lcd.print(" POTENCIOMETRO ");
48
49 // Realizar la lectura analogica en A0
50 unsigned int val = analogRead(A0);
51 // Convertir a voltaje
52 float volts = (val * 5.0) / 1024.0;
53
54 // Imprimir valores en la segunda linea
55 lcd.setCursor(0, 1);
56 lcd.print(val);
57 // Imprimir el voltaje en la segunda linea, despues del valor del ADC
58 lcd.setCursor(6, 1);
59 lcd.print(volts, 1);
60
61 // Esperar un segundo antes de continuar
62 delay (1000);
}
1 byte smile[8] = {
2 0b00000000,
3 0b00001010,
4 0b00001010,
5 0b00001010,
6 0b00000000,
7 0b00010001,
8 0b00001110,
9 0b00000000,
10 };
Podemos ponernos bastante creativos con esta funcionalidad del LCD y podemos obtener
resultados bastante llamativos como se puede ver en la siguiente imagen:
El siguiente programa nos muestra como dar de alta caracteres personalizados en un LCD
16×2 por I2C con Arduino
1 /**
2 GeekFactory - "Construye tu propia tecnologia"
3 Distribucion de materiales para el desarrollo e innovacion tecnologica
4 www.geekfactory.mx
5
6 EJEMPLO BÁSICO PARA EL USO DEL LCD 16X2 A TRAVÉS DE I2C
7
8 ESTE EJEMPLO MUESTRA COMO IMPRIMIR EL VALOR DE UNA VARIABLE HACIA LA
9 PANTALLA LCD A TRAVÉS DE I2C. ESTO PUEDE SER UTIL PARA VISUALIZAR EL
10 VALOR LEIDO POR UN SENSOR, MOSTRAR UN CONTADOR, ETC.
11 */
12 #include <Wire.h>
13 #include <LiquidCrystal_I2C.h>
14
15 // Constructor de la librería de LCD 16x2
16 // Aqui se configuran los pines asignados a la pantalla del PCF8574
17 // Este constructor es para usar con el modulo I2C que se muestra en las
18 // fotografias de nuestro sitio web. Para otros modelos, puede ser necesario
19 // cambiar los valores de acuerdo al esquemático del adaptador I2C. Los pines
20 // del arduino SIEMPRE son los correspondientes al I2C (SDA y SCL)
21
22 // Constructor sin control de backlight (retroiluminacion)
23 //LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);
24 // Constructor con control de backlignt (retroiluminacion)
25 LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
26
27 //Definicion de caracteres personalizados
28 byte smile[8] = {
29 0b00000000,
30 0b00001010,
31 0b00001010,
32 0b00001010,
33 0b00000000,
34 0b00010001,
35 0b00001110,
36 0b00000000,
37 };
38
39 byte sad[8] = {
40 0b00000000,
41 0b00001010,
42 0b00001010,
43 0b00001010,
44 0b00000000,
45 0b00001110,
46 0b00010001,
47 0b00000000,
48 };
49
50 byte body[8] = {
51 0b00001110,
52 0b00001110,
53 0b00000100,
54 0b00011111,
55 0b00000100,
56 0b00001010,
57 0b00010001,
58 0b00000000,
59 };
60
61 byte arrowr[8] = {
62 0b00001000,
63 0b00000100,
64 0b00000010,
65 0b00011111,
66 0b00000010,
67 0b00000100,
68 0b00001000,
69 0b00000000,
70 };
71
72 byte arrowu[8] = {
73 0b00000100,
74 0b00001110,
75 0b00010101,
76 0b00000100,
77 0b00000100,
78 0b00000100,
79 0b00000100,
80 0b00000000,
81 };
82
83 byte arrowd[8] = {
84 0b00000100,
85 0b00000100,
86 0b00000100,
87 0b00000100,
88 0b00010101,
89 0b00001110,
90 0b00000100,
91 0b00000000,
92 };
93
94 byte arrowl[8] = {
95 0b00000010,
96 0b00000100,
97 0b00001000,
98 0b00011111,
99 0b00001000,
100 0b00000100,
101 0b00000010,
102 0b00000000,
103 };
104
105
106 void setup()
107 {
108 // Indicar a la libreria que tenemos conectada una pantalla de 16x2
109 lcd.begin(16, 2);
110
111 // Crear los caracteres personalizados en la pantalla
112 lcd.createChar (0, smile);
113 lcd.createChar (1, sad);
114 lcd.createChar (2, body);
115 lcd.createChar (3, arrowr);
116 lcd.createChar (4, arrowu);
117 lcd.createChar (5, arrowd);
118 lcd.createChar (6, arrowl);
119
120 // Mover el cursor a la primera posición de la pantalla (0, 0)
121 lcd.clear();
122 // Imprimir "Hola Mundo" en la primera linea
123 lcd.print(" GEEKFACTORY.MX ");
124 // Mover cursor
125 lcd.setCursor(0, 1);
126 // Escribir bytes a la pantalla
127 // Los códigos del 0 al 7 corresponden a los caracteres personalizados
128 lcd.write((byte)0);
129 lcd.write((byte)1);
130 lcd.write((byte)2);
131 lcd.write((byte)3);
132 lcd.write((byte)4);
133 lcd.write((byte)5);
134 lcd.write((byte)6);
135 }
136
137 void loop()
138 {
139
140 }
Conclusión
En este artículo vimos una forma más eficiente en cuanto al uso de pines para conectar una
pantalla LCD de 16 x 2 al arduino
Revisamos las conexiones a realizar y vimos que podemos convertir la pantalla estándar a
una interfaz I2C de forma permanente.
También aprendimos a realizar las conexiones en el protoboard, sin necesidad de soldar
definitivamente el adaptador I2C
Descargamos e instalamos la librería correspondiente para controlar la LCD 16×2 por I2C con
Arduino
Realizamos un ejemplo básico para mostrar texto en la pantalla
Aprendimos a mostrar el valor de las variables en la pantalla LCD
Mostramos como podemos crear caracteres personalizados y mostrarlos en la pantalla
6 Comments