SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
3-1
www.microcontroladores.com Arduino: Seguimos progresando…
UNIDAD 3: LA PANTALLA LCD
OBJETIVOS
Puedes suponer que hay una gran variedad de periféricos digitales de entrada o
de salida. Hasta ahora has usado los clásicos, sencillos y económicos
pulsadores/interruptores como dispositivos para introducir niveles lógicos “1” y “0”, y
los diodos leds para representarlos.
Sin embargo es hora de hablar de otros periféricos digitales con mucho más
renombre e importancia. En esta Unidad vamos a hablar de la pantalla LCD como
periférico de salida. Se trata de un periférico que te va a permitir visualizar cualquier
tipo de información de salida como pueden ser números, letras y símbolos.
ÁREA DE TEORÍA
T-3.1 LA PANTALLA LCD
T-3.2 EL JUEGO DE CARACTERES
T-3.3 LOS CARACTERES GRÁFICOS
T-3.4 LA LIBRERÍA LiquidCrystal.h
T-3.5 LA MEMORIA EEPROM DE DATOS
ÁREA DE PRÁCTICAS
P-3.1 CONEXIÓN DE LA PANTALLA LCD
P-3.2 EJEMPLO 3-1: Hola, mundo !!
P-3.3 EJEMPLO 3-2: Display
P-3.4 EJEMPLO 3-3: Cursor
P-3.5 EJEMPLO 3-4: Blink
P-3.6 EJEMPLO 3-5: Dirección del texto
P-3.7 EJEMPLO 3-6: Scroll
P-3.8 EJEMPLO 3-7: AutoScroll
P-3.9 EJEMPLO 3-8: Caracteres personalizados
P-3.10 EJEMPLO 3-9: Visualización
P-3.11 EJEMPLO 3-10: Visualizando número enteros
P-3.12 EJEMPLO 3-11: Visualizando número float
P-3.13 EJEMPLO 3-12: Su turno
P-3.14 EJEMPLO 3-13: Menú
3-2
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.15 EJEMPLO 3-14: Selección de opciones
P-3-16 EJEMPLO 3-15: Una última mejora
MATERIALES DE PRÁCTICAS
 Ordenador PC con WXP, W7 o W8
 Tarjeta controladora Arduino NANO
 Cable USB de tipo A a mini B para conexión con el PC
 Módulo board para el montaje de circuitos sin soldaduras
 Cables rígidos de conexión
 Porta pilas clip de 9 V (pila de 9 V opcional)
 1 x Pantalla LCD 2x16
 1 x Tira de pines macho recta
 3 x Pulsadores
 1 x Zumbador piezoeléctrico
 3 x Resistencias de carbón de 180 Ω ¼ W
 1 x Resistencia de carbón de 1K Ω ¼ W
 1 x Resistencia de carbón de 4K7 Ω ¼ W
MATERIAL COMPLEMENTARIO
 Cuestionario
 Vídeo
 Ejemplos de programación
 LCD2X16 Data Sheet
3-3
www.microcontroladores.com Arduino: Seguimos progresando…
ÁREA DE TEORíA
T-3.1 LA PANTALLA LCD
Se trata de un periférico de
salida que permite visualizar no sólo
números, sino también todo tipo de
caracteres, textos, símbolos e incluso
sencillos gráficos. Seguro que las has
visto en infinidad de aplicaciones. Las
puedes encontrar con diferentes
números de líneas y caracteres por
línea. También las hay con luz de fondo
y caracteres de diferentes colores y
tamaños.
Todas ellas llevan su propio controlador que gestiona todas las operaciones
internas. Normalmente la mayoría son compatibles con el popular HD44780 de Hitachi.
Gracias a esto, es prácticamente lo mismo utilizar una pantalla de 2 líneas por 16
caracteres (2 x 16) que otra de 4 x 20.
Vas a utilizar una pantalla LCD de 2x16. En la figura tienes una imagen de la
misma, una representación simplificada y su símbolo eléctrico.
Una pantalla LCD es un periférico digital. Sus señales se pueden conectar
directamente con las patillas de E/S del controlador y se dividen en tres grupos:
 Alimentación: Por ellas se aplica la tensión de alimentación de la pantalla.
Normalmente son las patillas GND y VCC de + 5V. También hay una tercera
patilla, VLC, por donde se aplica una tensión variable entre 0 V y +5 V con la que
se puede ajustar el contraste de la pantalla.
LCD HD44780 compatible
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
E
6RW
5RS
4
VLC
3VCC
2GND
1
L+
15
L-
16
3-4
www.microcontroladores.com Arduino: Seguimos progresando…
 Control: Son señales con las que se determina si la pantalla recibe un comando o
un dato, si va a ser leída o escrita por el controlador o si la pantalla se habilita o
no.
 Datos: Por estas señales el controlador envía a la pantalla los comandos o los
