Aprende ARDUINO 8. Manejo de DISPLAY de 7 segmentos con ARDUINO Al momento que se desea mostrar algún resultado numérico hacia el exterior de nuestra tarjeta Arduino una de los componentes más utilizados son los DISPLAY de 7 segmentos, este componente también llamado visualizador de 7 segmentos, es un periférico que se utiliza para la representación de números en muchos dispositivos electrónicos debido en gran medida a su simplicidad. Aunque externamente su forma difiere considerablemente de un diodo LED (diodos emisores de luz) típico, internamente están constituidos por una serie de diodos LED con unas determinadas conexiones internas, estratégicamente ubicados de tal manera que forme un número 8 al activarse los 7 LEDs, a partir de esto que puedan representarse todos los símbolos numéricos y algunas letras. Los primeros siete segmentos son los encargados de formar el símbolo y con el octavo podemos encender y apagar el punto decimal. Figura 8-1, Estructura de un DISPLAY de 7 segmentos. A cada uno de los segmentos LED que forman el DISPLAY se les denomina con una letra: a, b, c, d, e, f y g y están ensamblados de forma que se permita activar cada segmento por separado consiguiendo formar cualquier dígito numérico, ver figura 8-1, y los hay de dos tipos: ánodo común y cátodo común. En los DISPLAY de tipo de ánodo común, todos los ánodos de los LED o segmentos están unidos internamente a una patilla común que debe ser conectada a potencial positivo (nivel “1”) y el encendido de cada segmento individual se realiza aplicando potencial negativo (nivel “0”) por la patilla correspondiente a través de una resistencia que limite el paso de la corriente. 86 Guía Teórico Práctica Aprende ARDUINO En los DISPLAY de tipo de cátodo común, todos los cátodos de los LED o segmentos están unidos internamente a un terminal común que debe ser conectada a potencial negativo (nivel “0”) y el encendido de cada segmento individual se realiza aplicando potencial positivo (nivel “1”) por la terminal correspondiente a través de una resistencia que limite el paso de la corriente hacia cada segmento para que no se arruine, un valor estándar entre 220 o 470 ohmios. Figura 8-2, Conexión interna de los segmentos de un DISPLAY. Los segmentos pueden ser de diversos colores, aunque el DISPLAY más comúnmente utilizado es el de color rojo, aunque se pueden encontrar en diversos colores y por su facilidad de visualización el DISPLAY de 7 segmentos sigue siendo una excelente opción en ciertas situaciones en las que se requiera mayor poder lumínico y trabajo en áreas hostiles, donde los DISPLAYs podrían verse afectado por condiciones ambientales adversas. Aún no se ha creado otro dispositivo de señalización que reúna características como este en cuanto a: Buen poder lumínico, claridad, sencillez para implementarlo, muy bajo costo, robustez. Manejo Directo con Arduino. Como cada segmento de un DISPLAY es básicamente un LED, se deduce que el manejo de estos es sencillo desde el sketch Arduino manipular el número a desplegar en el DISPLAY, como cada LED interno necesita una terminal de salida Arduino para ser conmutado, se necesitan al menos 7 salidas digitales para manipular un solo DISPLAY, a esta conexión se le denomina Manejo Directo, en esta cada pin de salida es manipulado individualmente por medio de digitalWrite(pin, estado) según el carácter que se desea formar en el DISPLAY, el siguiente ejemplo nos dejaran más claro esto. EJEMPLO.DISPLAY01. Se demostrara el Manejo Directo de un DISPLAY de 7 segmentos, siguiendo las conexiones que se muestran en las figuras 8-3 y 8-4. El Sketch a continuación muestra como desplegar caracteres numéricos en el DISPLAY, se mostraran todos los caracteres decimales a modo de conteo. /* Ejemplo.DISPLAY01 Muestra los numeros de 0 a 9 en un DISPLAY Catodo Comun Los segmentos se conectan a las salidas 2 a 8 con 87 Guía Teórico Práctica Aprende ARDUINO resistores de entre 220 y 470 ohmios, el comun a GND. Modifica por otoniel.flores@mail.utec.edu.sv Distribucion Libre CC */ //Salidas Arduino a conectar con los segmentos del DISPLAY int segA = 2; int segB = 3; int segC = 4; int segD = 5; int segE = 6; int segF = 7; int segG = 8; void setup() { //Configurar los pines como salidas pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT); pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT); } void loop() { //Se escribe el 0 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 1); digitalWrite(segE, digitalWrite(segG, 0); delay(1000); //Se escribe el 1 en el display digitalWrite(segA, 0); digitalWrite(segB, digitalWrite(segD, 0); digitalWrite(segE, digitalWrite(segG, 0); delay(1000); //Se escribe el 2 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 1); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Se escribe el 3 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 1); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Se escribe el 4 en el display digitalWrite(segA, 0); digitalWrite(segB, digitalWrite(segD, 0); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Se escribe el 5 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 1); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Se escribe el 6 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 1); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Se escribe el 7 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 0); digitalWrite(segE, digitalWrite(segG, 0); delay(1000); //Se escribe el 8 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 1); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Se escribe el 9 en el display digitalWrite(segA, 1); digitalWrite(segB, digitalWrite(segD, 0); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); //Apagamos el display digitalWrite(segA, 0); digitalWrite(segB, digitalWrite(segD, 0); digitalWrite(segE, digitalWrite(segG, 1); delay(1000); } //fin del Sketch 88 1); digitalWrite(segC, 1); 1); digitalWrite(segF, 1); 1); digitalWrite(segC, 1); 0); digitalWrite(segF, 0); 1); digitalWrite(segC, 0); 1); digitalWrite(segF, 0); 1); digitalWrite(segC, 1); 0); digitalWrite(segF, 0); 1); digitalWrite(segC, 1); 0); digitalWrite(segF, 1); 0); digitalWrite(segC, 1); 0); digitalWrite(segF, 1); 0); digitalWrite(segC, 1); 1); digitalWrite(segF, 1); 1); digitalWrite(segC, 1); 0); digitalWrite(segF, 0); 1); digitalWrite(segC, 1); 1); digitalWrite(segF, 1); 1); digitalWrite(segC, 1); 0); digitalWrite(segF, 1); 0); digitalWrite(segC, 0); 0); digitalWrite(segF, 0); Guía Teórico Práctica Aprende ARDUINO Figura 8-3. Diagrama de conexiones pictórico para el manejo directo de un DISPLAY Figura 8-4. Diagrama de conexiones pictórico para el manejo directo de un DISPLAY 89 Guía Teórico Práctica Aprende ARDUINO EJEMPLO.DISPLAY02. En este ejemplo se combinara el manejo de DISPLAY con la recepción de datos vía el Monitor Serial, se recibirá un carácter por el puerto USB y se desplegara este en el DISPLAY conectado a la tarjeta Arduino, se utilizara la conexión de la figura 8-3 y 8-4. /* Ejemplo.DISPLAY02 Muestra los numeros de 0 a 9 en un DISPLAY Catodo Comun segun la recepcion del Monitor Serial Los segmentos se conectan a las salidas 2 a 8 con resistores de entre 220 y 470 ohmios, el comun a GND. Modificado por otoniel.flores@mail.utec.edu.sv Distribucion Libre CC */ //Salidas Arduino a conectar con //los segmentos del DISPLAY int int int int segA = 2; int segB = 3; int segC = 4; segD = 5; int segE = 6; int segF = 7; segG = 8; byteSerial = 0;// para los datos de entrada serie void setup() { // abre el puerto serie, establece la velocidad a 9600 bps Serial.begin(9600); //Configurar los pines como salidas pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT); pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT); pinMode(segG, OUTPUT); //Imprimir en el Monitor Serial Serial.println ("Introduzca un numero entre 0 y 9"); } void loop() { //Verificar si hay algun dato proveniente de la PC if (Serial.available() > 0) //si esta disponible algun dato { // lee el byte de entrada: byteSerial = Serial.read(); Serial.println(byteSerial); if (byteSerial > 57 || byteSerial < 48) { //Apagamos el display digitalWrite(segA, 0); digitalWrite(segB, 0); digitalWrite(segC, 0); digitalWrite(segD, 0); digitalWrite(segE, 0); digitalWrite(segF, 0); digitalWrite(segG, 1); Serial.println ("Error ! Introduzca un numero entre 0 y 9"); } //vefificar el dato ingresado if (byteSerial == '0') { //Se escribe el 0 en el display digitalWrite(segA, 1); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 1); digitalWrite(segE, 1); digitalWrite(segF, 1); digitalWrite(segG, 0); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } 90 Guía Teórico Práctica Aprende ARDUINO if (byteSerial == '1') { //Se escribe el 0 en el display //Se escribe el 1 en el display digitalWrite(segA, 0); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 0); digitalWrite(segE, 0); digitalWrite(segF, 0); digitalWrite(segG, 0); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '2') { //Se escribe el 2 en el display digitalWrite(segA, 1); digitalWrite(segB, 1); digitalWrite(segC, 0); digitalWrite(segD, 1); digitalWrite(segE, 1); digitalWrite(segF, 0); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '3') { //Se escribe el 3 en el display digitalWrite(segA, 1); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 1); digitalWrite(segE, 0); digitalWrite(segF, 0); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '4') { //Se escribe el 4 en el display digitalWrite(segA, 0); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 0); digitalWrite(segE, 0); digitalWrite(segF, 1); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '5') { //Se escribe el 5 en el display digitalWrite(segA, 1); digitalWrite(segB, 0); digitalWrite(segC, 1); digitalWrite(segD, 1); digitalWrite(segE, 0); digitalWrite(segF, 1); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '6') { //Se escribe el 6 en el display digitalWrite(segA, 1); digitalWrite(segB, 0); digitalWrite(segC, 1); digitalWrite(segD, 1); digitalWrite(segE, 1); digitalWrite(segF, 1); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '7') { //Se escribe el 7 en el display digitalWrite(segA, 1); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 0); digitalWrite(segE, 0); digitalWrite(segF, 0); digitalWrite(segG, 0); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } 91 Guía Teórico Práctica Aprende ARDUINO if (byteSerial == '8') { //Se escribe el 8 en el display digitalWrite(segA, 1); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 1); digitalWrite(segE, 1); digitalWrite(segF, 1); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } if (byteSerial == '9') { //Se escribe el 9 en el display digitalWrite(segA, 1); digitalWrite(segB, 1); digitalWrite(segC, 1); digitalWrite(segD, 0); digitalWrite(segE, 0); digitalWrite(segF, 1); digitalWrite(segG, 1); delay(750); Serial.println ("Introduzca un numero entre 0 y 9"); } } } //fin del Sketch EJEMPLO.DISPLAY03. En este ejemplo se combinara el manejo de DISPLAY con un Puldador (Boton) para crear un dado digital, Al presionar le boton se mustra en el display un numero aleatorio, se utilizara la conexión de la figura 8-4.1. /* Ejemplo.DISPLAY03 Muestra los numeros de 0 a 9 en un DISPLAY Anodo Comun Modificado por otoniel.flores@mail.utec.edu.sv Distribucion Libre CC */ int numSort = 0; void setup() { pinMode(2, pinMode(3, pinMode(4, pinMode(5, pinMode(6, pinMode(7, pinMode(8, pinMode(9, } OUTPUT); OUTPUT); OUTPUT); OUTPUT); OUTPUT); OUTPUT); OUTPUT); INPUT); void loop() { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); while (digitalRead(9) == HIGH) { digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); 92 Guía Teórico Práctica Aprende ARDUINO digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); delay(100); // Wait for digitalWrite(2, LOW); delay(100); // Wait for digitalWrite(3, LOW); delay(100); // Wait for digitalWrite(4, LOW); delay(100); // Wait for digitalWrite(5, LOW); delay(100); // Wait for digitalWrite(6, LOW); delay(100); // Wait for digitalWrite(7, LOW); delay(100); // Wait for digitalWrite(2, HIGH); delay(100); // Wait for digitalWrite(3, HIGH); delay(100); // Wait for digitalWrite(4, HIGH); delay(100); // Wait for digitalWrite(5, HIGH); delay(100); // Wait for digitalWrite(6, HIGH); delay(100); // Wait for digitalWrite(7, HIGH); delay(100); // Wait for digitalWrite(2, LOW); delay(100); // Wait for digitalWrite(3, LOW); delay(100); // Wait for digitalWrite(4, LOW); delay(100); // Wait for digitalWrite(5, LOW); delay(100); // Wait for digitalWrite(6, LOW); delay(100); // Wait for digitalWrite(7, LOW); delay(100); // Wait for digitalWrite(2, HIGH); delay(100); // Wait for digitalWrite(3, HIGH); delay(100); // Wait for digitalWrite(4, HIGH); delay(100); // Wait for digitalWrite(5, HIGH); delay(100); // Wait for digitalWrite(6, HIGH); delay(100); // Wait for digitalWrite(7, HIGH); delay(100); // Wait for digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); delay(500); // Wait for numSort = random(1, 6 + 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 100 millisecond(s) 500 millisecond(s) 1); } if (numSort == 1) { 93 Guía Teórico Práctica Aprende ARDUINO digitalWrite(3, LOW); digitalWrite(4, LOW); } if (numSort == 2) digitalWrite(2, digitalWrite(3, digitalWrite(5, digitalWrite(6, digitalWrite(8, } if (numSort == 3) digitalWrite(2, digitalWrite(3, digitalWrite(4, digitalWrite(5, digitalWrite(8, } if (numSort == 4) digitalWrite(3, digitalWrite(4, digitalWrite(7, digitalWrite(8, } if (numSort == 5) digitalWrite(2, digitalWrite(4, digitalWrite(5, digitalWrite(7, digitalWrite(8, } if (numSort == 6) digitalWrite(2, digitalWrite(4, digitalWrite(5, digitalWrite(6, digitalWrite(7, digitalWrite(8, } { LOW); LOW); LOW); LOW); LOW); { LOW); LOW); LOW); LOW); LOW); { LOW); LOW); LOW); LOW); { LOW); LOW); LOW); LOW); LOW); { LOW); LOW); LOW); LOW); LOW); LOW); } 94 Guía Teórico Práctica Aprende ARDUINO Figura 8-4.1. Diagrama de conexiones para el ejemplo DISPLAY03 Los ejemplos anteriores permite el manejo directo de un DISPLAY, pero si se observa bien, se nota que si se desean manejar más de un DISPLAY a la vez y mostrar datos compuestos de 3 o más cifras, los pines de una tarjeta Arduino UNO no son suficientes ya que se necesitan 7 por cada DISPLAY a controlar, además en ocasiones se necesita tener más pines para conectar otros dispositivos como sensores, es en esta situación que mejor se recomienda el uso de circuitos integrados interfaces controladores de DISPLAY, es decir un componentes diseñados para que solo necesiten un par de pines Arduino y sea este circuito integrado interface quien se encargue de las conexiones a los DISPLAY, algunos ejemplos comúnmente usados son los circuitos integrados MAX7219 y TM1640, a continuación se verán algunos ejemplos para manipular DISPLAY usando estos circuitos. 95 Guía Teórico Práctica