bclose

Display con interface

Arduino con display de 4 digitos
tienda online prometec

Objetivos

 

 

    • Nuestro primer display numérico de 4 digitos.
    • Multiplxando los digitos.
    • Aprendiendo a programar: Dividiendo el problema en funciones.
    • Vuelta a las operaciones con enteros
 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.

Protoboard

Una Protoboard.

conexiones

Cables  de protoboard

Digital tube

Un display de 7 segmentos y 4 dígitos.

Los displays LED de 4 dígitos

 

En la sesión anterior vimos cómo usar un display de 4 dígitos montando nosotros toda la electrónica. Vimos que la cosa funcionaba bastante bien, y vimos que no se notaba el truco de multiplexar los dígitos, porque en general los Duinos son lo suficientemente rápidos para que no lo percibamos.

Pero lo que desde luego si que percibimos, fue lo pesado que es montar aquel circuito en una protoboard, por la cantidad de cables que supone conectar y por lo fácil que es equivocarse o soltar uno inadvertidamente.

En la práctica ese sistema solo es para los estudiantes (por aquello de que aprendan sufriendo), pero en la realidad es mucho mejor utilizar un display con sistema anexo de control, que son un poco más caros, pero no tienen ninguno de los problemas que vimos.

En realidad son tan sencillos que no suelen tener más allá de 4 pines y se controlan por software directamente.

Hoy os voy a presentar un display chiquitín, pero muy resultón, que tengo rodando por la mesa ya un tiempo y que me encanta.

Es un display de Catalex, un fabricante chino, de 4 dígitos que se gobierna con esos 4 pines que decíamos (y dos son Vcc y GND), tiene una librería muy simple y funciona tanto a 5V como a 3,3V.

 
  • Espero recibir en breve uno de estos displays en versión I2C (Aaún no hemos hablado del I2C, pero todo llegará) y entonces haremos un sesión sobre el tema..
 

 

Diagrama de conexión

 

El cableado de uno de estos displays es insultantemente sencillo:

Esquema de conexion

 

Conectamos tensión y Ground y solo nos quedan 2 hilos: DIO o Data Input Output y Clock, que conectamos a los pinos 2 y 3 respectivamente. Y eso es todo.

Cableado

El programa de control

 

El fabricante del display nos proporciona una librería para que podamos olvidarnos del multiplexado y demás historias:   DigitalTube 

La descargamos e instalamos como vimos en la sesión Conociendo los servos, Seleccionad Programa – Añadir librería e indicadle el fichero que acabáis e descargar y se instalará.

Y en la lista de librerías que sale en el desplegable elegid DigitalTube . Veréis que os incluye una línea como esta:

#include <TM1637.h>

Que es un nombre impresentable, pero que es lo que hay. Para usarla, definimos un par de pines para la señal CLK y DIO:

#define CLK 3//pins definitions for TM1637 and can be changed to other ports
#define DIO 2

Ahora tenemos que crear una instancia del tipo TM1637 que llamaremos Display1 y le pasamos los pines que controlan la comunicación:

TM1637 Display1(CLK,DIO);

Y ahora el fabricante nos pide que le pasemos los dígitos a representar en un array de 4 unsigned byte definidos con un tipo raro int8_t, del que no teneís que preocuparos:

int8_t  Digits[] = {3,2,1,2} ;

En este caso el display mostrara 3212. Y ahora hay que inicializar la librería y el display

void setup()
   {
      Display1.set();
      Display1.init() ;
   }

Y ahora ya solo queda pedirle que imprima Digits[]

Display1.display(Digits);

Y listo. Por pura vagancia os pongo el programa completo para que apreciéis la diferencia:

#include "TM1637.h"
#define CLK 3    
#define DIO 2

TM1637 Display1(CLK,DIO);
int8_t Digits[] = {5,2,1,2};

void setup()
   {  
       Display1.set();
       Display1.init() ;
   }

void loop()
   {
        Display1.display(Digits);
   }

Vamos ahora a hacer el ejemplo del contador de la sesión anterior para que veamos cómo queda. Vamos a empezar por las definiciones

#include "TM1637.h"

#define CLK 3
#define DIO 2

TM1637 Display1(CLK,DIO);
int8_t Digits[] = {7,6,5,4};            //Valor inicial

void setup()
   {
      Display1.set();
      Display1.init() ;
   }

Vamos a usar un contador para que veamos su valor en el display, así que vamos a necesitar separar los dígitos del valor y meterlos en el array Digits. Para ello vamos a recuperar la función CalculaDigitos () de la sesión anterior con alguna pequeña modificación:

void CalculaDigitos( int Num)
   {
      int8_t Digit0 = Num %10 ;
      int8_t Digit1 = (Num % 100) / 10 ;
      int8_t Digit2 = (Num % 1000) / 100 ;
      int8_t Digit3 = Num  / 1000  ;

      Digits[3] = Digit0 ;
      Digits[2] = Digit1 ;
      Digits[1] = Digit2 ;
      Digits[0] = Digit3 ;

      Display1.display(Digits);
   }

Calculamos los dígitos y los metemos en el array, después basta con llamar al método display (en minúsculas) del objeto Display (en mayúsculas). Y para calcular el número:

void loop()
   {
       for (int i = 0 ; i<10000 ; i++)
            {
                CalculaDigitos(i);
                delay(100);
             }
   }

Resumen de la sesión

 

 

    • Hemos presentado los displays LED de 7 segmentos y 4 dígitos de Catalex, que utiliza un bus propio (y no documentado) pero que como funciona, casi puedo perdonárselo.
    • Hemos modificado nuestra función CalculaDigitos(), para que podamos usarla con este display u otros que requieran que les pasamos los dígitos separados.
    • La virtud de este tipo de display (Digital tubes para los ingleses) es la facilidad de conexión y de gestión con la librería.
 

 

 