datos propiamente dichos.
La patilla nº 1 es la primera de la izquierda. Mira la siguiente tabla con la
descripción de cada una de ellas.
PATILLA
Nº
NOMBRE TIPO DESCRIPCIÓN
1 Vss Alimentación Alimentación de tierra (0 V).
2 Vdd Alimentación Alimentación positiva de +5 Vcc.
3 VLC Alimentación Ajuste de contraste. Se le aplica una tensión variable entre 0
y +5 Vcc.
4 RS Entrada Salida desde el Arduino. Selección de instrucciones/datos:
RS=0 El Arduino va a transferir instrucciones
RS=1 El Arduino va a transferir datos (códigos ASCII)
5 R/W Entrada Salida desde el Arduino. Control de lectura/escritura:
R/W=0 El Arduino realiza una escritura sobre la pantalla LCD
R/W=1 El Arduino realiza una lectura de la pantalla LCD
6 E Entrada Salida desde el Arduino. Habilitación de la pantalla:
E=0 Pantalla LCD deshabilitada (en alta impedancia)
E=1 Pantalla LCD habilitada
7-14 DB0:DB7 E/S Bus de instrucciones/datos. El Arduino transfiere a la pantalla
instrucciones o datos en función de la señal RS.
Con un interface de 8 bits se emplean las líneas DB0:DB7
Con un interface de 4 bits se emplean las líneas DB4:DB7
15 L+ Alimentación Tensión positiva para la luz de fondo (+5 Vcc).
16 L- Alimentación Tensión negativa para la luz de fondo (0 V).
Las patillas 15 y 16 son opcionales. Pueden incluso que ni estén disponibles en la
pantalla. Solo las emplean aquellas que dispongan de luz de fondo. En otras, como es
nuestro caso, no se usan.
Se trata de uno de los periféricos
más potentes y versátiles. Como ya
decíamos es capaz de visualizar todo tipo
de mensajes compuestos de texto, números
y símbolos, y producir además diferentes
efectos de visualización como
desplazamientos a izquierda y derecha,
parpadeos, scrolls, etc… Una pantalla LCD
tiene su propio controlador que la gestiona.
3-5
www.microcontroladores.com Arduino: Seguimos progresando…
En la figura tienes la pantalla LCD que vas a utilizar y que se incluye en el kit de
materiales propuestos. Se trata de una pantalla compuesta de 2 filas y 16 caracteres
por fila (2x16). También puedes apreciar cómo debes soldar una tira de 14/16 pines
macho, que te facilitará su posterior inserción sobre el módulo board de prácticas. De
esta forma podrás hacer rápidamente las conexiones con el controlador. Observa la
posición en que se encuentra la patilla número 1.
¡ATENCIÓN! Si no tienes experiencia con la soldadura, pídele a un amigo o
familiar que lo haga por ti.
T-3.2 EL JUEGO DE CARACTERES
Básicamente la comunicación entre Arduino y la pantallas LCD se realiza
mediante las patillas de datos DB0-DB7. Se pueden usar las 8 patillas o, como en
nuestro caso, únicamente 4. Se dice que vamos a trabajar con un “interface de 4 bits”.
A través de esas patillas Arduino transmite ciertos comandos o instrucciones
con los que la pantalla puede realizar diferentes efectos de visualización:
desplazamientos, parpadeos, borrado, colocación del cursor, etc… También transmite
los códigos ASCII de los caracteres que deseas visualizar. Estos códigos son de 8
bits. Si empleas un “interface de 8 bits”, cada carácter se visualiza con una única
transferencia por parte de Arduino. Con un “interface de 4 bits” hacen falta dos
transferencias por cada carácter a visualizar. Es algo más lento pero también empleas
menos cables de conexión. DE todas formas no te preocupes, las funciones que vas a
estudiar te facilitarán enormemente la tarea.
En la figura siguiente tienes una muestra del juego de caracteres que admite la
pantalla LCD, y que están establecidos por el fabricante. Una memoria ROM interna
contiene la definición de cada uno de ellos, y puede variar entre diferentes modelos o
versiones.
A la izquierda, en las filas, se representan los 4 bits de menos peso del carácter
(B3:B0). En la parte superior de la tabla, en las columnas, se representan en binario los
4 bits de más peso del carácter (B7:B4). Para codificar un carácter cualquier basta
con seleccionarlo y localizar en qué columna/fila se encuentra. Por ejemplo el carácter
‘F’ se encuentra en la columna 4 (0100) y en la fila 6 (0110). Su código binario es por
tanto 0100 0110 (0x46) que se corresponde exactamente con el código ASCII del
carácter ‘F’.
3-6
www.microcontroladores.com Arduino: Seguimos progresando…
Se comentaba anteriormente que no todas las pantallas tienen porqué tener el
mismo juego de caracteres. Efectivamente, esto depende del fabricante, modelo,
versión, etc. Lo que sí es común en todas, son los códigos correspondientes a los
caracteres ASCII estándar. Éstos se corresponden con los caracteres de las
columnas 2 (0010) a la 7 (0111).
3-7
www.microcontroladores.com Arduino: Seguimos progresando…
T-3.3 LOS CARACTERS GRÁFICOS
Puedes crear un total de hasta 8 caracteres gráficos de 5x8 puntos o “pixels”.
Cada carácter se numera del 0 al 7 y necesita un total de 8 bytes para ser definido.
Para ello, la pantalla LCD dispone de una memoria RAM interna llamada CGRAM. Una
vez que están definidos, los puedes visualizar enviando su número correspondiente
(entre 0 y 7). Recuerda, los caracteres gráficos se almacenan en RAM. Si desconectas
la alimentación del sistema estos se perderán. Arduino tendrá que volver a definirlos.
Los caracteres gráficos se definen introduciendo en sucesivas posiciones de esa
memoria CGRAM, unos bytes cuyos patrones binarios definen el carácter. La CGRAM
consiste en una memoria volátil capaz de almacenar un total de 64 bytes. Un carácter
de 5x8 puntos necesita 8 de esos bytes para ser definido. Puedes por tanto definir a
tu gusto hasta 8 caracteres diferentes (8 x 8).
En la siguiente tabla tienes definidos, a modo ejemplo, cuatro caracteres de
5x8. Se introducen en las 32 primeras posiciones de la CGRAM. El primero en las
posiciones 0 a 7, el segundo en las posiciones 8 a 15 y así sucesivamente.
Cada bit de cada uno de esos bytes que valga nivel “1”, implica que su
correspondiente punto o pixel en el LCD se activa. El primer carácter gráfico de la
CGRAM se visualiza enviando el número 0 como si de un código ASCII se tratara. El
segundo carácter se visualiza enviando el número 1 y así con todos los que hubieras
definido.
Para definirlos basta con que crees un array o matriz por cada carácter. Luego,
mediante la función crateChar() que vas a estudiar enseguida, el contenido de cada
array se copia sobre la CGRAM de la pantalla. Tienes que crear tantos arrays como
caracteres desees, cuatro en este ejemplo:
1. byte corazon [8] = {10,21,17,17,17,10,4,0};
2. byte sonrisa [8] = {B0,B01010,B0,B00100,B00000,B10001,B01110,B0};
3. byte letra_ñ [8] = {31,0,24,27,17,17,17,0};
4. byte letra_ú [8] = {2,4,17,17,17,19,13,0};
Como puedes ver, los puedes definir en decimal, binario, etc…
3-8
www.microcontroladores.com Arduino: Seguimos progresando…
CARACTER Bits en la memoria CGRAM Valor
decimal
Dirección
en CGRAM
Código del
carácter7 6 5 4 3 2 1 0
0 0 0 0 1 0 1 0 10 0
0
0 0 0 1 0 1 0 1 21 1
0 0 0 1 0 0 0 1 17 2
0 0 0 1 0 0 0 1 17 3
0 0 0 1 0 0 0 1 17 4
0 0 0 0 1 0 1 0 10 5
0 0 0 0 0 1 0 0 4 6
0 0 0 0 0 0 0 0 0 7
0 0 0 0 0 0 0 0 0 8
1
0 0 0 0 1 0 1 0 10 9
0 0 0 0 0 0 0 0 0 10
0 0 0 0 0 1 0 0 4 11
0 0 0 0 0 0 0 0 0 12
0 0 0 1 0 0 0 1 17 13
0 0 0 0 1 1 1 0 14 14
0 0 0 0 0 0 0 0 0 15
0 0 0 1 1 1 1 1 31 16
2
0 0 0 0 0 0 0 0 0 17
0 0 0 1 0 1 1 0 22 18
0 0 0 1 1 0 0 1 25 19
0 0 0 1 0 0 0 1 17 20
0 0 0 1 0 0 0 1 17 21
0 0 0 1 0 0 0 1 17 22
0 0 0 0 0 0 0 0 0 23
0 0 0 0 0 0 1 0 2 24
3
0 0 0 0 0 1 0 0 4 25
0 0 0 1 0 0 0 1 17 26
0 0 0 1 0 0 0 1 17 27
0 0 0 1 0 0 0 1 17 28
0 0 0 1 0 0 1 1 19 29
0 0 0 0 1 1 0 1 13 30
0 0 0 0 0 0 0 0 0 31
T-3.4 LA LIBRERÍA: LiquidCrystal.h
A estas alturas ya debes estar familiarizado con el concepto de “librería” y el
manejo de las múltiples funciones que puede contener. Acuérdate de la librería
“Servo.h” que usaste en el anterior curso “Arduino: La tecnología al alcance todos” para
el control de servomotores.
De las muchas librerías creadas por el equipo de Arduino, vamos a hablar ahora
de la librería “LiquidCrystal.h”. Contiene un buen número de funciones dedicadas al
control y manejo de pantallas LCD basadas en el controlador Hitachi HD44780 o
compatible.
De todas esas funciones, vamos a estudiar las más representativas e
importantes. En cualquier caso, te invito a que visites el sitio www.arduino.cc donde
encontrarás abundante información y ejemplos con todas ellas.
3-9
www.microcontroladores.com Arduino: Seguimos progresando…
Función: LiquidCrystal()
Crea una variable tipo “LiquidCrystal” y establece las conexiones entre la pantalla
LCD y el controlador Arduino. El interface entre ambos puede ser de 8 o de 4 bits, en
cuyo caso las líneas D0-D3 no se emplean. Igualmente puedes determinar si se emplea o
no la señal R/W de la pantalla. En caso de no usarse, como va a ser el nuestro, dicha
señal debes conectarla con GND. Ya lo harás en el área de prácticas.
Sintaxis:
LiquidCrystal var(RS,E,D4,D5,D6,D7); //Para interface de 4 bits sin señal R/W
LiquidCrystal var(RS,RW,E,D4,D5,D6,D7); //Para interface de 4 bits con señal R/W
LiquidCrystal var(RS,E,D0,D1,D2,D3,D4,D5,D6,D7); //Interface de 8 bits sin señal R/W
LiquidCrystal var(RS,RW,E,D0,D1,D2,D3,D4,D5,D6,D7); //Interface de 8 bits con señal R/W
var: Nombre de la variable que se asigna a la pantalla LCD que vas a controlar.
RS: Patilla del Arduino que se conecta con la señal RS de la pantalla.
RW: Patilla del Arduino que se conecta con la señal R/W de la pantalla (si es que se va
a usar).
E: Patilla del Arduino que se conecta con la señal E de la pantalla.
D0-D7: Patillas de Arduino que se conectan con las líneas de datos DB0-DB7 de la
pantalla. Si no se indican las patillas para DB0-DB3, se supone un interface
de 4 bits y únicamente se emplean las señales DB4-DB7.
Ejemplo:
LiquidCrystal lcd(7,8,9,10,11,12); //Establece la conexión de una pantalla llamada
//“lcd”. Las patillas D7 a D12 del Arduino se
//conectan con las señales RS, E, DB4, DB5, DB6
//y DB7 de la pantalla. La señal R/W se debe
//conectar con GND.
Función: begin()
Inicia la pantalla LCD y le asigna el número de filas y el número de caracteres por
fila según el modelo de que se trate. En nuestro caso vas a usar una pantalla de 16 x 2
caracteres.
3-10
www.microcontroladores.com Arduino: Seguimos progresando…
Sintaxis:
var.begin(c,f);
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
c: Número de columnas.
f: Número de filas.
Ejemplo:
LiquidCrystal lcd(7,8,9,10,11,12); //Conexiones de la pantalla LCD
lcd.begin(16,2); //La pantalla “lcd” es de 16 x 2
Función setCursor()
Coloca el cursor de la pantalla LCD en la posición deseada. A partir de ella se irán
visualizando los posteriores caracteres.
Sintaxis:
var.setCursor(c,f);
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
c: Número de columna (contando desde 0).
f: Número de fila (contando desde 0).
Ejemplo:
LiquidCrystal lcd(7,8,9,10,11,12); //Conexiones de la pantalla LCD
lcd.setCursor(3,0); //Coloca el cursor en la posición 3 (4º carácter)
//de la fila 0 (la 1ª)
Función: home()
Coloca el cursor en la primera posición de la pantalla, el ángulo superior izquierdo
(posición 0 de la fila 0). No se borra lo que se estuviera visualizando en ese momento.
3-11
www.microcontroladores.com Arduino: Seguimos progresando…
Sintaxis:
var.home();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: clear()
Borra la pantalla LCD y coloca el cursor en el ángulo superior izquierdo (posición
0 de la fila 0).
Sintaxis:
var.clear();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Ejemplo:
LiquidCrystal lcd(7,8,9,10,11,12); //Conexiones de la pantalla LCD
lcd.clear(); //Borra la pantalla
Función: write()
Escribe un carácter en la posición actual del cursor.
Sintaxis:
var.write(char);
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
char: El carácter a visualizar
Ejemplo:
3-12
www.microcontroladores.com Arduino: Seguimos progresando…
lcd.write(‘A’); //Escribe ‘A’
Función: print()
Imprime sobre el LCD a partir de la posición actual del cursor.
Sintaxis:
var.print(dato);
var.print(dato,base);
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
dato: Dato a imprimir. Puede ser char, int, long, float o string.
base: Es opcional y expresa la base de numeración deseada: BIN=Binario; DEC=Decimal
(por defecto); OCT=Octal; HEX=Hexadecimal; o N=nº de decimales en el caso de
los float (por defecto 2).
Ejemplos:
int A=19;
float PI=3.1416;
lcd.print(A,HEX); //Imprime A en hexadecimal (1910 = 1316)
lcd.print(“Hola”); //Imprime “Hola”
lcd.print(PI*2,4); //Imprime 6.2832 (cuatro decimales)
Función: cursor()
Visualiza el cursor en la pantalla LCD, en su posición actual, en forma de un guion
bajo ( _ ). A partir de aquí es donde se escribirá el siguiente carácter.
Sintaxis:
var.cursor();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
3-13
www.microcontroladores.com Arduino: Seguimos progresando…
Función: noCursor()
Oculta la visualización del cursor de la pantalla LCD.
Sintaxis:
var.noCursor();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: blink()
Visualiza el cursor sobre la pantalla, en su posición actual, como un símbolo sólido
( ▓ ) intermitente. A partir de aquí es donde se escribirá el siguiente carácter.
Sintaxis:
var.blink();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: noBlink()
Oculta la visualización del cursor sólido ( ▓ ) intermitente.
Sintaxis:
var.noBlink();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función noDisplay()
Apaga la pantalla LCD sin perder ni el contenido que hubiera en ella ni la posición
actual del cursor.
3-14
www.microcontroladores.com Arduino: Seguimos progresando…
Sintaxis:
var.noDisplay();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: display()
Conecta la LCD restaurando el contenido que hubiera en ella antes de ejecutar
noDisplay().
Sintaxis:
var.display();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función scrollDisplayLeft()
Desplaza el contenido que visualiza la pantalla en ese momento (texto y posición
del cursor) una posición a la izquierda.
Sintaxis:
var.scrollDisplayLeft();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función scrollDisplayRight()
Desplaza el contenido que visualiza la pantalla en ese momento (texto y posición
del cursor) una posición a la derecha.
Sintaxis:
3-15
www.microcontroladores.com Arduino: Seguimos progresando…
var.scrollDisplayRight();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: leftToRight()
Establece la dirección de escritura sobre la pantalla como de izquierda a derecha
(por defecto). Esto implica que los caracteres se van escribiendo de izquierda a
derecha sin afectar a los que ya están escritos.
Sintaxis:
var.LeftToRight();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: rightToLeft()
Establece la dirección de escritura sobre la pantalla como de derecha a
izquierda. Esto implica que los caracteres se van escribiendo de derecha a izquierda sin
afectar a los que ya están escritos.
Sintaxis:
var.RightToLeft();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función autoscroll()
Activa el scroll o desplazamiento automático de la visualización. Cada vez que se
manda un carácter a la pantalla, este se visualiza y a continuación se desplaza una
posición todo el contenido que hubiera en ella. Si la dirección actual es de izquierda a
derecha (leftToRight()), el contenido se desplaza hacia la izquierda. Si la dirección
3-16
www.microcontroladores.com Arduino: Seguimos progresando…
actual es de derecha a izquierda (rightToLeft()), el contenido se desplaza hacia la
derecha.
Sintaxis:
var.autoscroll();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función noAutoscroll()
Desactiva el scroll o desplazamiento automático de la visualización.
Sintaxis:
var.noAutoscroll();
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
Función: createChar()
Crea un carácter definido por el usuario. Se pueden crear un total de 8
caracteres de 5 x 8 pixels y numerados del 0 al 7. La apariencia o diseño de un carácter
se determina en una matriz de 8 bytes, uno por cada fila. Los 5 bits de menos peso de
cada byte se corresponden con los 5 pixels que forman cada fila del carácter. Una vez
creado un carácter, se puede visualizar en la pantalla indicando simplemente su número.
Sintaxis:
var.createChar(n,dato);
var: Es el nombre que define a la pantalla en cuestión (establecido en
LyquidCrystal()).
n: Expresa el número del carácter a definir (del 0 al 7).
dato: Es el nombre de la matriz que contiene los bytes que definen el carácter
personalizado.
3-17
www.microcontroladores.com Arduino: Seguimos progresando…
Ejemplo:
byte flecha [8] = {B00100, B01110, B10101, B00100, B00100, B00100, B00100,
B00100 }; //Crea la matriz “flecha” con 8 bytes que definen
//el nuevo carácter gráfico
lcd.createChar(0,flecha); //Crea el nuevo carácter nº 0 con el contenido definido
//en el array “flecha”
….
lcd.write(byte(0)); //Visualiza el carácter gráfico nº 0 (la flecha)
T-3.5 LA MEMORIA EEPROM DE DATOS
Aunque parece que no tiene relación con lo que se está tratando en esta Unidad,
y la verdad es que no la tiene, es un buen momento para hablar de la memoria EEPROM
de datos del controlador Arduino NANO. Con ella vas a poder mejorar y potenciar
infinidad de proyectos presentes y futuros.
Los controladores que conforman las diferentes tarjetas Arduino integran una
memoria un poco especial. Se trata de la memoria EEPROM. Sobre ella se pueden leer
o escribir datos de 8 bits comprendidos entre 0
y 255. La particularidad es que aunque falte la
tensión de alimentación, toda la información que
hubieras guardado en ella, se mantiene. No se
borra.
Por tanto es ideal para almacenar información que puede ser modificada pero
NO volátil como: códigos de acceso, parámetros de configuración, números de
teléfono, claves, etc… Como ya sabes, la tarjeta Arduino NANO incorpora un
controlador modelo ATmega 328 que integra una memoria EEPROM de 1KB (1024
bytes).
Su manejo, a estas alturas, te va a resultar muy fácil. Dispones de una librería,
la, “EEPROM.h”, que contiene dos únicas funciones con las que puedes leer y escribir
datos en esta memoria. Como de costumbre, esa librería la debes incluir en tus
programas mediante #include <EEPROM.h>.
3-18
www.microcontroladores.com Arduino: Seguimos progresando…
Función: read()
Lee el dato de 8 bits que haya en la posición de la memoria EEPROM indicada.
Sintaxis:
EEPROM.read(dir);
dir: Se trata de la dirección que vas a leer de la EEPROM. Como tiene 1024
posiciones (KB), el rango posible es de 0 a 1023.
Ejemplo:
#include EEPROM.h //Incluye la librería
byte valor; //Variable de 8 bits
valor = EEPROM.read(279); //Leer el byte que hay en la posición 279
Función: write()
Escribe un valor de 8 bits (0-255) en cualquiera de las posiciones disponibles en
la EEPROM.
Sintaxis:
EEPROM.write(dir, valor);
dir: Se trata de la dirección de la EEPROM sobre la que vas a escribir. Como tiene
1024 posiciones (KB), el rango posible es de 0 a 1023.
valor: Es el valor de 8 bits (entre 0 y 255) que deseas escribir en la dirección
indicada.
Ejemplo:
EEPROM.write(982, 33); //Escribir el valor 33 sobre la posición 982
IMPORTANTE: Se estima en unos 100000 los ciclos de escritura posibles sobre una
EEPROM. Cuídalo porque si lo sobrepasas, puede quedar inutilizada. Cada ciclo de
escritura puede consumir unos 3,3 mS. Tenlo en cuenta.
3-19
www.microcontroladores.com Arduino: Seguimos progresando…
ÁREA DE PRÁCTICAS
P-3.1 CONEXIÓN DE LA PANTALLA LCD
Vas a empezar el área de prácticas con la conexión de la pantalla LCD al
controlador Arduino NANO sobre el módulo board. Presta atención a las conexiones y
procura realizar un buen montaje. La pantalla LCD la vas a mantener prácticamente en
todos los ejemplos de las Unidades restantes de este curso. En la figura tienes el
esquema eléctrico.
Las patillas D9:D12 de Arduino se conectan con las señales DB4:DB7 de la
pantalla. Bajo el control de tu programa Arduino enviará las instrucciones y los
caracteres a visualizar. D7 y D8 controlan las señales RS y E respectivamente. RW
debe conectarse obligatoriamente con GND.
La pantalla se alimenta con +5 V mediante la patilla GND y VCC. Por la patilla
VLC, la patilla 3, se debe aplicar una tensión variable entre 0 y 5 V para ajustar el
contraste. Se suele conectar con GND a través de una resistencia, R1. El valor de esta
resistencia puede variar en función del modelo de pantalla.
Como no se puede prever cuál va a caer en tus manos exactamente, vamos a
empezar con una resistencia de 1K Ω. Si observas que los caracteres aparecen
demasiado contrastados y apenas se aprecian, cambia el valor de esta resistencia por
otra superior, por ejemplo de 4K7 Ω. Entre estos dos valores seguro que das con el
contraste apropiado.
U1
ARDUINO NANO
D1
1
D0
2
RESET
3
GND
4
D2
5
D3
6
D4
7
D5
8
D6
9
D7
10
D8
11
D9
12
D10
13
D11
14
D12
15
D13
163V3
17AREF
18A0
19A1
20A2
21A3
22A4
23A5
24A6
25A7
26+5V
27RESET
28GND
29VIN
30
LCD HD44780 compatible
U2 PANTALLA LCD
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
E
6RW
5RS
4
VLC
3VCC
2GND
1
L+
15
L-
16
+ 5 V
R1
1K
+ 5 V
3-20
www.microcontroladores.com Arduino: Seguimos progresando…
Las patillas 15 y 16 de la pantalla LCD sirven para controlar la luz de fondo, pero
esta sólo estará disponible según el modelo. No es nuestro caso. Es posible que tu
pantalla ni tan siquiera tenga estas dos patillas y, si las tuviera, las dejarás sin
conexión.
Para empezar con el montaje práctico es recomendable que pongas primero los
cables de conexión tal y como se muestra en la figura y en la fotografía. La pantalla se
insertará después y es posible que tape a alguno de ellos. Fíjate bien.
3-21
www.microcontroladores.com Arduino: Seguimos progresando…
Ahora coloca la pantalla LCD asegurándote que su patilla 1 se inserta en la
misma columna de orificios donde se encuentra el cable negro de alimentación GND, la
patilla 2 en la columna del cable rojo de +5 V, la 3 en la de la resistencia, etc…
3-22
www.microcontroladores.com Arduino: Seguimos progresando…
Seguro que se te ocurre otra disposición de los componentes diferente a la
expuesta, incluso puede que mejor. Sin embargo debes de tener en cuenta que la
pantalla LCD se va a quedar conectada prácticamente en todo lo que queda de curso.
Por ello debes de prever espacio en el módulo board para los futuros componentes y
periféricos que vas a ir empleando.
Repito. Si tuvieras que soldar la tira de pines sobre la pantalla LCD, debieras de
hacerlo con el máximo cuidado posible. Si no te ves capaz o no estás seguro, mejor que
te lo haga un familiar o un amigo.
P-3.2 EJEMPLO 3-1: Hola, mundo !!
Aquí tienes el primer
programa con el que vas a sacar el
clásico mensaje sobre la pantalla
LCD.
Mediante #include se
incluye la librería de funciones
del LCD. Con LiquidCrystal() se
establece la variable lcd y se
configuran las conexiones.
Observa que se corresponden con
las del esquema eléctrico del
montaje que acabas de realizar.
En setup(), con la función
lcd.begin(16,2), seleccionas el
modelo de pantalla (16 x 2).
Por último, el programa principal loop() transmite el mensaje a visualizar y lo
hace mediante la función lcd.print(). A continuación se introduce en un bucle sin fin,
while(1);, que no hace nada útil y lo puedes considerar como el fin de la ejecución.
¡¡ Que fácil !! ¿No te lo parece? A partir de ahora vas a disponer de un potente
periférico que te permitirá visualizar todo tipo de información. En la fotografía tienes
el resultado de cargar y ejecutar este primer ejemplo.
3-23
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.3 EJEMPLO 3-2: Display
Con objeto de que te familiarices con algunas de las funciones incluidas en la
librería “LiquidCrystal.h”, este y los siguientes ejemplos te van a proponer su empleo
para que veas los diferentes efectos que producen.
En este caso vas a emplear las funciones noDisplay() y display() para
deshabilitar o activar a la pantalla. Esto provoca que la pantalla quede en blanco o
visualice el contenido que tuviera.
P-3.4 EJEMPLO 3-3: Cursor
El cursor indica el lugar de la pantalla donde se escribirá el siguiente carácter
que se le envíe. Este ejemplo utiliza las funciones cursor() y noCursor() para conseguir
que éste se visualice o no.
En principio el cursor se visualiza como si fuera un guion bajo ( _ ).
3-24
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.5 EJEMPLO 3-4: Blink
El cursor también se puede mostrar como un símbolo sólido ( ▓ ) intermitente
que indica la posición donde se escribirá el siguiente carácter que se envíe a la
pantalla. Para ello dispones de las funciones blink() y noBlink().
La intermitencia del cursor es espontánea. La realiza automáticamente la propia
pantalla LCD. En el ejemplo, con objeto de comprobar el efecto de estas funciones, se
mantiene el cursor activado (y parpadeando) durante 3 segundos, y desactivado otro
tanto.
P-3.6 EJEMPLO 3-5: Dirección del texto
Mediante las funciones leftToRight() y rightToLeft() puedes determinar cómo
deseas que se vaya escribiendo y visualizando el texto sobre la pantalla. Puedes
hacerlo de izquierda a derecha o de derecha a izquierda. Por defecto se escribe de
izquierda a derecha, como lo hacemos nosotros habitualmente sobre el papel.
El ejemplo te muestra otra forma de visualizar un mensaje. En esta ocasión el
texto se introduce en un array:
char Mens1[]={"I'Love Arduino"}; //Mensaje a visualizar
Mediante dos bucles for() cada carácter del array se va enviando
secuencialmente a la pantalla utilizando la función lcd.write(), a intervalos de 0.150”.
En el primer bucle for() el cursor se coloca en la posición 0 de la fila 0 (la primera del
LCD) y se van escribiendo de izquierda a derecha, lo normal. En el segundo bucle for()
el cursor se pone en la posición 15 de la fila 1, la última posición de la segunda, y los
caracteres se van escribiendo de derecha a izquierda.
Luego se realiza una temporización de 3” y la pantalla se borra con la función
lcd.clear(). Tras una nueva temporización de 1” el ciclo se vuelve a repetir.
En la siguiente fotografía tienes el resultado de ejecutar este ejemplo. ¿Lo
entiendes? Piensa en los efectos de visualización que puedes conseguir.
3-25
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.7 EJEMPLO 3-6: Scroll
Con las funciones scrollDisplayLeft() y scrollDisplayRight() también puedes
conseguir unos bonitos efectos de visualización que, seguro, has visto en carteles
publicitarios.
Estas funciones desplazan a izquierda o derecha todo lo que en ese momento se
esté visualizando en la pantalla. En este ejemplo se visualiza un texto en las dos líneas
de la misma. Luego todo el texto se va desplazando a la izquierda, posición a posición, y
a intervalos de 0.3”.
Cuando el último carácter desaparece por la izquierda, el texto se vuelve a
desplazar hasta que desaparece por la derecha. Finalmente, desplazando a la
izquierda, todo el texto se vuelve a dejar en la posición original y se realiza una
secuencia de intermitencia activando/desactivando la pantalla.
P-3.8 EJEMPLO 3-7: AutoScroll
Otro ejemplo que te permitirá crear llamativos efectos de visualización. En esta
ocasión, mediante las funciones autoscroll() y noAutoscroll() se habilita o no el
desplazamiento automático del contenido de la pantalla.
3-26
www.microcontroladores.com Arduino: Seguimos progresando…
Cuando se activa el auto scroll, el desplazamiento se realiza automáticamente
cada vez que se escribe un carácter en la pantalla. En el ejemplo anterior tenías que
emplear expresamente las funciones scrollDisplayLeft() o scrollDisplayRight().
Este desplazamiento automático también puede ser a la izquierda (por defecto)
o a la derecha. Todo depende de qué función leftToRight() o RightToLeft() es la que
has usado por última vez.
En el ejemplo se visualizan dos mensajes que están previamente definidos en
sendos arrays:
char Mens1[]={"ARDUINO"}; //Mensaje 1
char Mens2[]={"I'Love you"}; //Mensaje 2
Un primer bucle for() va escribiendo sobre la pantalla, carácter a carácter, el
contenido del array “Mens1”. Por defecto y, de forma natural, estos se escriben de
izquierda a derecha a intervalos de 0.3”.
El segundo bucle for() va escribiendo en la pantalla, carácter a carácter, el
contenido del array “Mens2”. Sin embargo, antes de ejecutar este bucle, el cursor se
coloca en la última posición de la segunda fila de la pantalla, y se ejecuta la función
lcd.autoscroll(). Los caracteres se van escribiendo de izquierda a derecha, pero por
cada uno de ellos, se produce un desplazamiento automático a la izquierda (por
defecto) del contenido actual de la pantalla.
Finalmente se ejecuta lcd.noAutoscroll() y, tras borrar la pantalla mediante
lcd.clear(), el ciclo se vuelve a repetir. Bonito ¿no?
P-3-9 EJEMPLO 3-8: Caracteres personalizados
Para terminar con estos ejemplos que nos han ido mostrando el uso de las
funciones más relevantes de la librería “LiquidCrystal.h” vas a crear y utilizar tus
propios caracteres gráficos.
Concretamente vas a crear 5 caracteres: un corazón, un rostro alegre, otro
serio, un muñeco con los brazos hacia abajo y otro con los brazos hacia arriba.
3-27
www.microcontroladores.com Arduino: Seguimos progresando…
Cada uno de ellos se define mediante un array. Así que tienes estos cinco:
corazon[8] ; alegre[8]; serio[8]; abajo[8] y arriba[8]. El contenido de cada uno de
ellos describe en binario qué puntos o pixels se debe activar en cada caso.
En el setup(), mediante funciones lcd.createChar() se transfiere a la memoria
CGRAM de la pantalla el contenido de los arrays. En total se transfieren 40 bytes, 8
por cada carácter. Además, a cada uno de ellos se le asigna un número del 0 al 5:
lcd.createChar(0, corazon); //Crea el nuevo carácter nº 0
lcd.createChar(1, alegre); //Crea el nuevo carácter nº 1
lcd.createChar(2, serio); //Crea el nuevo carácter nº 2
lcd.createChar(3, abajo); //Crea el nuevo carácter nº 3
lcd.createChar(4, arriba); //Crea el nuevo carácter nº 4
Por último cada carácter gráfico se puede visualizar en la pantalla, en la posición
actual del cursor, como si de un carácter ASCII normal se tratara. Basta emplear la
función lcd.write(n), donde n es el número asignado a cada uno, en el ejemplo del 0 al
5.
Carga el programa y comprueba su funcionamiento ¿Te gusta? Pues ya sabes, a
partir de ahora puedes enriquecer tus presentaciones añadiendo caracteres gráficos
diseñados por ti mismo, máximo 8.
P-3.10 EJEMPLO 3-9: Visualización
Ejemplo con un indudable interés práctico. Vas a crear un nexo de unión entre el
canal serie de tu ordenador PC y la pantalla LCD. En medio se encuentra, como no, el
controlador Arduino NANO.
El Arduino hace de puente. Por un lado se conecta mediante el interface USB
con el PC. Por otro lado se conecta con la pantalla como se ha venido haciendo hasta
ahora. Desde el PC, empleando en monitor serial, vas a transmitir vía serie un conjunto
de caracteres que serán recibidos por el Arduino y visualizados en la pantalla LCD
según van llegando.
Observa la siguiente figura con el resultado de la ejecución del ejemplo.
3-28
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.11 EJEMPLO 3-10: Visualizando número enteros
Ya has visto que sobre la pantalla LCD puedes visualizar todo tipo de textos y
caracteres, pudiendo además realizar diferentes efectos de visualización. Por
supuesto que también puedes visualizar números.
Este ejemplo va a ir visualizando los números del 0 al 15 secuencialmente, cada
vez que se accione un pulsador conectado en la patilla D2. Además, el número en
cuestión se visualizará en decimal, hexadecimal y en binario. Aquí tienes el esquema
eléctrico con la conexión entre Arduino NANO, la pantalla y el pulsador SW1.
Este sería el montaje práctico. Debes empezar a familiarizarte con ellos.
U1
ARDUINO NANO
D1
1
D0
2
RESET
3
GND
4
D2
5
D3
6
D4
7
D5
8
D6
9
D7
10
D8
11
D9
12
D10
13
D11
14
D12
15
D13
163V3
17AREF
18A0
19A1
20A2
21A3
22A4
23A5
24A6
25A7
26+5V
27RESET
28GND
29VIN
30
LCD HD44780 compatible
U2 PANTALLA LCD
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
E
6RW
5RS
4
VLC
3VCC
2GND
1
L+
15
L-
16
+ 5 V
R1
1K
+ 5 V
SW1
AVANCE
3-29
www.microcontroladores.com Arduino: Seguimos progresando…
Con tus conocimientos actuales, el programa no te resultara complejo en
absoluto. Un pequeño detalle que seguro lo usarás con frecuencia. Como los números a
visualizar tienen distinta longitud, una buena idea es borrar totalmente la línea de la
pantalla LCD donde se van a visualizar. Esto se puede hacer completando con espacios
en blanco (“ “ ) la línea en cuestión. Así no quedan “restos”.
Analiza el programa. Prueba a retirar las dos primeras funciones de loop() y
observa lo que pasa. Seguro que ahora entiendes a qué me refiero con eso de los
“restos”.
P-3.12 EJEMPLO 3-11: Visualizando número float
Siguiendo la línea del ejemplo anterior, ahora se trata de visualizar números
float. Concretamente se va a visualizar con dos decimales el resultado de la raíz
cuadrada del número N y, con cuatro decimales, el producto de N por la constante PI
(3.1416). El número N va avanzando secuencialmente con cada pulsación del pulsador
en D2 y evoluciona de 0 al 9.
Tanto el esquema eléctrico como el del montaje práctico es el mismo que el que
empleaste en el ejemplo 3-10 anterior.
3-30
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.13 EJEMPLO 3-12: Su turno
Aquí tienes un buen ejemplo de marcado
carácter comercial. Se trata de emular el
funcionamiento de una máquina controladora de
turnos, como los que seguramente habrás visto en
supermercados, centros sanitarios, de atención al
cliente, etc…
En la pantalla LCD aparecerá el turno actual comprendido entre 0 y 99.
Mediante un pulsador conectado en la patilla de entrada D2, el operario hace avanzar
al siguiente turno cuando corresponda. ¿Qué te aporta como novedad este ejemplo?
Pues que vas a emplear la memoria EEPROM por vez primera. Efectivamente, el turno
actual se va a guardar sobre esta memoria.
¿Qué se consigue con esto? Pues que en caso de fallo de
alimentación o bien del cierre del establecimiento, cuando se
active nuevamente el sistema, automáticamente se
“recordará” el último turno en que se quedó la máquina. No
hará falta que el operario tenga que avanzar manualmente
para llegar a él. Aprovecha la característica de NO volatilidad
de la memoria EEPROM. Buena idea ¿no?
Para hacerlo más realista, conectamos un zumbador en la patilla de salida D13.
Aquí tienes el esquema eléctrico…
U1
ARDUINO NANO
D1
1
D0
2
RESET
3
GND
4
D2
5
D3
6
D4
7
D5
8
D6
9
D7
10
D8
11
D9
12
D10
13
D11
14
D12
15
D13
163V3
17AREF
18A0
19A1
20A2
21A3
22A4
23A5
24A6
25A7
26+5V
27RESET
28GND
29VIN
30
LCD HD44780 compatible
U2 PANTALLA LCD
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
E
6RW
5RS
4
VLC
3VCC
2GND
1
L+
15
L-
16
+ 5 V
R1
1K
+ 5 V
SW1
AVANCE
R2
180
ZUMBADOR -
+
3-31
www.microcontroladores.com Arduino: Seguimos progresando…
… y ahora el montaje práctico.
El zumbador es otro periférico de salida que emite una señal sonora cada vez
que se le aplica un nivel lógico. Recuerda que este nivel puede ser un “1” o un “0”,
dependiendo de cómo lo conectes. En este caso se emplea un nivel “1”. Tiene dos
patillas, una de las cuales está marcada con el signo “+”. Presta atención.
En la función setup() que se ejecuta al conectar la alimentación o pulsar el
RESET, se lee la memoria EEPROM, concretamente su posición 0, donde se supone que
está el número que representa el último turno. Este debe estar comprendido entre 0 y
99.
Cada vez que se acciona el pulsador SW1 se genera una señal sonora gracias a la
función beep(), el turno se incrementa en una unidad y se almacena en la posición 0 de
la memoria EEPROM no volátil. Ya queda registrado el nuevo turno para el caso de que
haya un fallo de alimentación.
Prueba el ejemplo. Observa el turno que aparece en la pantalla, y cómo se va
incrementando con cada pulsación a la vez que se genera un pitido. Desconecta la
alimentación y vuelve a conectarla. En la pantalla deberá aparecer el último. ¡¡ Bien por
la memoria EEPROM no volátil !!
3-32
www.microcontroladores.com Arduino: Seguimos progresando…
P-3.14 EJEMPLO 3-13: Menú
La pantalla LCD es un periférico ideal para hacer un intuitivo interface con el
usuario. Efectivamente, puedes visualizar menús de opciones que te permitan
seleccionar entre las diferentes tareas a ejecutar.
En este ejemplo se trata de realizar un menú de 6 opciones que van apareciendo
secuencialmente sobre la pantalla. Para ello, mediante dos pulsadores de avance y
retroceso, podrás navegar por el menú para visualizar todas las opciones disponibles.
Este es el esquema eléctrico.
Las conexiones entre el Arduino y la pantalla son las mismas que las empleadas
hasta ahora. En esta ocasión se emplea un segundo pulsador, SW2. Con SW1
conectado con la entrada D2, se van avanzando las opciones que se visualizan sobre la
pantalla. Con SW2 conectado en la patilla D3 se va retrocediendo. Ambas patillas se
configuran como entradas pull-up. Te ahorras tener que poner externamente las dos
resistencias correspondientes.
La pantalla realiza un efecto de “scroll vertical” para visualizar secuencialmente
todas las opciones disponibles en el menú.
También se emplea un zumbador piezoeléctrico conectado con la patilla de
salida D13. Cualquier pulsación tanto en SW1 como en SW2 generará una señal
acústica. Aquí tienes el montaje práctico.
U1
ARDUINO NANO
D1
1
D0
2
RESET
3
GND
4
D2
5
D3
6
D4
7
D5
8
D6
9
D7
10
D8
11
D9
12
D10
13
D11
14
D12
15
D13
163V3
17AREF
18A0
19A1
20A2
21A3
22A4
23A5
24A6
25A7
26+5V
27RESET
28GND
29VIN
30
LCD HD44780 compatible
U2 PANTALLA LCD
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
E
6RW
5RS
4
VLC
3VCC
2GND
1
L+
15
L-
16
+ 5 V
R1
1K
+ 5 V
SW1 AVANCE
R2
180
ZUMBADOR -
+
SW2 RETROCESO
3-33
www.microcontroladores.com Arduino: Seguimos progresando…
Ahora vas a echar un vistazo al programa. El tratar de estudiarlo y analizarlo
para comprender su funcionamiento lo dejo en tus manos. Simplemente decirte que se
ha procurado dar una solución lo más sencilla y didáctica posible. Seguramente no será
la única ni la mejor. Espero que tú, con tu iniciativa, la mejores notablemente.
Inicio:
Al principio del todo se incluye la librería “LiquidCrystal.h” y se establecen las
conexiones con la pantalla. No hay nada nuevo. Se declaran las variables “Opcion” y
“N_opciones”. La primera contiene la opción en curso seleccionada y la segunda el
número de opciones que tiene el menú. También se declara un array llamado “flecha”
que define un carácter gráfico.
Funciones:
En el proyecto se han creado dos funciones: visualiza() y beep(). La primera visualiza
en la pantalla el mensaje correspondiente a la opción en curso actual según el valor de
la variable “Opcion”. La función beep() no es nueva. Emite una señal acústica.
Setup():
3-34
www.microcontroladores.com Arduino: Seguimos progresando…
Configura las patillas D2 y D3 como entradas con Pull-Up interna, la patilla D13 como
salida, la pantalla LCD con 2 líneas de 16 caracteres y por último genera el carácter
gráfico nº 0 (flecha). Tampoco hay nada especialmente relevante.
loop():
 Empieza borrando la pantalla y visualizando el carácter gráfico nº 0 (la flecha).
 Coloca el cursor en la primera fila y visualiza la opción en curso según la
