Saltar al contenido
Control Automático Educación

Display 7 Segmentos – Antirebote – PullUP con Arduino

En esta entrada aprenderás a utilizar el Display 7 Segmentos con ARDUINO, de una forma como no la has visto en otro lugar, entonces será muy constructivo para tu formación. Adicionalmente aprenderemos a incorporar en nuestro código el AntiRebote generado por dispositivos mecánicos y por ultimo, aprenderemos a usar las resistencias internas de arduino, conocidas como PullUP.

Si todavía no has visto todo el contenido de nuestro curso de ARDUINO, te invito a darle un vistazo para que aprendas todo sobre esta maravillosa placa de desarrollo: 👉VER CURSO GRATIS DE ARDUINO.

Display 7 Segmentos

Anteriormente ya habiamos hablado de los Display de 7 segmentos en nuestro curso de Microcontroladores PIC (Microchip). Si te interesa un poco más de información puedes darle un vistazo a aquella entrada: DISPLAY 7 SEGMENTOS con PIC.

Display 7 Segmentos
6. Manejo de display 7 segmentos y antirebote

Los Display 7 Segmentos son dispositivos electrónicos que contienen en su interior un arreglo de LEDs (8 leds en total) solo que por lo general solo se usan 7 leds que conforman los segmentos de un número arábigo, y el octavo led solo es usado para mostrar un punto decimal.

Existen 2 tipos de Display 7 Segmentos: Cátodo Común y Ánodo Común.

Display 7 Segmentos
display 7 segmentos

En el Display de 7 Segmentos de Cátodo Común, el pin común se conecta a tierra (GND) y el resto de patas van a las salidas del ARDUINO a través de resistencias limitadoras de corriente (220 ohms), donde para encender cada segmento necesitamos mandar una señal alta o de 5 volts, digitalWrite(pin,HIGH).

En el Display de 7 Segmentos de Ánodo Común, el pin común se conecta a 5V (Vcc) y el resto de patas van a las salidas del ARDUINO a través de resistencias limitadoras de corriente (220 ohms), donde para encender cada segmento necesitamos mandar una señal baja o de 0 volts, digitalWrite(pin,LOW).

A continuación se muestra el conexionado de un Display 7 Segementos de Cátodo Común, pero el conexionado es igual para el Display 7 Segementos de Ánodo Común, con la diferencia que el común va a positivo y no a GND.

Display de 7 Segmentos

Quizas te interese algunos productos de Arduino en Amazon a un mu buen precio.

Números en Display 7 Segmentos

Para mostrar los números en un display de 7 segmentos, debemos proporcionar con el ARDUINO la secuencia de la tabla de verdad de los displays de Cátodo o Ánodo común:

Display 7 Segmentos Anodo Común
Display 7 Segmentos Catodo Común

La tabla muestra la secuencia que debe ser ingresada en los displays en cada segmento desde el a hasta el g en binario y también muestra la cantidad en Hexadecimal, que para nuestra facilidad, utilizaremos el numero Hexadecimal para formar esta tabla dentro del Arduino IDE.

A continuación te dejo las dos tablas para que las copies en Arduino IDE dentro de un Arreglo (vector)

//Display 7 Segmentos Catodo Común
int display7c[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

//Display 7 Segmentos Anodo Común
int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};

para facilitar nuestra vida, usaremos una función de ARDUINO llamada:

bitRead(x, n)

Parametros

x: el numero que se desea leer
n: cual bit desea devolver (el menos significante se encuntra a la derecha)

Ejemplo

El numero 11 en binario se escribe como (0b1011), si usamos bitRead podremos obtener cualquiera de los 4 bits:

bitRead(11,0); //obtiene el bit 0 (1)
bitRead(11,1); //obtiene el bit 1 (1)
bitRead(11,2); //obtiene el bit 2 (0)
bitRead(11,3); //obtiene el bit 3 (1)

Función PUERTO

La función PUERTO es creada por MI y es própia del Canal CONTROL AUTOMÁTICO EDUCACIÓN, la función lo que hace es tomar un numero entero y lo divide en bits mandando cada bit a las salidas digitales comenzando desde un PIN cualquiera hasta un PIN final cualquiera (El orden de los pines se hará de forma ascendente)

función puerto(bits, Pin Inicial, Pin Final);

  • bits: numero entero que se desea sacar por las salidas digitales
  • Pin Inicial: El primer pin del arreglo de bits en Arduino que es una salida digital
  • Pin Final: El ultimo pin del arreglo de bits en Arduino que es una salida digital

Ejemplo

Vamos a suponer que los PINES 2 al 8 del arduino son salidas digitales y que yo quiero sacar el número 63 por el puerto digital. El 63 se escribe en binario (0b0011 1111) o en hexadecimal como (0x3F)

