How to use Arduino/sevseg library on 4 digit common anode?

Control de Displays 7 Segmentos con Arduino y SevSeg

14/02/2025

Valoración: 4.9 (4169 votos)

Los displays de siete segmentos son componentes electrónicos icónicos, omnipresentes en relojes digitales, calculadoras y una miríada de dispositivos que requieren una visualización numérica sencilla y efectiva. Su popularidad radica en su bajo costo, facilidad de uso y la claridad con la que presentan la información. Sin embargo, controlarlos directamente con un microcontrolador como Arduino puede consumir un número considerable de pines, haciendo que proyectos complejos sean un desafío. Es aquí donde la librería SevSeg brilla, simplificando drásticamente la interacción con estos displays y liberando valiosos pines para otras funcionalidades.

How to use Arduino/sevseg library on 4 digit common anode?
Arduino/sevseg library on 4 digit common anode. You need to know, if your segment is common anode or cathode. Then you must write down all that info on some paper by using multi-meter. Third part you need to put your segment on the breadboard and wiring that. My 4-digit segment in this experiment had: Bottom Row e, d, dp, c, g, 4.

La librería SevSeg transforma su Arduino en un controlador dedicado para displays de siete segmentos, permitiendo mostrar números y caracteres sin la necesidad de controladores externos adicionales. Es una solución robusta y flexible que soporta una amplia gama de configuraciones, desde displays de un solo dígito hasta complejos sistemas de ocho dígitos, tanto de cátodo común como de ánodo común. Además, ofrece funcionalidades avanzadas como el manejo de puntos decimales, la visualización de números enteros y flotantes, y la capacidad de mostrar caracteres alfanuméricos de la forma más precisa posible en este tipo de display. Este artículo explorará en profundidad cómo configurar y utilizar esta potente herramienta, centrándonos en los displays de ánodo común de cuatro dígitos y abordando la cuestión de cómo expandir la funcionalidad más allá de los ocho dígitos.

Índice de Contenido

Configurando su Display de 7 Segmentos de Ánodo Común de 4 Dígitos

El display de siete segmentos de ánodo común es uno de los tipos más utilizados. En estos displays, todos los ánodos (positivos) de los LEDs de los segmentos están conectados a un pin común, mientras que los cátodos (negativos) de cada segmento (A, B, C, D, E, F, G y DP) son individuales. Para encender un segmento, se debe aplicar un voltaje bajo (LOW) a su pin de segmento correspondiente y un voltaje alto (HIGH) al pin común del dígito. A continuación, detallamos los pasos clave para su conexión y configuración con la librería SevSeg.

Conexiones Físicas: Pines del Display y Arduino

Antes de escribir cualquier línea de código, es fundamental realizar las conexiones físicas correctas entre su display de siete segmentos y el Arduino. Un display de 4 dígitos suele tener un pin común para cada dígito y ocho pines para los segmentos (uno por cada segmento A-G y el punto decimal DP). Identifique estos pines en su display. A menudo, los displays vienen con una hoja de datos o un esquema de pines. Si no, una búsqueda rápida en línea con el modelo de su display (como el "HS410561k-32" mencionado en la documentación) puede ayudar.

Todos los pines de dígito y los pines de segmento se pueden conectar a cualquiera de los pines digitales de Arduino, o incluso a los pines analógicos que soportan funcionalidad digital. La clave es anotar cuidadosamente qué pin del display se conecta a qué pin del Arduino, ya que esta información será crucial para la configuración del software.

Pines de Dígito: Son los pines comunes para cada dígito. Para un display de ánodo común, estos pines reciben un voltaje alto (HIGH) para activar un dígito específico.

Pines de Segmento: Son los pines individuales para cada uno de los siete segmentos (A, B, C, D, E, F, G) y el punto decimal (DP). Para un display de ánodo común, un estado LOW en un pin de segmento lo encenderá cuando el dígito correspondiente esté activo.

Resistencias Limitadoras de Corriente: Un Componente Vital

Dado que los displays de siete segmentos están compuestos por LEDs, es imperativo utilizar resistencias limitadoras de corriente. Ignorar este paso puede llevar a la quema de los LEDs del display o incluso dañar los pines de su Arduino. Un valor seguro y comúnmente recomendado es de 330 ohmios.

La ubicación de estas resistencias es importante para la configuración de la librería. Pueden colocarse en serie con los pines de dígito o con los pines de segmento. La documentación de SevSeg recomienda colocarlas en los pines de dígito para la configuración por defecto. Si las coloca en los pines de segmento, deberá indicarlo a la librería durante la inicialización.

Tabla de Conexión Típica (ejemplo para 4 dígitos de ánodo común):