variable “Opcion”. Hace uso de la función visualiza().
 Coloca el cursor en la segunda fila y visualiza la siguiente opción (Opcion+1).
Nuevamente hace uso de la función visualiza().
 Espera a que se pulse uno de los dos pulsadores SW1 o SW2 conectados en D2
y en D3.
 Si se pulsa D2 se eliminan rebotes y se espera a que se suelte. Genera un pitido
e incremente la variable “Opción”. Se apunta a la siguiente opción del menú.
 Si se pulsa D3 se eliminan rebotes y se espera a que se suelte. Genera un
pitido y decrementa la variable “Opción”. Se apunta a la opción previa del menú.
Grábalo y comprueba su funcionamiento ¿te gusta? Pues espero que esto te
sirva como idea para un buen número de futuros proyectos.
P-3.15 EJEMPLO 3-14: Selección de opciones
Considéralo una prolongación del ejemplo anterior. Mira el esquema eléctrico.
SW3 SELECCION
U1
ARDUINO NANO
D1
1
D0
2
RESET
3
GND
4
D2
5
D3
6
D4
7
D5
8
D6
9
D7
10
D8
11
D9
12
D10
13
D11
14
D12
15
D13
163V3
17AREF
18A0
19A1
20A2
21A3
22A4
23A5
24A6
25A7
26+5V
27RESET
28GND
29VIN
30
LCD HD44780 compatible
U2 PANTALLA LCD
D0
7
D1
8
D2
9
D3
10
D4
11
D5
12
D6
13
D7
14
E
6RW
5RS
4
VLC
3VCC
2GND
1
L+
15
L-
16
+ 5 V
+ 5 V
R1
1K
SW1 AVANCE
R2
180
ZUMBADOR
-
+
SW2 RETROCESO
D2 VERDE
D1 ROJO
R4 180
R3 180
3-35
www.microcontroladores.com Arduino: Seguimos progresando…
Se añade un pulsador más, el SW3 conectado en D4, con el que se ejecuta la
opción seleccionada en ese momento. También se añaden dos leds, uno rojo y otro
verde conectados en D5 y D6, que permiten ver el resultado de ejecutar esa opción.
Aquí tienes el montaje práctico.
El programa es muy parecido al del ejemplo anterior. Únicamente se ha añadido
la función Ejecuta() que se ejecutará cada vez que se pulse el pulsador SW3. Esta
nueva función evalúa el valor de la variable “Opcion”. Según cual sea la opción
actualmente seleccionada, se ejecuta la tarea apropiada y consistente en activar o
desactivar los leds rojo y verde conectados con las salidas D5 y D6.
Si estudiaste y entendiste el programa del ejemplo anterior, este no te debe
suponer problema alguno ¿verdad?
P-3-16 EJEMPLO 3-15: Una última mejora
Imagina una aplicación en la que el menú no sólo tiene 6 opciones como hasta
ahora. Tiene varias decenas de ellas. Cada vez que enciendes el sistema o generas un
reinicio mediante RESET, siempre empieza desde la primera opción y deberás
desplazarte hasta localizar la que deseas.
3-36
www.microcontroladores.com Arduino: Seguimos progresando…
Quizá podría interesarte que cada vez que se reinicie, la pantalla LCD muestre
la última opción que hubieras seleccionado y no tengas que andar buscándola. ¿Qué te
parece?
Nuevamente tienes la posibilidad de usar la memoria EEPROM de datos.
Efectivamente, cada vez que se selecciona una nueva opción, esta se registra en la
memoria EEPROM. Al fin y al cabo cada opción se representa ni más ni menos que con
un número guardado en la variable “Opcion”.
Cada vez que se reinicie el sistema, esa variable se carga con el valor registrado
previamente en la memoria EEPROM. En este ejemplo vas a usar la posición 1 de las
1024 disponibles.
Graba el programa y comprueba su funcionamiento. Selecciona y ejecuta
diferentes opciones. Luego apaga el sistema y vuelve a encenderlo. Observa que
siempre aparece la última opción que seleccionaste.
Es de esperar que estos ejemplos te sugieran un buen número de aplicaciones.
Animo y emplea tu imaginación e ingenio.

