Archivo de la etiqueta: clock

Necesitas visualizar información con tu Arduino? Nada mejor que un LCD a color

En este post, vamos a revisar el Color LCD Shield, fabricado por Elecfreaks y distribuido por www.dx.com, que viene listo para usar con cualquier placa Arduino.

DSC00252

Este shield tiene las siguientes características:

  • Display a color de 128x128px, basado en el display Nokia 6100
  • 4096 colores (profundidad de color de 12 bits)
  • Interfaz I2C (requiere unos pocos pines para funcionar)
  • Control de iluminación del backlight, mediante PWM en el pin 10 del arduino
  • Joystick de 5 posiciones, conectado a las entradas A0-A4 (deben ser configuradas como entradas digitales)
  • Regulación automática de 3.3v (no requiere modificaciones adicionales al Arduino)

El precio de este shield es bastante conveniente (19.xx con envío gratis desde China), y la calidad de fabricación es excelente. El item viene debidamente empacado, protegiendo con gomaespuma la pantalla y los pines de conexión, evitando las pantallas rotas o pines doblados en el largo viaje desde el otro lado del mundo.

Para esta prueba, vamos a usar los siguientes componentes:

Por que usar un LCD gráfico en lugar del clásico shield LCD 16×2? bueno, aquí es cuestión de gustos, y de la aplicación que le querramos dar. Como ejemplo del funcionamiento del Shield, y para ilustrar las funciones disponibles para el mismo, vamos a programar un voltímetro, que mida entre 0 y 5v, y que nos grafique en tiempo real las variaciones de voltaje ingresadas por el pin A5 de nuestro Arduino Uno.

Primero, debemos descargar e instalar la librería ColorLCDShield, que la puedes descargar de este enlace. Esta librería debe ser descomprimida en la carpeta “Libraries” de tu instalación del Arduino IDE, antes de empezar con nuestra prueba.

Primero, debemos incializar el LCD, para lo cual usamos los siguientes comandos:

pinMode(10, OUTPUT);
analogWrite(10, 1023); 
lcd.init(PHILLIPS); 
lcd.contrast(40);

Como podemos ver en este fragmento de código, el pin 10 de nuestro arduino controlará la intencidad del backlight mediante PWM. El valor de 40 para el contraste es un valor recomendado por el fabricante, así que no hay mucha explicación sobre dicho valor.

A continuación, luego de inicializada la pantalla, procedemos a dibujar la grilla de fondo. Para esto, vamos a usar el siguiente código:

  int x,y;  
  lcd.clear(BLACK);  
  lcd.setStr("Datalogger 2013 ", 2, 0, RED, WHITE);
  lcd.setStr("www.patolin.com ", 112, 1, BLUE, WHITE);
  for (x=1;x< =132;x+=20) {
       lcd.setLine(30,x,110,x, GRAY);
  } 
  for (y=30;y<=110;y+=20) {
       lcd.setLine(y,1,y,132, GRAY);  
  }
  lcd.setRect(30,2,110,129, 0, MAGENTA);

Dentro de este bloque, como podemos observar, usamos rutinas para limpiar la pantalla lcd.clear(BLACK);, escribir strings lcd.setStr(“Datalogger 2013 “, 2, 0, RED, WHITE);, dibujar líneas lcd.setLine(30,x,110,x, GRAY); y dibujar rectángulos lcd.setRect(30,2,110,129, 0, MAGENTA);.

Todas estas funciones, y el listado de colores disponibles como constantes para facilidad de uso, se encuentran detallados dentro de la ayuda de la librería del display.

Lo que vamos a hacer con nuestro arduino, es leer el valor del potenciómetro conectado en el puerto A5, y graficarlo en escala, dentro de la grilla que dibujamos previamente. El momento que el gráfico de la señal llegue al borde derecho de la grilla, limpiaremos la pantalla y empezaremos desde el borde izquierdo. Les dejo el código completo que estoy usando.

#include <ColorLCDShield.h> 

LCDShield lcd;  
int buttonPins[5] = {A0, A1, A2, A3, A4};  

void setup()
{
  pinMode(10, OUTPUT);
  analogWrite(10, 1023); //PWM control blacklight
  lcd.init(PHILLIPS);  // Initializes lcd, using an PHILIPSdriver
  lcd.contrast(40);  // -51's usually a good contrast value

  dibujaGrilla();
}

void dibujaGrilla() {

  int x,y;  
  lcd.clear(BLACK);  
  lcd.setStr("Datalogger 2013 ", 2, 0, RED, WHITE);
  lcd.setStr("www.patolin.com ", 112, 1, BLUE, WHITE);
  for (x=1;x< =132;x+=20) {
       lcd.setLine(30,x,110,x, GRAY);
  } 
  for (y=30;y<=110;y+=20) {        lcd.setLine(y,1,y,132, GRAY);     }   lcd.setRect(30,2,110,129, 0, MAGENTA); } void dibujaPunto(int x,int valADC) {   // ajustamos el valor del adc para la escala del grafico   int valor;   valor=valADC/20;   lcd.setPixel(RED,(110-valor),x); } void loop() {   int x=3;   int valor;   while(1) {     if (x>128) { x=3; dibujaGrilla();}
    valor=analogRead(A5);
    dibujaPunto(x,valor);
    delay(100);

    x++;
  }
}

Luego de cargar el código en el Arduino, el resultado es excelente! hemos creado con unas pocas líneas de código, un datalogger gráfico, que puede servir como base para muchas aplicaciones más. Les dejo un pequeño video del resultado.

Como podemos observar, este LCD Shield es bastante práctico, y es una gran mejora sobre el LCD 16×2 que casi siempre usamos en nuestros proyectos, para resumir sus características, podemos lanzar la siguiente comparativa:

A favor:

  • Bajo costo
  • Envío gratis desde dx.com
  • Incluye joystick de 5 posiciones
  • Interfaz I2C reduce el número de pines usados
  • Librerías listas para generar texto y gráficos
  • Facil uso y de facil integración en tus proyectos con Arduino

En contra

  • Largo tiempo de espera para recibirlo
  • el Joystick utiliza 5 pines (A0-A4) dejando solo una entrada analógica disponible (podría arreglarse cambiando los pines usados, conectándolo a un arduino nano o pro)
  • La actualización del display es un poco lenta, para algunas aplicaciones (podría ser un poco lenta si queremos usarla para un osciloscopio digital)