Función del Pin del DisplayPin del Arduino (Ejemplo)Notas
Dígito 1 (Común Ánodo)Pin Digital 2Con resistencia de 330 ohmios
Dígito 2 (Común Ánodo)Pin Digital 3Con resistencia de 330 ohmios
Dígito 3 (Común Ánodo)Pin Digital 4Con resistencia de 330 ohmios
Dígito 4 (Común Ánodo)Pin Digital 5Con resistencia de 330 ohmios
Segmento APin Digital 6
Segmento BPin Digital 7
Segmento CPin Digital 8
Segmento DPin Digital 9
Segmento EPin Digital 10
Segmento FPin Digital 11
Segmento GPin Digital 12
Punto Decimal (DP)Pin Digital 13Opcional, si su display lo tiene y lo usa

Configuración del Software con sevseg.begin()

Una vez que las conexiones físicas están listas, el siguiente paso es configurar la librería SevSeg en su código de Arduino. Esto se realiza en la función setup() de su sketch, utilizando el método sevseg.begin(). Este método requiere varios parámetros que informan a la librería sobre la configuración de su hardware y sus preferencias de visualización.

#include "SevSeg.h" SevSeg sevseg; // Instancia un objeto de siete segmentos void setup() { byte numDigits = 4; // Número de dígitos de su display byte digitPins[] = {2, 3, 4, 5}; // Pines de Arduino conectados a los pines comunes de los dígitos (de izquierda a derecha) byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // Pines de Arduino conectados a los segmentos (A-G, luego DP) bool resistorsOnSegments = false; // 'false' si las resistencias están en los pines de dígito (recomendado) byte hardwareConfig = COMMON_ANODE; // ¡Importante! Especifica que es un display de ánodo común bool updateWithDelays = false; // 'false' es lo recomendado para evitar bloqueos bool leadingZeros = false; // 'false' para ocultar ceros a la izquierda (ej: 007 se muestra como 7) bool disableDecPoint = false; // 'false' si el punto decimal está conectado y se usará sevseg.begin( hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint ); // Opcional: Establecer un brillo inicial sevseg.setBrightness(90); // Valor entre 0 y 100, 90 es un buen punto de partida } void loop() { sevseg.refreshDisplay(); // ¡Crucial! Debe ser llamado repetidamente en loop() // Aquí iría la lógica de su programa para actualizar los números // Por ejemplo: // static unsigned long timer = millis(); // if (millis() - timer > 1000) { // timer = millis(); // static float counter = 0.0; // sevseg.setNumberF(counter, 2); // counter += 0.01; // } } 

Desglosemos los parámetros clave para su display de ánodo común:

  • numDigits: El número total de dígitos en su display, en este caso, 4.
  • digitPins[]: Un array de bytes que contiene los números de los pines de Arduino conectados a los pines de dígito de su display. El orden es importante: de izquierda a derecha.
  • segmentPins[]: Un array de bytes con los números de los pines de Arduino conectados a los segmentos. El orden estándar es A, B, C, D, E, F, G, y luego el Punto Decimal (DP). Si no usa el DP o no lo tiene, puede omitir su pin y establecer disableDecPoint en true.
  • resistorsOnSegments: Establezca esto en false si ha colocado las resistencias en los pines de dígito (lo más común y recomendado). Si las puso en los pines de segmento, cámbielo a true.
  • hardwareConfig: Para un display de ánodo común simple sin transistores externos de conmutación, debe usar COMMON_ANODE. Otros valores como COMMON_CATHODE, N_TRANSISTORS, P_TRANSISTORS, NP_COMMON_CATHODE, NP_COMMON_ANODE son para configuraciones de hardware más específicas que usan transistores de conmutación.

Operaciones Básicas y Avanzadas con SevSeg

Una vez inicializada la librería, puede comenzar a mostrar información en su display. La flexibilidad de SevSeg permite una amplia gama de visualizaciones, desde números simples hasta cadenas de caracteres.

Refrescando el Display: La Función refreshDisplay()

La clave para que el display muestre información de forma continua y sin parpadeos es llamar a sevseg.refreshDisplay() repetidamente dentro de su función loop(). Esta función implementa una técnica llamada multiplexado, donde cada dígito se enciende y apaga muy rápidamente en secuencia, dando la ilusión de que todos los dígitos están encendidos simultáneamente. Cualquier uso de delay() en su código interferirá con este proceso de multiplexado y causará un parpadeo notable o una visualización incorrecta. Es fundamental estructurar su código para evitar delay(), utilizando enfoques basados en tiempo como el ejemplo de 'Blink Without Delay' de Arduino.

Mostrando Números: setNumber() y setNumberF()