Más contenido relacionado

La actualidad más candente

Introducción a sistemas multiusuarios y en redes
Introducción a sistemas multiusuarios y en redesIntroducción a sistemas multiusuarios y en redes
Introducción a sistemas multiusuarios y en redesjuan jose carrera aldaz
 
Monitores Y Tarjetas Graficas
Monitores Y Tarjetas GraficasMonitores Y Tarjetas Graficas
Monitores Y Tarjetas GraficasReyescrack
 
Presentación1
Presentación1Presentación1
Presentación1rodri_95
 
Tarjetas gráficas y monitores
Tarjetas gráficas y monitoresTarjetas gráficas y monitores
Tarjetas gráficas y monitoresJaCk0
 
TF Grupo N° 4- 2012
TF Grupo N° 4- 2012TF Grupo N° 4- 2012
TF Grupo N° 4- 2012Tecnica6cmb
 
Te sirve para pc desktop
Te sirve para pc desktopTe sirve para pc desktop
Te sirve para pc desktopDiego Romero
 
Clase informatica
Clase informaticaClase informatica
Clase informaticaXaviOrantes
 
Clase informatica
Clase informaticaClase informatica
Clase informaticaXaviOrantes
 
Clase informatica
Clase informaticaClase informatica
Clase informaticapedrotf
 
Clases de informatica
Clases de informaticaClases de informatica
Clases de informaticaABACO
 

La actualidad más candente (16)

Introducción a sistemas multiusuarios y en redes
Introducción a sistemas multiusuarios y en redesIntroducción a sistemas multiusuarios y en redes
Introducción a sistemas multiusuarios y en redes
 
TF Grupo N° 1- 2012
TF Grupo N° 1- 2012TF Grupo N° 1- 2012
TF Grupo N° 1- 2012
 
Monitores Y Tarjetas Graficas
Monitores Y Tarjetas GraficasMonitores Y Tarjetas Graficas
Monitores Y Tarjetas Graficas
 
TF Grupo N° 2- 2012
TF Grupo N° 2- 2012TF Grupo N° 2- 2012
TF Grupo N° 2- 2012
 
Presentación1
Presentación1Presentación1
Presentación1
 
Tarjetas
TarjetasTarjetas
Tarjetas
 
Teoria lcd
Teoria lcd Teoria lcd
Teoria lcd
 
Auxiliatura 13 11
Auxiliatura 13 11Auxiliatura 13 11
Auxiliatura 13 11
 
Tarjetas gráficas y monitores
Tarjetas gráficas y monitoresTarjetas gráficas y monitores
Tarjetas gráficas y monitores
 
TF Grupo N° 4- 2012
TF Grupo N° 4- 2012TF Grupo N° 4- 2012
TF Grupo N° 4- 2012
 
Te sirve para pc desktop
Te sirve para pc desktopTe sirve para pc desktop
Te sirve para pc desktop
 
Clase informatica
Clase informaticaClase informatica
Clase informatica
 
Clase informatica
Clase informaticaClase informatica
Clase informatica
 
Informatica 1.0
Informatica 1.0Informatica 1.0
Informatica 1.0
 
Clase informatica
Clase informaticaClase informatica
Clase informatica
 
Clases de informatica
Clases de informaticaClases de informatica
Clases de informatica
 

Similar a Pantalla LCD Arduino

Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdfsarasepulveda12
 
Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdfSamantaPerea
 
Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdfSvrvGongora
 
Informe practica ecuaciones # 6
Informe practica ecuaciones # 6Informe practica ecuaciones # 6
Informe practica ecuaciones # 6Freddy Cuasapaz
 
Lcd con arduino texto en movimiento paso a paso
Lcd con arduino texto en movimiento paso a pasoLcd con arduino texto en movimiento paso a paso
Lcd con arduino texto en movimiento paso a pasoMaxwellGrahamBell
 
Clase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y ComunicacionesClase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y ComunicacionesAldo Hernán Zanabria Gálvez
 
Mantenimiento 2
Mantenimiento 2Mantenimiento 2
Mantenimiento 2taniamabel
 
