Temporizador: Arduino + LCD

Hoy quiero hablar de los displays LCD y su control y uso mediante una placa Arduino.
El proceso de control de un LCD con Arduino nos abre un frente de interacción visual de la electrónica de un modo rápido, sencillo y eficaz.

¿Qué es un display LCD?
De un modo muy resumido, las siglas LCD significan “Liquid Cristal Display” o en español “Pantalla de cristal líquido“, y es una pantalla delgada y plana, formada por un número de píxeles en color o monocromos colocados delante de una fuente de luz o reflectora. (Wikipedia).

El uso de estas pantallas, está tan extendido hoy en día, que prácticamente todos los aparatos electrónicos suelen llevarlas, para mejor uso y facilidad de interacción.
Existen muchos tipos de LCD, variando en forma y tamaño, número de píxeles, color, y la gran mayoría tienen un coste de unos pocos €uros en cualquier tienda de electrónica.

El que voy a utilizar yo, es del tipo más sencillo de controlar, y son los displays LCD diseñados para interactuar con circuitos integrados, de entrada de 4/8 bits en paralelo, basados en el controlador Hitachi HD44780.
Estos se caracterizan principalmente por el número de caracteres que son capaces de representar, que viene dado en su datasheet generalmente por unos números del tipo “8×1″, “16×2″, “20×4″, que significan “Número de caracteres x Número de filas“, así pues, un display LCD 16×2, es capaz de representar 2 filas de 16 caracteres.

El display LCD que utilizaré yo (Gracias a Dani), es de 16×2 caracteres, de fondo verde y caracteres negros con retroiluminación led de color verde:



Sigue leyendo!


Estos displays se controlan muy facilmente con una placa Arduino o un PIC y muy pocas lineas de código. Para ello veamos sus pines para saber como se conectan:

- Pin 1 – Vss: GND o tierra.

- Pin 2 – Vdd: Alimentación Vcc o +5V.
(Algunos pueden alimentarse a 3 Vcc)

- Pin 3 – V0: Control del contraste del display, conectamos este pin al terminal variable de un potenciómetro conectado a Vcc y Masa en sus terminales extremos.

- Pin 4 – RS: Selección de Registro.
0 lógico: Registro de comandos (escritura),
1 lógico: Registro de datos (escritura, lectura)

- Pin 5 – R/W:
0 lógico: Escritura del LCD.
1 Lógico: Lectura del LCD.

- Pin 6 – Enable: El famoso Enable de casi todos los componentes de la electrónica digital. Un 1 lógico señala el inicio de escritura o lectura del LCD, un 0 lógico, desactiva todas las funciones.

- Pin 7-10 – D0/D3: Pines correspondientes al bus de datos.
D0 corresponde al bit menos significativo.
Estos pines no se utilizan si realizamos operaciones sobre el LCD de 4 bits.

- Pin 11-14 – D4/D7: Pines correspondientes al bus de datos.
D7 corresponde al bit más significativo y puede utilizarse como “Busy Flag”,
si leemos sobre este pin, un 1 lógico nos indicará que el LCD se encuentra ocupado,
no permitiendonos realizar ninguna operación hasta que se deshabilite.

En la tabla no aparecen, ya que no todos los displays disponen de los pines 15 y 16, yo he modificado la imagen para añadirlos, y son simplemente:
- Pin 15 – Ánodo de la retroiluminación : R + 5V.
- Pin 16 – Cátodo de la retroiluminación: GND.

Ahora si, podemos meternos de lleno en el control del LCD.
En la web de Arduino, vienen muchos ejemplos con sus correspondientes imágenes de conexión del LCD con la placa en cuestión, además del código para ponerlo en funcionamiento en pocos clicks.

El código para poner en funcionamiento un LCD es muy sencillo, y se trata simplemente de declarar los pines a utilizar por el LCD, situar el cursor en el caracter que deseemos escribir (Nº caracter, Fila) y escribir sobre el LCD.
Arduino simplifica el trabajo de escribir sobre un LCD hasta un punto que resulta muy fácil. Aqui un ejemplo de código para escribir una frase sobre un LCD.

//Ejemplo Frase "Hello World" en LCD con Arduino

#include <LiquidCrystal.h> //Incluimos la libreria de control del LCD

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Inicializamos la libreria con los pines a utilizar

void setup() {
lcd.begin(16, 2);   //Configuramos el numero de caracteres y filas a utilizar
}

void loop() {
lcd.setCursor(0, 0); //Situamos el cursor en el caracter 0, fila 0
lcd.print("Hello World") //Escribimos sobre el LCD
}

Yo he preferido hacer algo más interesante que los ejemplos que vienen en dicha web, asi que me he puesto a programar un temporizador.

Empezando por la conexión del circuito, la siguiente imagen creada con Fritzing
(Fántastico programa freeware y multiplataforma para crear esquemas) nos muestra como conectar el LCD con Arduino y algunos componentes más necesarios para este proyectillo, como son pulsadores, led o un buzzer.