La librería ofrece dos funciones principales para mostrar valores numéricos:

  • sevseg.setNumber(valorEntero, posDecimal): Para números enteros. El segundo argumento indica la posición del punto decimal, contando desde el dígito menos significativo (el de más a la derecha). Por ejemplo, sevseg.setNumber(3141, 3) mostraría '3.141'. Para un entero sin punto decimal, use 0 como segundo argumento o omítalo.
  • sevseg.setNumberF(valorFlotante, precisionDecimal): Para números de punto flotante. El segundo argumento especifica cuántos decimales de precisión desea mostrar. Por ejemplo, sevseg.setNumberF(3.14159f, 3) mostraría '3.141'.

Si un número está fuera del rango que el display puede mostrar (por ejemplo, un número muy grande para un display de 4 dígitos), SevSeg lo mostrará como '----'. También puede pasar true como tercer argumento para mostrar el número en representación hexadecimal.

Mostrando Cadenas de Caracteres: setChars()

Aunque los displays de siete segmentos no son ideales para texto, SevSeg puede mostrar cadenas de caracteres de forma aproximada utilizando sevseg.setChars("cadena"). Solo se admiten caracteres alfanuméricos, además de ' ', '-', y '.'. La librería mapea estos caracteres a la representación más cercana posible en un display de siete segmentos. Es importante que la cadena de caracteres esté terminada en NULL.