Tarjeta arduino (1)
Tarjeta arduino (1)Tarjeta arduino (1)
Tarjeta arduino (1)Daniel Plaza
 
Mantenimiento 2
Mantenimiento 2Mantenimiento 2
Mantenimiento 2taniamabel
 
La computadora-Yanina Bamberg
La computadora-Yanina BambergLa computadora-Yanina Bamberg
La computadora-Yanina Bambergyanibamberg07
 
PresentacióN Hadware Y PeriféRicos
PresentacióN Hadware Y PeriféRicosPresentacióN Hadware Y PeriféRicos
PresentacióN Hadware Y PeriféRicosxaviermv
 
CONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINO
CONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINOCONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINO
CONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINOFernando Marcos Marcos
 
Guia de aprendizajewindows
Guia de aprendizajewindowsGuia de aprendizajewindows
Guia de aprendizajewindowsJulian Agudelo
 

Similar a Pantalla LCD Arduino (20)

Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdf
 
Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdf
 
Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdf
 
Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdf
 
Electricidad y electrónica.pdf
Electricidad y electrónica.pdfElectricidad y electrónica.pdf
Electricidad y electrónica.pdf
 
Informe practica ecuaciones # 6
Informe practica ecuaciones # 6Informe practica ecuaciones # 6
Informe practica ecuaciones # 6
 
Lcd con arduino texto en movimiento paso a paso
Lcd con arduino texto en movimiento paso a pasoLcd con arduino texto en movimiento paso a paso
Lcd con arduino texto en movimiento paso a paso
 
Arqui practica 5
Arqui practica 5Arqui practica 5
Arqui practica 5
 
Clase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y ComunicacionesClase de Tecnologías de la Información y Comunicaciones
Clase de Tecnologías de la Información y Comunicaciones
 
Tarjeta arduino
Tarjeta arduinoTarjeta arduino
Tarjeta arduino
 
Tarjeta arduino
Tarjeta arduinoTarjeta arduino
Tarjeta arduino
 
Mantenimiento 2
Mantenimiento 2Mantenimiento 2
Mantenimiento 2
 
Tarjeta arduino (1)
Tarjeta arduino (1)Tarjeta arduino (1)
Tarjeta arduino (1)
 
Tarjeta arduino (1)
Tarjeta arduino (1)Tarjeta arduino (1)
Tarjeta arduino (1)
 
Tarjeta arduino (1)
Tarjeta arduino (1)Tarjeta arduino (1)
Tarjeta arduino (1)
 
Mantenimiento 2
Mantenimiento 2Mantenimiento 2
Mantenimiento 2
 
La computadora-Yanina Bamberg
La computadora-Yanina BambergLa computadora-Yanina Bamberg
La computadora-Yanina Bamberg
 
PresentacióN Hadware Y PeriféRicos
PresentacióN Hadware Y PeriféRicosPresentacióN Hadware Y PeriféRicos
PresentacióN Hadware Y PeriféRicos
 
CONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINO
CONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINOCONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINO
CONTADOR BINARIO DESCENDENTE DE 8 BITS CON ARDUINO
 
Guia de aprendizajewindows
Guia de aprendizajewindowsGuia de aprendizajewindows
Guia de aprendizajewindows
 

Último

Taller construcción de Prototipos Uno uML
Taller construcción de Prototipos Uno uMLTaller construcción de Prototipos Uno uML
Taller construcción de Prototipos Uno uMLAderMogollonLuna
 
PPT obligaciones ambientales oefa minan.pptx
PPT obligaciones ambientales oefa minan.pptxPPT obligaciones ambientales oefa minan.pptx
PPT obligaciones ambientales oefa minan.pptxDanmherJoelAlmironPu
 
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdfTALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdfMiguelGomez900779
 
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVOPERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVOAdrianaBernal82
 
La Navegacion en Internet con navegadores
La Navegacion en Internet con navegadoresLa Navegacion en Internet con navegadores
La Navegacion en Internet con navegadoresjosegillopez
 
Presentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.pptPresentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.pptCARLOSAXELVENTURAVID
 
linea de tiempo television y su avance en los años
linea de tiempo television y su avance en los añoslinea de tiempo television y su avance en los años
linea de tiempo television y su avance en los añosMaraPazCrdenas
 
PLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primariaPLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primariajosevilla696981
 

Último (8)

Taller construcción de Prototipos Uno uML
Taller construcción de Prototipos Uno uMLTaller construcción de Prototipos Uno uML
Taller construcción de Prototipos Uno uML
 
PPT obligaciones ambientales oefa minan.pptx
PPT obligaciones ambientales oefa minan.pptxPPT obligaciones ambientales oefa minan.pptx
PPT obligaciones ambientales oefa minan.pptx
 
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdfTALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
TALLER SOBRE METODOLOGÍAS DE DESARROLLO DE SOFTWARE..pdf
 
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVOPERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
PERFIL SECRETARIAL - SECRETARIADO EJECUTIVO
 
La Navegacion en Internet con navegadores
La Navegacion en Internet con navegadoresLa Navegacion en Internet con navegadores
La Navegacion en Internet con navegadores
 
Presentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.pptPresentación Materiales para la Construcción.ppt
Presentación Materiales para la Construcción.ppt
 
linea de tiempo television y su avance en los años
linea de tiempo television y su avance en los añoslinea de tiempo television y su avance en los años
linea de tiempo television y su avance en los años
 
PLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primariaPLANIFICACION ANUAL , año 2024. nivel primaria
PLANIFICACION ANUAL , año 2024. nivel primaria
 

