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.

Display 7 Segmentos



Display 7 Segmentos
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

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:

//*************************************************************//
//*************************************************************//
//****                                                    *****//
//**** 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);
}

















No hay comentarios:

Publicar un comentario