llamamos la función puerto para eso:

 puerto(0x3F,2,8);

le dijimos saque por el puerto el número 63 comenzando en el PIN 2 hasta el PIN 8.

La función puerto la declaramos antes del void SETUP, y es la siguiente:

//Función que coloca en el puerto de salida los bits comenzando
// desde el pin ini hasta el pin fin
void puerto(int bits,int ini,int fin){
  for(int i=ini;i<=fin;i++)
  {
    digitalWrite(i,bitRead(bits,i-ini));
  }
}

AntiRebote

En los elementos mecánicos como pulsadores, switches, relés, etc. Sucede un fenómeno conocido como el Rebote, el cual es una señal de RUIDO que ingresa en las entradas digitales del ARDUINO cuando se cambia de estado lógico. La señal de Rebote tiene la siguiente forma:

Antirebote PIC Microcontrolador

Vemos que cambiando de estado logico de 0 para 1, hubieron varios picos y el arduino o microcontrolador en general, puede interpretar esos picos como si se hubiera activado y desactivado varias veces aquella entrada digital, cuando en realidad solo hizo un único cambio.

Para evitar el Rebote, debemos colocar en nuestros códigos un simple retardo de 150ms o 200ms siempre que queramos leer un dispositivo mecanico, de esa forma le damos tiempo al Rebote de desaparecer y asi el ARDUINO consigue leer la señal verdadera en sus entradas digitales.

Resistencia PULLUP

La resistencia PULLUP es una resistencia interna del ARDUINO que va a positivo y que debe ser configurada en las entradas digitales del ARDUINO.

pinMode(PIN,INPUT_PULLUP);

Con esta resistencia interna, nos podemos ahorrar la resistencia PULLDOWN que colocamos en los PULSADORES de la entrada pasada de Entradas Digitales de Arduino.

INPUT_PULLUP Arduino

Ejemplo Display 7 Segmentos con ARDUINO

Vamos a hacer un Contador Incremental y Decremental con un display de 7 segmentos en Arduino y dos pulsadores. El pulsador incremental lo configuraremos como PULLDOWN y el pulsador decrementa lo configuraremos como PULLUP. El esquemático es el siguiente:

El código de implementación es el siguiente: Para descargarlo solo debes compartir el código con cualquiera de los tres botones de esa forma ayudas a que este sitio web continue aportando contenido gratuito y de calidad:

Pudes ver la simulación de este circuito en Tinkercad si lo deseas Dando CLICK AQUÍ y seleccionando el proyecto de display 7 segmentos.

//*************************************************************//
//*************************************************************//
//****                                                    *****//
//**** CONTADOR CRECIENTE Y DECRECIENTE CON DISPLAY 7 SEG *****//
//****                                                    *****//
//**** By: SERGIO ANDRES CASTAÑO GIRALDO                  *****//
//**** https://controlautomaticoeducacion.com/            *****//
//**** RIO DE JANEIRO - BRASIL - 2018                     *****//
//****                                                    *****//
//*************************************************************//
//*************************************************************//
//Display 7 Segmentos Catodo Común
int display7c[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
//Display 7 Segmentos Anodo Común
int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};
//Delcaración de Los Pines del Display
byte a=2;
byte b=3;
byte c=4;
byte d=5;
byte e=6;
byte f=7;
byte g=8;
byte inc=9;    //Pulsador Incremento (Resistencia pulldown)
byte dec=10;   //Pulsador Incremento (Resistencia pullup)
int contador=0;
//Función que coloca en el puerto de salida los bits comenzando
// desde el pin ini hasta el pin fin
void puerto(int bits,int ini,int fin){
  for(int i=ini;i<=fin;i++)
  {
    digitalWrite(i,bitRead(bits,i-ini));
  }
}
void setup() {
  //Configura los 8 Pines digitales como SALIDAS
  for(int i=a;i<=g;i++){
    pinMode(i,OUTPUT);
  }
  pinMode(inc,INPUT);
  pinMode(dec,INPUT_PULLUP);
}
void loop() {
    //Incremento del Contador
    if(digitalRead(inc)){
      delay(100);
      while(digitalRead(inc)); //Anti-Rebote
      delay(100);
      contador++;
    }
    //Decremento del Contador
    if(!digitalRead(dec)){
      delay(100);
      while(!digitalRead(dec)); //Anti-Rebote
      delay(100);
      contador--;
    }
    //Si pasa de 9 en el incremento
    if(contador>9){
      contador=0;
    }
    //Si pasa de 0 en el decremento
    if(contador<0){
      contador=9;
    }
    //Muestra los numeros en el Display
    puerto(display7c[contador],a,g);
}

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (21)

Buen dia, como seria la conexion para poner dos botones y dos display de 7 segmentos, donde cada boton seria para un display y que al momento de presionar uno marque en solo un display?

Responder