Pantalla LCD Arduino

  • 1. 3-1 www.microcontroladores.com Arduino: Seguimos progresando… UNIDAD 3: LA PANTALLA LCD OBJETIVOS Puedes suponer que hay una gran variedad de periféricos digitales de entrada o de salida. Hasta ahora has usado los clásicos, sencillos y económicos pulsadores/interruptores como dispositivos para introducir niveles lógicos “1” y “0”, y los diodos leds para representarlos. Sin embargo es hora de hablar de otros periféricos digitales con mucho más renombre e importancia. En esta Unidad vamos a hablar de la pantalla LCD como periférico de salida. Se trata de un periférico que te va a permitir visualizar cualquier tipo de información de salida como pueden ser números, letras y símbolos. ÁREA DE TEORÍA T-3.1 LA PANTALLA LCD T-3.2 EL JUEGO DE CARACTERES T-3.3 LOS CARACTERES GRÁFICOS T-3.4 LA LIBRERÍA LiquidCrystal.h T-3.5 LA MEMORIA EEPROM DE DATOS ÁREA DE PRÁCTICAS P-3.1 CONEXIÓN DE LA PANTALLA LCD P-3.2 EJEMPLO 3-1: Hola, mundo !! P-3.3 EJEMPLO 3-2: Display P-3.4 EJEMPLO 3-3: Cursor P-3.5 EJEMPLO 3-4: Blink P-3.6 EJEMPLO 3-5: Dirección del texto P-3.7 EJEMPLO 3-6: Scroll P-3.8 EJEMPLO 3-7: AutoScroll P-3.9 EJEMPLO 3-8: Caracteres personalizados P-3.10 EJEMPLO 3-9: Visualización P-3.11 EJEMPLO 3-10: Visualizando número enteros P-3.12 EJEMPLO 3-11: Visualizando número float P-3.13 EJEMPLO 3-12: Su turno P-3.14 EJEMPLO 3-13: Menú
  • 2. 3-2 www.microcontroladores.com Arduino: Seguimos progresando… P-3.15 EJEMPLO 3-14: Selección de opciones P-3-16 EJEMPLO 3-15: Una última mejora MATERIALES DE PRÁCTICAS  Ordenador PC con WXP, W7 o W8  Tarjeta controladora Arduino NANO  Cable USB de tipo A a mini B para conexión con el PC  Módulo board para el montaje de circuitos sin soldaduras  Cables rígidos de conexión  Porta pilas clip de 9 V (pila de 9 V opcional)  1 x Pantalla LCD 2x16  1 x Tira de pines macho recta  3 x Pulsadores  1 x Zumbador piezoeléctrico  3 x Resistencias de carbón de 180 Ω ¼ W  1 x Resistencia de carbón de 1K Ω ¼ W  1 x Resistencia de carbón de 4K7 Ω ¼ W MATERIAL COMPLEMENTARIO  Cuestionario  Vídeo  Ejemplos de programación  LCD2X16 Data Sheet
  • 3. 3-3 www.microcontroladores.com Arduino: Seguimos progresando… ÁREA DE TEORíA T-3.1 LA PANTALLA LCD Se trata de un periférico de salida que permite visualizar no sólo números, sino también todo tipo de caracteres, textos, símbolos e incluso sencillos gráficos. Seguro que las has visto en infinidad de aplicaciones. Las puedes encontrar con diferentes números de líneas y caracteres por línea. También las hay con luz de fondo y caracteres de diferentes colores y tamaños. Todas ellas llevan su propio controlador que gestiona todas las operaciones internas. Normalmente la mayoría son compatibles con el popular HD44780 de Hitachi. Gracias a esto, es prácticamente lo mismo utilizar una pantalla de 2 líneas por 16 caracteres (2 x 16) que otra de 4 x 20. Vas a utilizar una pantalla LCD de 2x16. En la figura tienes una imagen de la misma, una representación simplificada y su símbolo eléctrico. Una pantalla LCD es un periférico digital. Sus señales se pueden conectar directamente con las patillas de E/S del controlador y se dividen en tres grupos:  Alimentación: Por ellas se aplica la tensión de alimentación de la pantalla. Normalmente son las patillas GND y VCC de + 5V. También hay una tercera patilla, VLC, por donde se aplica una tensión variable entre 0 V y +5 V con la que se puede ajustar el contraste de la pantalla. LCD HD44780 compatible D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 E 6RW 5RS 4 VLC 3VCC 2GND 1 L+ 15 L- 16
  • 4. 3-4 www.microcontroladores.com Arduino: Seguimos progresando…  Control: Son señales con las que se determina si la pantalla recibe un comando o un dato, si va a ser leída o escrita por el controlador o si la pantalla se habilita o no.  Datos: Por estas señales el controlador envía a la pantalla los comandos o los datos propiamente dichos. La patilla nº 1 es la primera de la izquierda. Mira la siguiente tabla con la descripción de cada una de ellas. PATILLA Nº NOMBRE TIPO DESCRIPCIÓN 1 Vss Alimentación Alimentación de tierra (0 V). 2 Vdd Alimentación Alimentación positiva de +5 Vcc. 3 VLC Alimentación Ajuste de contraste. Se le aplica una tensión variable entre 0 y +5 Vcc. 4 RS Entrada Salida desde el Arduino. Selección de instrucciones/datos: RS=0 El Arduino va a transferir instrucciones RS=1 El Arduino va a transferir datos (códigos ASCII) 5 R/W Entrada Salida desde el Arduino. Control de lectura/escritura: R/W=0 El Arduino realiza una escritura sobre la pantalla LCD R/W=1 El Arduino realiza una lectura de la pantalla LCD 6 E Entrada Salida desde el Arduino. Habilitación de la pantalla: E=0 Pantalla LCD deshabilitada (en alta impedancia) E=1 Pantalla LCD habilitada 7-14 DB0:DB7 E/S Bus de instrucciones/datos. El Arduino transfiere a la pantalla instrucciones o datos en función de la señal RS. Con un interface de 8 bits se emplean las líneas DB0:DB7 Con un interface de 4 bits se emplean las líneas DB4:DB7 15 L+ Alimentación Tensión positiva para la luz de fondo (+5 Vcc). 16 L- Alimentación Tensión negativa para la luz de fondo (0 V). Las patillas 15 y 16 son opcionales. Pueden incluso que ni estén disponibles en la pantalla. Solo las emplean aquellas que dispongan de luz de fondo. En otras, como es nuestro caso, no se usan. Se trata de uno de los periféricos más potentes y versátiles. Como ya decíamos es capaz de visualizar todo tipo de mensajes compuestos de texto, números y símbolos, y producir además diferentes efectos de visualización como desplazamientos a izquierda y derecha, parpadeos, scrolls, etc… Una pantalla LCD tiene su propio controlador que la gestiona.
  • 5. 3-5 www.microcontroladores.com Arduino: Seguimos progresando… En la figura tienes la pantalla LCD que vas a utilizar y que se incluye en el kit de materiales propuestos. Se trata de una pantalla compuesta de 2 filas y 16 caracteres por fila (2x16). También puedes apreciar cómo debes soldar una tira de 14/16 pines macho, que te facilitará su posterior inserción sobre el módulo board de prácticas. De esta forma podrás hacer rápidamente las conexiones con el controlador. Observa la posición en que se encuentra la patilla número 1. ¡ATENCIÓN! Si no tienes experiencia con la soldadura, pídele a un amigo o familiar que lo haga por ti. T-3.2 EL JUEGO DE CARACTERES Básicamente la comunicación entre Arduino y la pantallas LCD se realiza mediante las patillas de datos DB0-DB7. Se pueden usar las 8 patillas o, como en nuestro caso, únicamente 4. Se dice que vamos a trabajar con un “interface de 4 bits”. A través de esas patillas Arduino transmite ciertos comandos o instrucciones con los que la pantalla puede realizar diferentes efectos de visualización: desplazamientos, parpadeos, borrado, colocación del cursor, etc… También transmite los códigos ASCII de los caracteres que deseas visualizar. Estos códigos son de 8 bits. Si empleas un “interface de 8 bits”, cada carácter se visualiza con una única transferencia por parte de Arduino. Con un “interface de 4 bits” hacen falta dos transferencias por cada carácter a visualizar. Es algo más lento pero también empleas menos cables de conexión. DE todas formas no te preocupes, las funciones que vas a estudiar te facilitarán enormemente la tarea. En la figura siguiente tienes una muestra del juego de caracteres que admite la pantalla LCD, y que están establecidos por el fabricante. Una memoria ROM interna contiene la definición de cada uno de ellos, y puede variar entre diferentes modelos o versiones. A la izquierda, en las filas, se representan los 4 bits de menos peso del carácter (B3:B0). En la parte superior de la tabla, en las columnas, se representan en binario los 4 bits de más peso del carácter (B7:B4). Para codificar un carácter cualquier basta con seleccionarlo y localizar en qué columna/fila se encuentra. Por ejemplo el carácter ‘F’ se encuentra en la columna 4 (0100) y en la fila 6 (0110). Su código binario es por tanto 0100 0110 (0x46) que se corresponde exactamente con el código ASCII del carácter ‘F’.
  • 6. 3-6 www.microcontroladores.com Arduino: Seguimos progresando… Se comentaba anteriormente que no todas las pantallas tienen porqué tener el mismo juego de caracteres. Efectivamente, esto depende del fabricante, modelo, versión, etc. Lo que sí es común en todas, son los códigos correspondientes a los caracteres ASCII estándar. Éstos se corresponden con los caracteres de las columnas 2 (0010) a la 7 (0111).
  • 7. 3-7 www.microcontroladores.com Arduino: Seguimos progresando… T-3.3 LOS CARACTERS GRÁFICOS Puedes crear un total de hasta 8 caracteres gráficos de 5x8 puntos o “pixels”. Cada carácter se numera del 0 al 7 y necesita un total de 8 bytes para ser definido. Para ello, la pantalla LCD dispone de una memoria RAM interna llamada CGRAM. Una vez que están definidos, los puedes visualizar enviando su número correspondiente (entre 0 y 7). Recuerda, los caracteres gráficos se almacenan en RAM. Si desconectas la alimentación del sistema estos se perderán. Arduino tendrá que volver a definirlos. Los caracteres gráficos se definen introduciendo en sucesivas posiciones de esa memoria CGRAM, unos bytes cuyos patrones binarios definen el carácter. La CGRAM consiste en una memoria volátil capaz de almacenar un total de 64 bytes. Un carácter de 5x8 puntos necesita 8 de esos bytes para ser definido. Puedes por tanto definir a tu gusto hasta 8 caracteres diferentes (8 x 8). En la siguiente tabla tienes definidos, a modo ejemplo, cuatro caracteres de 5x8. Se introducen en las 32 primeras posiciones de la CGRAM. El primero en las posiciones 0 a 7, el segundo en las posiciones 8 a 15 y así sucesivamente. Cada bit de cada uno de esos bytes que valga nivel “1”, implica que su correspondiente punto o pixel en el LCD se activa. El primer carácter gráfico de la CGRAM se visualiza enviando el número 0 como si de un código ASCII se tratara. El segundo carácter se visualiza enviando el número 1 y así con todos los que hubieras definido. Para definirlos basta con que crees un array o matriz por cada carácter. Luego, mediante la función crateChar() que vas a estudiar enseguida, el contenido de cada array se copia sobre la CGRAM de la pantalla. Tienes que crear tantos arrays como caracteres desees, cuatro en este ejemplo: 1. byte corazon [8] = {10,21,17,17,17,10,4,0}; 2. byte sonrisa [8] = {B0,B01010,B0,B00100,B00000,B10001,B01110,B0}; 3. byte letra_ñ [8] = {31,0,24,27,17,17,17,0}; 4. byte letra_ú [8] = {2,4,17,17,17,19,13,0}; Como puedes ver, los puedes definir en decimal, binario, etc…
  • 8. 3-8 www.microcontroladores.com Arduino: Seguimos progresando… CARACTER Bits en la memoria CGRAM Valor decimal Dirección en CGRAM Código del carácter7 6 5 4 3 2 1 0 0 0 0 0 1 0 1 0 10 0 0 0 0 0 1 0 1 0 1 21 1 0 0 0 1 0 0 0 1 17 2 0 0 0 1 0 0 0 1 17 3 0 0 0 1 0 0 0 1 17 4 0 0 0 0 1 0 1 0 10 5 0 0 0 0 0 1 0 0 4 6 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 8 1 0 0 0 0 1 0 1 0 10 9 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 1 0 0 4 11 0 0 0 0 0 0 0 0 0 12 0 0 0 1 0 0 0 1 17 13 0 0 0 0 1 1 1 0 14 14 0 0 0 0 0 0 0 0 0 15 0 0 0 1 1 1 1 1 31 16 2 0 0 0 0 0 0 0 0 0 17 0 0 0 1 0 1 1 0 22 18 0 0 0 1 1 0 0 1 25 19 0 0 0 1 0 0 0 1 17 20 0 0 0 1 0 0 0 1 17 21 0 0 0 1 0 0 0 1 17 22 0 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 1 0 2 24 3 0 0 0 0 0 1 0 0 4 25 0 0 0 1 0 0 0 1 17 26 0 0 0 1 0 0 0 1 17 27 0 0 0 1 0 0 0 1 17 28 0 0 0 1 0 0 1 1 19 29 0 0 0 0 1 1 0 1 13 30 0 0 0 0 0 0 0 0 0 31 T-3.4 LA LIBRERÍA: LiquidCrystal.h A estas alturas ya debes estar familiarizado con el concepto de “librería” y el manejo de las múltiples funciones que puede contener. Acuérdate de la librería “Servo.h” que usaste en el anterior curso “Arduino: La tecnología al alcance todos” para el control de servomotores. De las muchas librerías creadas por el equipo de Arduino, vamos a hablar ahora de la librería “LiquidCrystal.h”. Contiene un buen número de funciones dedicadas al control y manejo de pantallas LCD basadas en el controlador Hitachi HD44780 o compatible. De todas esas funciones, vamos a estudiar las más representativas e importantes. En cualquier caso, te invito a que visites el sitio www.arduino.cc donde encontrarás abundante información y ejemplos con todas ellas.
  • 9. 3-9 www.microcontroladores.com Arduino: Seguimos progresando… Función: LiquidCrystal() Crea una variable tipo “LiquidCrystal” y establece las conexiones entre la pantalla LCD y el controlador Arduino. El interface entre ambos puede ser de 8 o de 4 bits, en cuyo caso las líneas D0-D3 no se emplean. Igualmente puedes determinar si se emplea o no la señal R/W de la pantalla. En caso de no usarse, como va a ser el nuestro, dicha señal debes conectarla con GND. Ya lo harás en el área de prácticas. Sintaxis: LiquidCrystal var(RS,E,D4,D5,D6,D7); //Para interface de 4 bits sin señal R/W LiquidCrystal var(RS,RW,E,D4,D5,D6,D7); //Para interface de 4 bits con señal R/W LiquidCrystal var(RS,E,D0,D1,D2,D3,D4,D5,D6,D7); //Interface de 8 bits sin señal R/W LiquidCrystal var(RS,RW,E,D0,D1,D2,D3,D4,D5,D6,D7); //Interface de 8 bits con señal R/W var: Nombre de la variable que se asigna a la pantalla LCD que vas a controlar. RS: Patilla del Arduino que se conecta con la señal RS de la pantalla. RW: Patilla del Arduino que se conecta con la señal R/W de la pantalla (si es que se va a usar). E: Patilla del Arduino que se conecta con la señal E de la pantalla. D0-D7: Patillas de Arduino que se conectan con las líneas de datos DB0-DB7 de la pantalla. Si no se indican las patillas para DB0-DB3, se supone un interface de 4 bits y únicamente se emplean las señales DB4-DB7. Ejemplo: LiquidCrystal lcd(7,8,9,10,11,12); //Establece la conexión de una pantalla llamada //“lcd”. Las patillas D7 a D12 del Arduino se //conectan con las señales RS, E, DB4, DB5, DB6 //y DB7 de la pantalla. La señal R/W se debe //conectar con GND. Función: begin() Inicia la pantalla LCD y le asigna el número de filas y el número de caracteres por fila según el modelo de que se trate. En nuestro caso vas a usar una pantalla de 16 x 2 caracteres.
  • 10. 3-10 www.microcontroladores.com Arduino: Seguimos progresando… Sintaxis: var.begin(c,f); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). c: Número de columnas. f: Número de filas. Ejemplo: LiquidCrystal lcd(7,8,9,10,11,12); //Conexiones de la pantalla LCD lcd.begin(16,2); //La pantalla “lcd” es de 16 x 2 Función setCursor() Coloca el cursor de la pantalla LCD en la posición deseada. A partir de ella se irán visualizando los posteriores caracteres. Sintaxis: var.setCursor(c,f); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). c: Número de columna (contando desde 0). f: Número de fila (contando desde 0). Ejemplo: LiquidCrystal lcd(7,8,9,10,11,12); //Conexiones de la pantalla LCD lcd.setCursor(3,0); //Coloca el cursor en la posición 3 (4º carácter) //de la fila 0 (la 1ª) Función: home() Coloca el cursor en la primera posición de la pantalla, el ángulo superior izquierdo (posición 0 de la fila 0). No se borra lo que se estuviera visualizando en ese momento.
  • 11. 3-11 www.microcontroladores.com Arduino: Seguimos progresando… Sintaxis: var.home(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: clear() Borra la pantalla LCD y coloca el cursor en el ángulo superior izquierdo (posición 0 de la fila 0). Sintaxis: var.clear(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Ejemplo: LiquidCrystal lcd(7,8,9,10,11,12); //Conexiones de la pantalla LCD lcd.clear(); //Borra la pantalla Función: write() Escribe un carácter en la posición actual del cursor. Sintaxis: var.write(char); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). char: El carácter a visualizar Ejemplo:
  • 12. 3-12 www.microcontroladores.com Arduino: Seguimos progresando… lcd.write(‘A’); //Escribe ‘A’ Función: print() Imprime sobre el LCD a partir de la posición actual del cursor. Sintaxis: var.print(dato); var.print(dato,base); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). dato: Dato a imprimir. Puede ser char, int, long, float o string. base: Es opcional y expresa la base de numeración deseada: BIN=Binario; DEC=Decimal (por defecto); OCT=Octal; HEX=Hexadecimal; o N=nº de decimales en el caso de los float (por defecto 2). Ejemplos: int A=19; float PI=3.1416; lcd.print(A,HEX); //Imprime A en hexadecimal (1910 = 1316) lcd.print(“Hola”); //Imprime “Hola” lcd.print(PI*2,4); //Imprime 6.2832 (cuatro decimales) Función: cursor() Visualiza el cursor en la pantalla LCD, en su posición actual, en forma de un guion bajo ( _ ). A partir de aquí es donde se escribirá el siguiente carácter. Sintaxis: var.cursor(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()).
  • 13. 3-13 www.microcontroladores.com Arduino: Seguimos progresando… Función: noCursor() Oculta la visualización del cursor de la pantalla LCD. Sintaxis: var.noCursor(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: blink() Visualiza el cursor sobre la pantalla, en su posición actual, como un símbolo sólido ( ▓ ) intermitente. A partir de aquí es donde se escribirá el siguiente carácter. Sintaxis: var.blink(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: noBlink() Oculta la visualización del cursor sólido ( ▓ ) intermitente. Sintaxis: var.noBlink(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función noDisplay() Apaga la pantalla LCD sin perder ni el contenido que hubiera en ella ni la posición actual del cursor.
  • 14. 3-14 www.microcontroladores.com Arduino: Seguimos progresando… Sintaxis: var.noDisplay(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: display() Conecta la LCD restaurando el contenido que hubiera en ella antes de ejecutar noDisplay(). Sintaxis: var.display(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función scrollDisplayLeft() Desplaza el contenido que visualiza la pantalla en ese momento (texto y posición del cursor) una posición a la izquierda. Sintaxis: var.scrollDisplayLeft(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función scrollDisplayRight() Desplaza el contenido que visualiza la pantalla en ese momento (texto y posición del cursor) una posición a la derecha. Sintaxis:
  • 15. 3-15 www.microcontroladores.com Arduino: Seguimos progresando… var.scrollDisplayRight(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: leftToRight() Establece la dirección de escritura sobre la pantalla como de izquierda a derecha (por defecto). Esto implica que los caracteres se van escribiendo de izquierda a derecha sin afectar a los que ya están escritos. Sintaxis: var.LeftToRight(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: rightToLeft() Establece la dirección de escritura sobre la pantalla como de derecha a izquierda. Esto implica que los caracteres se van escribiendo de derecha a izquierda sin afectar a los que ya están escritos. Sintaxis: var.RightToLeft(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función autoscroll() Activa el scroll o desplazamiento automático de la visualización. Cada vez que se manda un carácter a la pantalla, este se visualiza y a continuación se desplaza una posición todo el contenido que hubiera en ella. Si la dirección actual es de izquierda a derecha (leftToRight()), el contenido se desplaza hacia la izquierda. Si la dirección
  • 16. 3-16 www.microcontroladores.com Arduino: Seguimos progresando… actual es de derecha a izquierda (rightToLeft()), el contenido se desplaza hacia la derecha. Sintaxis: var.autoscroll(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función noAutoscroll() Desactiva el scroll o desplazamiento automático de la visualización. Sintaxis: var.noAutoscroll(); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). Función: createChar() Crea un carácter definido por el usuario. Se pueden crear un total de 8 caracteres de 5 x 8 pixels y numerados del 0 al 7. La apariencia o diseño de un carácter se determina en una matriz de 8 bytes, uno por cada fila. Los 5 bits de menos peso de cada byte se corresponden con los 5 pixels que forman cada fila del carácter. Una vez creado un carácter, se puede visualizar en la pantalla indicando simplemente su número. Sintaxis: var.createChar(n,dato); var: Es el nombre que define a la pantalla en cuestión (establecido en LyquidCrystal()). n: Expresa el número del carácter a definir (del 0 al 7). dato: Es el nombre de la matriz que contiene los bytes que definen el carácter personalizado.
  • 17. 3-17 www.microcontroladores.com Arduino: Seguimos progresando… Ejemplo: byte flecha [8] = {B00100, B01110, B10101, B00100, B00100, B00100, B00100, B00100 }; //Crea la matriz “flecha” con 8 bytes que definen //el nuevo carácter gráfico lcd.createChar(0,flecha); //Crea el nuevo carácter nº 0 con el contenido definido //en el array “flecha” …. lcd.write(byte(0)); //Visualiza el carácter gráfico nº 0 (la flecha) T-3.5 LA MEMORIA EEPROM DE DATOS Aunque parece que no tiene relación con lo que se está tratando en esta Unidad, y la verdad es que no la tiene, es un buen momento para hablar de la memoria EEPROM de datos del controlador Arduino NANO. Con ella vas a poder mejorar y potenciar infinidad de proyectos presentes y futuros. Los controladores que conforman las diferentes tarjetas Arduino integran una memoria un poco especial. Se trata de la memoria EEPROM. Sobre ella se pueden leer o escribir datos de 8 bits comprendidos entre 0 y 255. La particularidad es que aunque falte la tensión de alimentación, toda la información que hubieras guardado en ella, se mantiene. No se borra. Por tanto es ideal para almacenar información que puede ser modificada pero NO volátil como: códigos de acceso, parámetros de configuración, números de teléfono, claves, etc… Como ya sabes, la tarjeta Arduino NANO incorpora un controlador modelo ATmega 328 que integra una memoria EEPROM de 1KB (1024 bytes). Su manejo, a estas alturas, te va a resultar muy fácil. Dispones de una librería, la, “EEPROM.h”, que contiene dos únicas funciones con las que puedes leer y escribir datos en esta memoria. Como de costumbre, esa librería la debes incluir en tus programas mediante #include <EEPROM.h>.
  • 18. 3-18 www.microcontroladores.com Arduino: Seguimos progresando… Función: read() Lee el dato de 8 bits que haya en la posición de la memoria EEPROM indicada. Sintaxis: EEPROM.read(dir); dir: Se trata de la dirección que vas a leer de la EEPROM. Como tiene 1024 posiciones (KB), el rango posible es de 0 a 1023. Ejemplo: #include EEPROM.h //Incluye la librería byte valor; //Variable de 8 bits valor = EEPROM.read(279); //Leer el byte que hay en la posición 279 Función: write() Escribe un valor de 8 bits (0-255) en cualquiera de las posiciones disponibles en la EEPROM. Sintaxis: EEPROM.write(dir, valor); dir: Se trata de la dirección de la EEPROM sobre la que vas a escribir. Como tiene 1024 posiciones (KB), el rango posible es de 0 a 1023. valor: Es el valor de 8 bits (entre 0 y 255) que deseas escribir en la dirección indicada. Ejemplo: EEPROM.write(982, 33); //Escribir el valor 33 sobre la posición 982 IMPORTANTE: Se estima en unos 100000 los ciclos de escritura posibles sobre una EEPROM. Cuídalo porque si lo sobrepasas, puede quedar inutilizada. Cada ciclo de escritura puede consumir unos 3,3 mS. Tenlo en cuenta.
  • 19. 3-19 www.microcontroladores.com Arduino: Seguimos progresando… ÁREA DE PRÁCTICAS P-3.1 CONEXIÓN DE LA PANTALLA LCD Vas a empezar el área de prácticas con la conexión de la pantalla LCD al controlador Arduino NANO sobre el módulo board. Presta atención a las conexiones y procura realizar un buen montaje. La pantalla LCD la vas a mantener prácticamente en todos los ejemplos de las Unidades restantes de este curso. En la figura tienes el esquema eléctrico. Las patillas D9:D12 de Arduino se conectan con las señales DB4:DB7 de la pantalla. Bajo el control de tu programa Arduino enviará las instrucciones y los caracteres a visualizar. D7 y D8 controlan las señales RS y E respectivamente. RW debe conectarse obligatoriamente con GND. La pantalla se alimenta con +5 V mediante la patilla GND y VCC. Por la patilla VLC, la patilla 3, se debe aplicar una tensión variable entre 0 y 5 V para ajustar el contraste. Se suele conectar con GND a través de una resistencia, R1. El valor de esta resistencia puede variar en función del modelo de pantalla. Como no se puede prever cuál va a caer en tus manos exactamente, vamos a empezar con una resistencia de 1K Ω. Si observas que los caracteres aparecen demasiado contrastados y apenas se aprecian, cambia el valor de esta resistencia por otra superior, por ejemplo de 4K7 Ω. Entre estos dos valores seguro que das con el contraste apropiado. U1 ARDUINO NANO D1 1 D0 2 RESET 3 GND 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 10 D8 11 D9 12 D10 13 D11 14 D12 15 D13 163V3 17AREF 18A0 19A1 20A2 21A3 22A4 23A5 24A6 25A7 26+5V 27RESET 28GND 29VIN 30 LCD HD44780 compatible U2 PANTALLA LCD D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 E 6RW 5RS 4 VLC 3VCC 2GND 1 L+ 15 L- 16 + 5 V R1 1K + 5 V
  • 20. 3-20 www.microcontroladores.com Arduino: Seguimos progresando… Las patillas 15 y 16 de la pantalla LCD sirven para controlar la luz de fondo, pero esta sólo estará disponible según el modelo. No es nuestro caso. Es posible que tu pantalla ni tan siquiera tenga estas dos patillas y, si las tuviera, las dejarás sin conexión. Para empezar con el montaje práctico es recomendable que pongas primero los cables de conexión tal y como se muestra en la figura y en la fotografía. La pantalla se insertará después y es posible que tape a alguno de ellos. Fíjate bien.
  • 21. 3-21 www.microcontroladores.com Arduino: Seguimos progresando… Ahora coloca la pantalla LCD asegurándote que su patilla 1 se inserta en la misma columna de orificios donde se encuentra el cable negro de alimentación GND, la patilla 2 en la columna del cable rojo de +5 V, la 3 en la de la resistencia, etc…
  • 22. 3-22 www.microcontroladores.com Arduino: Seguimos progresando… Seguro que se te ocurre otra disposición de los componentes diferente a la expuesta, incluso puede que mejor. Sin embargo debes de tener en cuenta que la pantalla LCD se va a quedar conectada prácticamente en todo lo que queda de curso. Por ello debes de prever espacio en el módulo board para los futuros componentes y periféricos que vas a ir empleando. Repito. Si tuvieras que soldar la tira de pines sobre la pantalla LCD, debieras de hacerlo con el máximo cuidado posible. Si no te ves capaz o no estás seguro, mejor que te lo haga un familiar o un amigo. P-3.2 EJEMPLO 3-1: Hola, mundo !! Aquí tienes el primer programa con el que vas a sacar el clásico mensaje sobre la pantalla LCD. Mediante #include se incluye la librería de funciones del LCD. Con LiquidCrystal() se establece la variable lcd y se configuran las conexiones. Observa que se corresponden con las del esquema eléctrico del montaje que acabas de realizar. En setup(), con la función lcd.begin(16,2), seleccionas el modelo de pantalla (16 x 2). Por último, el programa principal loop() transmite el mensaje a visualizar y lo hace mediante la función lcd.print(). A continuación se introduce en un bucle sin fin, while(1);, que no hace nada útil y lo puedes considerar como el fin de la ejecución. ¡¡ Que fácil !! ¿No te lo parece? A partir de ahora vas a disponer de un potente periférico que te permitirá visualizar todo tipo de información. En la fotografía tienes el resultado de cargar y ejecutar este primer ejemplo.
  • 23. 3-23 www.microcontroladores.com Arduino: Seguimos progresando… P-3.3 EJEMPLO 3-2: Display Con objeto de que te familiarices con algunas de las funciones incluidas en la librería “LiquidCrystal.h”, este y los siguientes ejemplos te van a proponer su empleo para que veas los diferentes efectos que producen. En este caso vas a emplear las funciones noDisplay() y display() para deshabilitar o activar a la pantalla. Esto provoca que la pantalla quede en blanco o visualice el contenido que tuviera. P-3.4 EJEMPLO 3-3: Cursor El cursor indica el lugar de la pantalla donde se escribirá el siguiente carácter que se le envíe. Este ejemplo utiliza las funciones cursor() y noCursor() para conseguir que éste se visualice o no. En principio el cursor se visualiza como si fuera un guion bajo ( _ ).
  • 24. 3-24 www.microcontroladores.com Arduino: Seguimos progresando… P-3.5 EJEMPLO 3-4: Blink El cursor también se puede mostrar como un símbolo sólido ( ▓ ) intermitente que indica la posición donde se escribirá el siguiente carácter que se envíe a la pantalla. Para ello dispones de las funciones blink() y noBlink(). La intermitencia del cursor es espontánea. La realiza automáticamente la propia pantalla LCD. En el ejemplo, con objeto de comprobar el efecto de estas funciones, se mantiene el cursor activado (y parpadeando) durante 3 segundos, y desactivado otro tanto. P-3.6 EJEMPLO 3-5: Dirección del texto Mediante las funciones leftToRight() y rightToLeft() puedes determinar cómo deseas que se vaya escribiendo y visualizando el texto sobre la pantalla. Puedes hacerlo de izquierda a derecha o de derecha a izquierda. Por defecto se escribe de izquierda a derecha, como lo hacemos nosotros habitualmente sobre el papel. El ejemplo te muestra otra forma de visualizar un mensaje. En esta ocasión el texto se introduce en un array: char Mens1[]={"I'Love Arduino"}; //Mensaje a visualizar Mediante dos bucles for() cada carácter del array se va enviando secuencialmente a la pantalla utilizando la función lcd.write(), a intervalos de 0.150”. En el primer bucle for() el cursor se coloca en la posición 0 de la fila 0 (la primera del LCD) y se van escribiendo de izquierda a derecha, lo normal. En el segundo bucle for() el cursor se pone en la posición 15 de la fila 1, la última posición de la segunda, y los caracteres se van escribiendo de derecha a izquierda. Luego se realiza una temporización de 3” y la pantalla se borra con la función lcd.clear(). Tras una nueva temporización de 1” el ciclo se vuelve a repetir. En la siguiente fotografía tienes el resultado de ejecutar este ejemplo. ¿Lo entiendes? Piensa en los efectos de visualización que puedes conseguir.
  • 25. 3-25 www.microcontroladores.com Arduino: Seguimos progresando… P-3.7 EJEMPLO 3-6: Scroll Con las funciones scrollDisplayLeft() y scrollDisplayRight() también puedes conseguir unos bonitos efectos de visualización que, seguro, has visto en carteles publicitarios. Estas funciones desplazan a izquierda o derecha todo lo que en ese momento se esté visualizando en la pantalla. En este ejemplo se visualiza un texto en las dos líneas de la misma. Luego todo el texto se va desplazando a la izquierda, posición a posición, y a intervalos de 0.3”. Cuando el último carácter desaparece por la izquierda, el texto se vuelve a desplazar hasta que desaparece por la derecha. Finalmente, desplazando a la izquierda, todo el texto se vuelve a dejar en la posición original y se realiza una secuencia de intermitencia activando/desactivando la pantalla. P-3.8 EJEMPLO 3-7: AutoScroll Otro ejemplo que te permitirá crear llamativos efectos de visualización. En esta ocasión, mediante las funciones autoscroll() y noAutoscroll() se habilita o no el desplazamiento automático del contenido de la pantalla.
  • 26. 3-26 www.microcontroladores.com Arduino: Seguimos progresando… Cuando se activa el auto scroll, el desplazamiento se realiza automáticamente cada vez que se escribe un carácter en la pantalla. En el ejemplo anterior tenías que emplear expresamente las funciones scrollDisplayLeft() o scrollDisplayRight(). Este desplazamiento automático también puede ser a la izquierda (por defecto) o a la derecha. Todo depende de qué función leftToRight() o RightToLeft() es la que has usado por última vez. En el ejemplo se visualizan dos mensajes que están previamente definidos en sendos arrays: char Mens1[]={"ARDUINO"}; //Mensaje 1 char Mens2[]={"I'Love you"}; //Mensaje 2 Un primer bucle for() va escribiendo sobre la pantalla, carácter a carácter, el contenido del array “Mens1”. Por defecto y, de forma natural, estos se escriben de izquierda a derecha a intervalos de 0.3”. El segundo bucle for() va escribiendo en la pantalla, carácter a carácter, el contenido del array “Mens2”. Sin embargo, antes de ejecutar este bucle, el cursor se coloca en la última posición de la segunda fila de la pantalla, y se ejecuta la función lcd.autoscroll(). Los caracteres se van escribiendo de izquierda a derecha, pero por cada uno de ellos, se produce un desplazamiento automático a la izquierda (por defecto) del contenido actual de la pantalla. Finalmente se ejecuta lcd.noAutoscroll() y, tras borrar la pantalla mediante lcd.clear(), el ciclo se vuelve a repetir. Bonito ¿no? P-3-9 EJEMPLO 3-8: Caracteres personalizados Para terminar con estos ejemplos que nos han ido mostrando el uso de las funciones más relevantes de la librería “LiquidCrystal.h” vas a crear y utilizar tus propios caracteres gráficos. Concretamente vas a crear 5 caracteres: un corazón, un rostro alegre, otro serio, un muñeco con los brazos hacia abajo y otro con los brazos hacia arriba.
  • 27. 3-27 www.microcontroladores.com Arduino: Seguimos progresando… Cada uno de ellos se define mediante un array. Así que tienes estos cinco: corazon[8] ; alegre[8]; serio[8]; abajo[8] y arriba[8]. El contenido de cada uno de ellos describe en binario qué puntos o pixels se debe activar en cada caso. En el setup(), mediante funciones lcd.createChar() se transfiere a la memoria CGRAM de la pantalla el contenido de los arrays. En total se transfieren 40 bytes, 8 por cada carácter. Además, a cada uno de ellos se le asigna un número del 0 al 5: lcd.createChar(0, corazon); //Crea el nuevo carácter nº 0 lcd.createChar(1, alegre); //Crea el nuevo carácter nº 1 lcd.createChar(2, serio); //Crea el nuevo carácter nº 2 lcd.createChar(3, abajo); //Crea el nuevo carácter nº 3 lcd.createChar(4, arriba); //Crea el nuevo carácter nº 4 Por último cada carácter gráfico se puede visualizar en la pantalla, en la posición actual del cursor, como si de un carácter ASCII normal se tratara. Basta emplear la función lcd.write(n), donde n es el número asignado a cada uno, en el ejemplo del 0 al 5. Carga el programa y comprueba su funcionamiento ¿Te gusta? Pues ya sabes, a partir de ahora puedes enriquecer tus presentaciones añadiendo caracteres gráficos diseñados por ti mismo, máximo 8. P-3.10 EJEMPLO 3-9: Visualización Ejemplo con un indudable interés práctico. Vas a crear un nexo de unión entre el canal serie de tu ordenador PC y la pantalla LCD. En medio se encuentra, como no, el controlador Arduino NANO. El Arduino hace de puente. Por un lado se conecta mediante el interface USB con el PC. Por otro lado se conecta con la pantalla como se ha venido haciendo hasta ahora. Desde el PC, empleando en monitor serial, vas a transmitir vía serie un conjunto de caracteres que serán recibidos por el Arduino y visualizados en la pantalla LCD según van llegando. Observa la siguiente figura con el resultado de la ejecución del ejemplo.
  • 28. 3-28 www.microcontroladores.com Arduino: Seguimos progresando… P-3.11 EJEMPLO 3-10: Visualizando número enteros Ya has visto que sobre la pantalla LCD puedes visualizar todo tipo de textos y caracteres, pudiendo además realizar diferentes efectos de visualización. Por supuesto que también puedes visualizar números. Este ejemplo va a ir visualizando los números del 0 al 15 secuencialmente, cada vez que se accione un pulsador conectado en la patilla D2. Además, el número en cuestión se visualizará en decimal, hexadecimal y en binario. Aquí tienes el esquema eléctrico con la conexión entre Arduino NANO, la pantalla y el pulsador SW1. Este sería el montaje práctico. Debes empezar a familiarizarte con ellos. U1 ARDUINO NANO D1 1 D0 2 RESET 3 GND 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 10 D8 11 D9 12 D10 13 D11 14 D12 15 D13 163V3 17AREF 18A0 19A1 20A2 21A3 22A4 23A5 24A6 25A7 26+5V 27RESET 28GND 29VIN 30 LCD HD44780 compatible U2 PANTALLA LCD D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 E 6RW 5RS 4 VLC 3VCC 2GND 1 L+ 15 L- 16 + 5 V R1 1K + 5 V SW1 AVANCE
  • 29. 3-29 www.microcontroladores.com Arduino: Seguimos progresando… Con tus conocimientos actuales, el programa no te resultara complejo en absoluto. Un pequeño detalle que seguro lo usarás con frecuencia. Como los números a visualizar tienen distinta longitud, una buena idea es borrar totalmente la línea de la pantalla LCD donde se van a visualizar. Esto se puede hacer completando con espacios en blanco (“ “ ) la línea en cuestión. Así no quedan “restos”. Analiza el programa. Prueba a retirar las dos primeras funciones de loop() y observa lo que pasa. Seguro que ahora entiendes a qué me refiero con eso de los “restos”. P-3.12 EJEMPLO 3-11: Visualizando número float Siguiendo la línea del ejemplo anterior, ahora se trata de visualizar números float. Concretamente se va a visualizar con dos decimales el resultado de la raíz cuadrada del número N y, con cuatro decimales, el producto de N por la constante PI (3.1416). El número N va avanzando secuencialmente con cada pulsación del pulsador en D2 y evoluciona de 0 al 9. Tanto el esquema eléctrico como el del montaje práctico es el mismo que el que empleaste en el ejemplo 3-10 anterior.
  • 30. 3-30 www.microcontroladores.com Arduino: Seguimos progresando… P-3.13 EJEMPLO 3-12: Su turno Aquí tienes un buen ejemplo de marcado carácter comercial. Se trata de emular el funcionamiento de una máquina controladora de turnos, como los que seguramente habrás visto en supermercados, centros sanitarios, de atención al cliente, etc… En la pantalla LCD aparecerá el turno actual comprendido entre 0 y 99. Mediante un pulsador conectado en la patilla de entrada D2, el operario hace avanzar al siguiente turno cuando corresponda. ¿Qué te aporta como novedad este ejemplo? Pues que vas a emplear la memoria EEPROM por vez primera. Efectivamente, el turno actual se va a guardar sobre esta memoria. ¿Qué se consigue con esto? Pues que en caso de fallo de alimentación o bien del cierre del establecimiento, cuando se active nuevamente el sistema, automáticamente se “recordará” el último turno en que se quedó la máquina. No hará falta que el operario tenga que avanzar manualmente para llegar a él. Aprovecha la característica de NO volatilidad de la memoria EEPROM. Buena idea ¿no? Para hacerlo más realista, conectamos un zumbador en la patilla de salida D13. Aquí tienes el esquema eléctrico… U1 ARDUINO NANO D1 1 D0 2 RESET 3 GND 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 10 D8 11 D9 12 D10 13 D11 14 D12 15 D13 163V3 17AREF 18A0 19A1 20A2 21A3 22A4 23A5 24A6 25A7 26+5V 27RESET 28GND 29VIN 30 LCD HD44780 compatible U2 PANTALLA LCD D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 E 6RW 5RS 4 VLC 3VCC 2GND 1 L+ 15 L- 16 + 5 V R1 1K + 5 V SW1 AVANCE R2 180 ZUMBADOR - +
  • 31. 3-31 www.microcontroladores.com Arduino: Seguimos progresando… … y ahora el montaje práctico. El zumbador es otro periférico de salida que emite una señal sonora cada vez que se le aplica un nivel lógico. Recuerda que este nivel puede ser un “1” o un “0”, dependiendo de cómo lo conectes. En este caso se emplea un nivel “1”. Tiene dos patillas, una de las cuales está marcada con el signo “+”. Presta atención. En la función setup() que se ejecuta al conectar la alimentación o pulsar el RESET, se lee la memoria EEPROM, concretamente su posición 0, donde se supone que está el número que representa el último turno. Este debe estar comprendido entre 0 y 99. Cada vez que se acciona el pulsador SW1 se genera una señal sonora gracias a la función beep(), el turno se incrementa en una unidad y se almacena en la posición 0 de la memoria EEPROM no volátil. Ya queda registrado el nuevo turno para el caso de que haya un fallo de alimentación. Prueba el ejemplo. Observa el turno que aparece en la pantalla, y cómo se va incrementando con cada pulsación a la vez que se genera un pitido. Desconecta la alimentación y vuelve a conectarla. En la pantalla deberá aparecer el último. ¡¡ Bien por la memoria EEPROM no volátil !!
  • 32. 3-32 www.microcontroladores.com Arduino: Seguimos progresando… P-3.14 EJEMPLO 3-13: Menú La pantalla LCD es un periférico ideal para hacer un intuitivo interface con el usuario. Efectivamente, puedes visualizar menús de opciones que te permitan seleccionar entre las diferentes tareas a ejecutar. En este ejemplo se trata de realizar un menú de 6 opciones que van apareciendo secuencialmente sobre la pantalla. Para ello, mediante dos pulsadores de avance y retroceso, podrás navegar por el menú para visualizar todas las opciones disponibles. Este es el esquema eléctrico. Las conexiones entre el Arduino y la pantalla son las mismas que las empleadas hasta ahora. En esta ocasión se emplea un segundo pulsador, SW2. Con SW1 conectado con la entrada D2, se van avanzando las opciones que se visualizan sobre la pantalla. Con SW2 conectado en la patilla D3 se va retrocediendo. Ambas patillas se configuran como entradas pull-up. Te ahorras tener que poner externamente las dos resistencias correspondientes. La pantalla realiza un efecto de “scroll vertical” para visualizar secuencialmente todas las opciones disponibles en el menú. También se emplea un zumbador piezoeléctrico conectado con la patilla de salida D13. Cualquier pulsación tanto en SW1 como en SW2 generará una señal acústica. Aquí tienes el montaje práctico. U1 ARDUINO NANO D1 1 D0 2 RESET 3 GND 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 10 D8 11 D9 12 D10 13 D11 14 D12 15 D13 163V3 17AREF 18A0 19A1 20A2 21A3 22A4 23A5 24A6 25A7 26+5V 27RESET 28GND 29VIN 30 LCD HD44780 compatible U2 PANTALLA LCD D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 E 6RW 5RS 4 VLC 3VCC 2GND 1 L+ 15 L- 16 + 5 V R1 1K + 5 V SW1 AVANCE R2 180 ZUMBADOR - + SW2 RETROCESO
  • 33. 3-33 www.microcontroladores.com Arduino: Seguimos progresando… Ahora vas a echar un vistazo al programa. El tratar de estudiarlo y analizarlo para comprender su funcionamiento lo dejo en tus manos. Simplemente decirte que se ha procurado dar una solución lo más sencilla y didáctica posible. Seguramente no será la única ni la mejor. Espero que tú, con tu iniciativa, la mejores notablemente. Inicio: Al principio del todo se incluye la librería “LiquidCrystal.h” y se establecen las conexiones con la pantalla. No hay nada nuevo. Se declaran las variables “Opcion” y “N_opciones”. La primera contiene la opción en curso seleccionada y la segunda el número de opciones que tiene el menú. También se declara un array llamado “flecha” que define un carácter gráfico. Funciones: En el proyecto se han creado dos funciones: visualiza() y beep(). La primera visualiza en la pantalla el mensaje correspondiente a la opción en curso actual según el valor de la variable “Opcion”. La función beep() no es nueva. Emite una señal acústica. Setup():
  • 34. 3-34 www.microcontroladores.com Arduino: Seguimos progresando… Configura las patillas D2 y D3 como entradas con Pull-Up interna, la patilla D13 como salida, la pantalla LCD con 2 líneas de 16 caracteres y por último genera el carácter gráfico nº 0 (flecha). Tampoco hay nada especialmente relevante. loop():  Empieza borrando la pantalla y visualizando el carácter gráfico nº 0 (la flecha).  Coloca el cursor en la primera fila y visualiza la opción en curso según la variable “Opcion”. Hace uso de la función visualiza().  Coloca el cursor en la segunda fila y visualiza la siguiente opción (Opcion+1). Nuevamente hace uso de la función visualiza().  Espera a que se pulse uno de los dos pulsadores SW1 o SW2 conectados en D2 y en D3.  Si se pulsa D2 se eliminan rebotes y se espera a que se suelte. Genera un pitido e incremente la variable “Opción”. Se apunta a la siguiente opción del menú.  Si se pulsa D3 se eliminan rebotes y se espera a que se suelte. Genera un pitido y decrementa la variable “Opción”. Se apunta a la opción previa del menú. Grábalo y comprueba su funcionamiento ¿te gusta? Pues espero que esto te sirva como idea para un buen número de futuros proyectos. P-3.15 EJEMPLO 3-14: Selección de opciones Considéralo una prolongación del ejemplo anterior. Mira el esquema eléctrico. SW3 SELECCION U1 ARDUINO NANO D1 1 D0 2 RESET 3 GND 4 D2 5 D3 6 D4 7 D5 8 D6 9 D7 10 D8 11 D9 12 D10 13 D11 14 D12 15 D13 163V3 17AREF 18A0 19A1 20A2 21A3 22A4 23A5 24A6 25A7 26+5V 27RESET 28GND 29VIN 30 LCD HD44780 compatible U2 PANTALLA LCD D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 E 6RW 5RS 4 VLC 3VCC 2GND 1 L+ 15 L- 16 + 5 V + 5 V R1 1K SW1 AVANCE R2 180 ZUMBADOR - + SW2 RETROCESO D2 VERDE D1 ROJO R4 180 R3 180
  • 35. 3-35 www.microcontroladores.com Arduino: Seguimos progresando… Se añade un pulsador más, el SW3 conectado en D4, con el que se ejecuta la opción seleccionada en ese momento. También se añaden dos leds, uno rojo y otro verde conectados en D5 y D6, que permiten ver el resultado de ejecutar esa opción. Aquí tienes el montaje práctico. El programa es muy parecido al del ejemplo anterior. Únicamente se ha añadido la función Ejecuta() que se ejecutará cada vez que se pulse el pulsador SW3. Esta nueva función evalúa el valor de la variable “Opcion”. Según cual sea la opción actualmente seleccionada, se ejecuta la tarea apropiada y consistente en activar o desactivar los leds rojo y verde conectados con las salidas D5 y D6. Si estudiaste y entendiste el programa del ejemplo anterior, este no te debe suponer problema alguno ¿verdad? P-3-16 EJEMPLO 3-15: Una última mejora Imagina una aplicación en la que el menú no sólo tiene 6 opciones como hasta ahora. Tiene varias decenas de ellas. Cada vez que enciendes el sistema o generas un reinicio mediante RESET, siempre empieza desde la primera opción y deberás desplazarte hasta localizar la que deseas.
  • 36. 3-36 www.microcontroladores.com Arduino: Seguimos progresando… Quizá podría interesarte que cada vez que se reinicie, la pantalla LCD muestre la última opción que hubieras seleccionado y no tengas que andar buscándola. ¿Qué te parece? Nuevamente tienes la posibilidad de usar la memoria EEPROM de datos. Efectivamente, cada vez que se selecciona una nueva opción, esta se registra en la memoria EEPROM. Al fin y al cabo cada opción se representa ni más ni menos que con un número guardado en la variable “Opcion”. Cada vez que se reinicie el sistema, esa variable se carga con el valor registrado previamente en la memoria EEPROM. En este ejemplo vas a usar la posición 1 de las 1024 disponibles. Graba el programa y comprueba su funcionamiento. Selecciona y ejecuta diferentes opciones. Luego apaga el sistema y vuelve a encenderlo. Observa que siempre aparece la última opción que seleccionaste. Es de esperar que estos ejemplos te sugieran un buen número de aplicaciones. Animo y emplea tu imaginación e ingenio.