El esquema consta de un Arduino UNO, un display LCD 16×2, un potenciómetro para el control de contraste del LCD, un led de señal de fin de temporización, y 4 pulsadores con su resistencia Pull-down de 10kΩ, los 3 pulsadores cuyos cables son naranja son los que permitirán la elección del tiempo (Horas, Minutos y Segundos) mientras que el 4to pulsador, el del cable azul, es que que dará la señal de inicio del temporizador.

Una vez conectado todo, solo queda la programación y ponerlo en funcionamiento.
Mi código es algo largo asi que dejaré el archivo Temporizador.pde de Arduino para el que quiera descargarlo y echarle un vistazo.

Y a funcionar!

:D

About these ads

88 pensamientos en “Temporizador: Arduino + LCD

  1. Ahora, me gustaría hacerles una pregunta:
    ¡Han cargado con éxito el Bootloader en un micro ATmega328P-PU?.
    Por que Yo, ¡¡¡¡NO!!!. (snif!).

    Tengo el Arduino UNO R3, les comento que ya he tratado con Paperduino y nada mas no funcionó. Algunas personas, comentan que, podemos utilizar el metodo del Paperduino, co una variantes…
    Simplemente colocamos una resistencia (pull-down) desde reset (en la placa de Arduino) de 120 ohms y un condensador electrolítico o filtro de 10uF desde reset (placa arduino) a GND (también en la placa de Arduino) y en nuestro protoboard colocamos el micro ATmaga328P-PU y un cristal de 16 MHz con sus respectivos condensadores de 18pF a 22pF, y posteriormente tratamos de subir el Bootloader a nuestro micro ATmega328P-PU.
    Ligas…

    http://txapuzas.blogspot.mx/2010/07/paperduino-pcb.html

    http://www.arduteka.com/2012/06/cargando-el-bootloader-en-el-atmega328/

    http://txapuzas.blogspot.mx/2010/07/paperduino-stripboard.html

    http://www.3guys1laser.com/blog-burn-bootloader-blank-atmega328atmega328p-arduino-uno

    Fabricando un Arduino (RS232 o DB9):
    http://planocomplejo.com.ar/cms/index.php?option=com_content&view=article&id=69:armando-arduino&catid=45:proyectos&Itemid=53

    En las ligas anteriores se muestran algunas posibilidades.
    Si alguien lo ha realizado con éxito. Comentenlo, por que en realidad, para algunos de nosotros nos hace falta.
    Gracias y hasta pronto.

    Les comento que este es un muy buen post!!!.
    Tiene buenas udeas…
    Martín…

    • Papel12300, no puedo ayudarte de momento no he cargado el bootloader en la placa Arduino, esperemos que alguien aporte alguna solución que funcione.

      Saludos!

  2. El articulo me gusto mucho; pero como no he recibido mi placa de Arduino lo simulé
    con el Proteus.
    Tuve que corregir algo dentro del codigo del DO WHILE :

    do
    {

    varbuth = analogRead(buth); //Leemos boton de horas
    varbutm = analogRead(butm); //Leemos boton de minutos
    varbuts = analogRead(buts); //Leemos boton de segundos

    if(varbuth != 0) // CORREGIDO Si el boton ha sido pulsado, aumentamos las horas en una unidad
    {
    ahoras = ahoras + 1 ;
    delay(250);
    }

    if(varbutm != 0) // CORREGIDO Si el boton ha sido pulsado, aumentamos los minutos en una unidad
    {
    aminutos = aminutos + 1;
    delay(250);
    }

    if(varbuts != 0) // CORREGIDO Si el boton ha sido pulsado, aumentamos los segundos en una unidad
    {
    asegundos = asegundos + 1;
    delay(250);
    }

    lcd.setCursor(0,0);
    lcd.print(“Elige el tiempo”); //Muestra mensaje y las HH:MM:SS que vayamos aumentando

    lcd.setCursor(4,1);

    if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
    lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
    lcd.print(":");

    if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
    lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)

    lcd.print(":");
    if (asegundos < 10) lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.
    lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)

    empieza = analogRead(start); //Lee el boton de arranque

    if (empieza != 0) // CORREGIDO Si el boton de arranque, fue pulsado…
    {
    segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60); //Convierte el tiempo elegido en segundos!!
    }

    } while(empieza == 0); // CORREGIDO Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.

    Ademas en el dibujo parece que la linea del pulsador "EMPIEZA" va hacia A1 y debe
    ir conectada en A2 para seguir el codigo.
    Con esto ya funciona muy bien.

    Gracias por esta informacion.

    Jorge
    Seria bueno poder subir el archivo DSN.

    • Jorge Hernandez, muchas gracias!

      Fue uno de mis primeros proyectos con Arduino, tiene unos cuántos fallos más seguramente.

      Si quieres puedes enviarme el archivo DSN a esta dirección de correo: Electronicadeprimero@gmail.com

      y procedo a subirlo al post para el que quiera poder descargarlo y simularlo.

      Gracias por tus correcciones y aportes.

      Saludos!!

Deja un comentario!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Conectando a %s