(20) Comments

  • Buenas tardes: puede hacerme el favor de indicarme como se meneja el TM1637 con proton ide, es que no se ni tengo arduino pero si tengo un pic 16f877A . gracias

    • Me temo que no conozco el proton ide

  • Hola, saludos a todos desde Argentina. El inconveniente que tengo utilizando este display con arduino (nano o uno) es el siguiente: realizando una secuencia de cambio de numeros simple (ej: los 4 digitos en 1 luego en 2, etc etc) es display refresca mal los valores, por ende quedan un par de digitos con el valor anterior. Asumo que puede ser un problema de clock pero no tengo idea como puedo solucionarlo.
    Alguna recomendación? gracias

    • Lo mas sencillo, Manuel, es que mandes borrar el display antes de escribir nuevos valores

    • Marco Antonio Del Valle

    hola amigo buenas disculpa, como podría colocar con la protoboard unos botones para poder detener el cronometro S:

    • Hola Marco Antonio, échale un ojo a esta sesión sobre pulsadores y si tienes algún problema nos comentas https://www.prometec.net/condicionales-botones/
      Un saludo.

    • Hola Marco. Revisa este tuto:
      https://www.prometec.net/condicionales-botones/

        • Marco

        hola amigo buenas tardes disculpa la molestia pero como podria hacer que los primeros dos digitos lleguen hasta 59 y me muestre el primer minuto y valla incrementando despues de cada 59 mira este es el codigo lo que pasa es que si logro que cuente el 59 pero no aumenta hasta que cuenta 40 despues solo quiero hacer un cronometro que cuente hasta 59 y muestre 1 minuto y otra ves que cuente hasta 59 y cuente ahora 2 minutos y asi! es posible hacer eso amigo? SALUDOS espero tu respuesta 🙂

        #include “TM1637.h”

        #define CLK 3
        #define DIO 2

        TM1637 Display1(CLK,DIO);
        int8_t Digits[] = {7,6,5,4}; //Valor inicial

        void setup()
        {
        Display1.set();
        Display1.init() ;
        }

        void CalculaDigitos( int Num)
        {
        int8_t Digit0 = Num %10 ;
        int8_t Digit1 = (Num % 60) / 10 ; AQUI EN ESTA SECCION LE PONGO 60 PERO VUELVE A CONTAR LOS 40 EN EL PROXIMO CICLO
        int8_t Digit2 = (Num % 1000) / 100 ;
        int8_t Digit3 = Num / 1000 ;

        Digits[3] = Digit0 ;
        Digits[2] = Digit1 ;
        Digits[1] = Digit2 ;
        Digits[0] = Digit3 ;

        Display1.display(Digits);
        }

        void loop()
        {
        for (int i = 0 ; i<10000 ; i++)
        {
        CalculaDigitos(i);
        delay(60);
        }
        }

  • Hola Antonio, creo que en realidad no habría que poner nada en la protoboard. Un saludo.

    • Damian

    Hola, queria comentarles que implemente el ejemplo y funciona perfectamente. Luego al utilizarlo en mi programa (hice un contador, con una entrada por optoacoplador y una salida con rele) me surgio el inconveniente que el arduino se cuelga y no cuenta mas, tengo que resetear para que vuelva a funcionar y en forma aleatorea se vuelve a colgar. Encontre que si al momento de colgarse desconecto y vuelvo a conectar el display vuelve a funcionar normalmente, hasta que se cuelga nuevamente.
    Sabes a que puede deberse esto?

    Saludos

    PD: estoy usando un arduino nano

    • Hola Damian,

      Suponiendo que no sea un problema de algo defectuoso, lo mas probables es que tengas alguna interferencia en la alimentacion ¿Como lo tienes conectado?

  • La solución es:
    tm1637.point(boolean); //es decir 0 ó 1

    Por otro lado aprovecho a preguntar… Si utilizo tm1637.set(4); en Valores altos (4, 5, 6, 7) Debo modificar algo en la conexión? O arduino se aguanta el brillo máximo? (con 4 me conformo)

  • Cómo enciendo los puntitos? Gracias desde ya!

    • Hola Martin, NO he mirado la libreria, peri si echas una ojeada al codigo de la libreria estoy seguro de que encontraras alguna funcion que hara eso exactamente

    • Paco

    Hola
    ¿Podrías decirme de forma cualitativa cómo se le pasa información a este display?
    Me gustaría hacerlo funcionar en picaxe pero no tengo ni idea de por dónde empezar.
    Gracias

    • Hola Paco, es un display I2C normal y basta con que eches una ojeada al ejemplo para que veas como manejarlo, aunque desde luego va a depender de la libreria que uses y lamento decir que no conozco pixcake

  • Buen día

    Me gusto la explicación se lo agradezco.
    Tengo una duda , podría con este driver anular un dígito que solo muestre tres para ciertas ocasiones.

    • Desde luego que si Nahuel, el display mostrara lo que tu le pidas sin mas

    • Joel Díaz

    Buen día:

    Un gusto saludarle y además el agradecerle el tiempo que se toma para compartir un poco de su conocimiento en esta temática.

    Tengo una consulta: al inicio del tema, para ser mas específico en la lista de materiales, se puede observar que se encuentran 4 resistencias de 330 Ohms pero en ningún momento noté que las utilizó. ¿Me podría explicar si verdaderamente se usan y en que parte del montaje si así lo es?

    Le agradezco nuevamente y espero atento a su respuesta.

    Un saludo desde Honduras!

    • Hola Joel, Pues era un error tienes razón, acabo de corregirlo muchas gracias por indicarmelo

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!