Para crear un sistema en el que dos botones controlen individualmente dos displays de 7 segmentos, tendrías que realizar conexiones similares a las del proyecto anterior, pero duplicándolas y asegurándote de que cada botón esté vinculado solo a su display correspondiente.
Algo como:

int contador1 = 0;
int contador2 = 0;

void setup() {
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
// Asegúrate de configurar los pines de los displays como salidas
}

void loop() {
if (digitalRead(boton1) == HIGH) {
contador1++;
mostrarEnDisplay(contador1, display1);
delay(200); // Anti-rebote
}

if (digitalRead(boton2) == HIGH) {
contador2++;
mostrarEnDisplay(contador2, display2);
delay(200); // Anti-rebote
}
}

void mostrarEnDisplay(int numero, int display) {
// Aquí va el código para mostrar 'numero' en 'display'
}

Responder

Hola
Pregunta el arduino lo tengo conectado al compu?tador, compila, pero no me muestra nada en el display, debe estar conectado a un cargador?

Responder

No es necesario si lo dejas conectado al computador ya con eso basta. Debes primero compilar y luego debes cargar el programa al arduino.

Responder

por que al pasar de un de digito la luz se desvanece paulatinamente, pareciera que antirrebote no funcionara, modifico el delay del while y no hace varia la intermitencia

Responder

Hola Diego, talvez verificar la fuente de alimentación que sea estable. El rebote no causa ese efecto, si tu circuito estuviera con rebote al presionar el botón, se te incrementaría o decrementaría varias veces el número con solo pulsar el botón una vez.

Responder

hola, estuve haciendo pruebas intentando agregar dos pulsadores para realizar un conteo ascendente y descendente con dos display pero no logro llegar a la configuración correcta me podrias ayudar?

Responder

Para usar más de un display debes usar el método de la multiplexación el cual ya la explicamos aqui. Dale un vistazo.

Responder

Hola! Estuve probando tu código y montaje, y el botón de decremento funciona muy bien, sin embargo el de incremento no sirve, lo oprimo y en el display no avanza, no sé si sea por algo del código o del montaje como la resistencia 🙁

Responder

Hola, tengo una duda quisiera saber si por favor podrías responderla, en el caso de ser para 2 dígitos, se usaría el mismo código o ya cambiaría?
Gracias!

Responder

Debes aplicar el método de la multiplexación para colocar vários displays. Dale un vistazo a nuestra entrada Click Aquí y quitarle los dos digitos adicionales, en tempor<99 y dig tendrá dos posiciones, y quitar dos transistores en la multiplexación.

Responder

Hola me gustaria saber como se haría para un display de 2 digitos?

Responder

Hola Estefania, debes aplicar el método de la multiplexación para colocar vários displays. Dale un vistazo a nuestra entrada Click Aquí.

Responder

Gracias, pero el código cambia o seguiría siendo el mismo?

Responder

Básicamente es el mismo, solo debes quitarle los dos digitos adicionales, en tempor<99 y dig tendrá dos posiciones, y quitar dos transistores en la multiplexación.

Responder

*************************************************************//
Este era el problema… Falta de // al inicio del comentario.
//*************************************************************//
Con eso todo trabaja normal…Gracias.

Responder

Display_7_Segmentos_con_ARDUINO:13:1: error: expected unqualified-id before ‘int’

int display7c[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

^~~

Display_7_Segmentos_con_ARDUINO:13:1: error: expected constructor, destructor, or type conversion before ‘int’

E:\JERS\Microprocesadores y computadoras\Arduino\Sketches\Display_7_Segmentos_con_ARDUINO\Display_7_Segmentos_con_ARDUINO.ino: In function ‘void loop()’:

Display_7_Segmentos_con_ARDUINO:68:12: error: ‘display7c’ was not declared in this scope

puerto(display7c[contador],a,g);

^~~~~~~~~

E:\JERS\Microprocesadores y computadoras\Arduino\Sketches\Display_7_Segmentos_con_ARDUINO\Display_7_Segmentos_con_ARDUINO.ino:68:12: note: suggested alternative: ‘display7a’

puerto(display7c[contador],a,g);

^~~~~~~~~

display7a

exit status 1

expected unqualified-id before ‘int’

Responder

falta // al comienzo del código. Ya fue corregido.

Responder

Muy interesante, pero al compilarlo arroja dos errores

68:2: error: expected unqualified-id before ‘<' token

}

^

exit status 1
expected unqualified-id before ‘<' token

Responder

Hola Orlando, gracias por avisarme. Vuelve a copiar el código que lo he corregido, pues sufrió un cambio de formatación en la página cuando modifiqué unas configuraciones de la misma. Saludos.

Responder

ayudame , nesecito con dos digitos de 00 a 99 plis , soy nuevo en el medio, como agrego el otro display

Responder