How do I use more than 8 digits in sevseg?
Order them from segment a to g, then the decimal place (if it's connected). If you wish to use more than 8 digits, increase MAXNUMDIGITS in SevSeg.h. Your program must run the refreshDisplay () function repeatedly to display the number.

Control Personalizado de Segmentos: setSegments() y setSegmentsDigit()

Para un control más granular, puede manipular los segmentos individuales de cada dígito. Esto es útil para crear símbolos personalizados o animaciones.

  • sevseg.setSegments(uint8_t segs[]): Permite establecer el estado de los segmentos para todos los dígitos a la vez. Cada byte en el array segs representa la configuración de un dígito, donde cada bit corresponde a un segmento en el orden .GFEDCBA.
  • sevseg.setSegmentsDigit(byte digit, uint8_t segCode): Permite establecer la configuración de segmentos para un dígito específico. El primer argumento es el índice del dígito (0 para el primero), y el segundo es el código de byte para los segmentos.

Los 'digitCodes' son valores hexadecimales que representan qué segmentos deben encenderse. Por ejemplo, 0x7B podría ser el código para el dígito '3' (dependiendo de si es ánodo o cátodo común y el mapeo de segmentos). La documentación de SevSeg (y el archivo SevSeg.cpp) contiene ejemplos de estos códigos.

Ajustando el Brillo: setBrightness()

La función sevseg.setBrightness(valor) permite ajustar la intensidad de la luz del display. El valor puede variar entre -200 y 200. El rango estándar es de 0 a 100. Valores fuera de este rango pueden causar un parpadeo notorio. Un valor de 0 no significa ausencia total de brillo. El brillo percibido dependerá de varios factores: las características de su display, el modelo de Arduino, los valores de las resistencias y la cantidad de tiempo que su programa dedica a otras tareas.

¿Cómo Usar Más de 8 Dígitos con SevSeg?

Una de las preguntas más comunes es cómo expandir la funcionalidad de SevSeg para displays con más de ocho dígitos. La librería SevSeg, en su versión principal, está diseñada para soportar de 1 a 8 dígitos. Esta limitación se debe principalmente a que cada dígito requiere un pin dedicado en el Arduino, y el número de pines digitales disponibles en la mayoría de los modelos de Arduino (como el Uno, que tiene 14) se vuelve un factor restrictivo cuando se combinan los pines de dígito con los 8 pines de segmento necesarios.

Sin embargo, la propia documentación de SevSeg aborda esta cuestión. Para permitir más de 8 dígitos, se requeriría una modificación interna de la librería. Específicamente, se menciona la constante MAXNUMDIGITS en el archivo SevSeg.h. Si bien teóricamente se podría aumentar este valor, la realidad es que el número de pines de Arduino pronto se convertiría en un cuello de botella. Un display de 9 dígitos, por ejemplo, necesitaría 9 pines para los dígitos más 8 pines para los segmentos, sumando un total de 17 pines, lo cual supera la capacidad de un Arduino Uno estándar.

La Solución: Registros de Desplazamiento (Shift Registers)

La forma más eficiente y estándar de controlar un gran número de dígitos en un display de siete segmentos (o cualquier otro componente que requiera muchos pines) es mediante el uso de registros de desplazamiento (como el 74HC595). Estos CI (Circuitos Integrados) permiten controlar muchos pines de salida utilizando solo unos pocos pines de un microcontrolador (típicamente 3 pines: Data, Clock, y Latch). Esto libera la mayoría de los pines de su Arduino para otras funciones.

La versión principal de la librería SevSeg no soporta directamente registros de desplazamiento. No obstante, la documentación hace referencia a una rama o fork compatible llamada SevSegShift, desarrollada por bridystone. Esta versión modificada sí integra el soporte para registros de desplazamiento, lo que la convierte en la opción ideal si su proyecto requiere un número de dígitos superior a la capacidad directa de la librería base y los pines de su Arduino. Aunque este artículo se centra en la librería SevSeg estándar, es crucial conocer esta alternativa para proyectos de mayor escala.

Para implementar displays con más de 8 dígitos, la ruta recomendada es:

  1. Diseñar el circuito utilizando uno o más registros de desplazamiento para controlar los segmentos y/o los dígitos del display.
  2. Utilizar una librería como SevSegShift (o adaptar la lógica de su código para interactuar directamente con los registros de desplazamiento) para manejar la visualización.

Esto permite escalar sus proyectos de visualización de manera significativa sin agotar los recursos de pines de su microcontrolador.

Preguntas Frecuentes (FAQ)

Mi display parpadea constantemente, ¿qué estoy haciendo mal?

El parpadeo es casi siempre un indicio de que la función sevseg.refreshDisplay() no se está llamando con la suficiente frecuencia o de manera consistente. Revise su función loop() y asegúrese de que sevseg.refreshDisplay() se ejecuta en cada iteración. Además, evite el uso de la función delay() en su código, ya que bloquea la ejecución y detiene el multiplexado del display. En su lugar, utilice técnicas de programación sin bloqueo, como el uso de millis() para temporizar eventos.

El display muestra '----', ¿por qué?

Esto ocurre cuando el número que intenta mostrar es demasiado grande para el número de dígitos de su display. Por ejemplo, si intenta mostrar '12345' en un display de 4 dígitos, SevSeg lo indicará con '----'. Asegúrese de que el número que pasa a setNumber() o setNumberF() esté dentro del rango de visualización de su hardware.

No se enciende ningún segmento o dígito.

  • Revise sus conexiones físicas: Verifique que los pines de dígito y segmento estén conectados correctamente a los pines de Arduino especificados en su código.
  • Polaridad del display: Asegúrese de que su hardwareConfig (por ejemplo, COMMON_ANODE o COMMON_CATHODE) coincida con el tipo de display que está utilizando. Un error aquí es una causa común.
  • Resistencias: Confirme que ha usado resistencias limitadoras de corriente y que su valor es apropiado (330 ohmios es un buen punto de partida). También, verifique el parámetro resistorsOnSegments en sevseg.begin().
  • Alimentación: Asegúrese de que el display esté recibiendo suficiente energía.

El punto decimal no se enciende o no aparece.

Primero, verifique que el pin del punto decimal (DP) de su display esté correctamente cableado a uno de los pines de segmento de Arduino y que ese pin esté incluido en su array segmentPins[]. Luego, asegúrese de que el parámetro disableDecPoint en sevseg.begin() esté establecido en false. Finalmente, verifique la lógica en setNumber() o setNumberF() para asegurarse de que está indicando la posición correcta del punto decimal.

¿Puedo usar los pines analógicos del Arduino para el display?

Sí, la mayoría de los pines analógicos de Arduino (A0-A5 en un Uno, por ejemplo) también pueden funcionar como pines digitales. Puede usarlos para conectar su display. Sin embargo, tenga en cuenta que algunos modelos de Arduino (como el Nano) pueden tener excepciones o limitaciones con ciertos pines analógicos, por lo que siempre es bueno consultar la documentación específica de su placa.

Conclusión

La librería SevSeg es una herramienta excepcionalmente útil para cualquier entusiasta de Arduino que trabaje con displays de siete segmentos. Simplifica la programación, optimiza el uso de pines y ofrece una gran flexibilidad para la visualización de datos. Dominar su configuración, especialmente para displays de ánodo común, y comprender la importancia de refreshDisplay() sin la interrupción de delay(), son pasos fundamentales para crear interfaces de usuario claras y funcionales. Aunque la librería base tiene sus límites para un número muy elevado de dígitos, la existencia de alternativas como SevSegShift y la comprensión del papel de los registros de desplazamiento abren las puertas a proyectos de visualización mucho más ambiciosos. Con esta guía, esperamos que se sienta más seguro para iluminar sus próximos proyectos con la claridad que solo un display de siete segmentos puede ofrecer.

Si quieres conocer otros artículos parecidos a Control de Displays 7 Segmentos con Arduino y SevSeg puedes visitar la categoría Librerías.

Subir