Capacitación Arduino · Display de 7 segmentos

7 segmentos
Del 0 al 9
con una perilla

Siete LEDs con forma de rayita forman cualquier número. Una perilla elige el número y el Arduino enciende los segmentos que hacen falta. Simulado en Tinkercad y en OpenCircuits.

7 salidas digitales Condiciones «o» Bloques + C++

El componente

Display de 7 segmentos (ánodo común)

gfCOMab edCOMcdp abcdefg
Son 8 LEDs en un solo encapsulado: 7 segmentos (a a g) y el punto dp.
Usamos uno de ánodo común (5161BS), como el que trae Tinkercad: las patas COM van a 5V y cada segmento se enciende con LOW (BAJA). (El 5161AS es de cátodo común: al revés.)
Lleva una resistencia de 220 Ω. Lo ideal es una por segmento; con una sola en COM funciona, pero el 1 brilla más que el 8.

Cómo funciona

Cada segmento sabe cuándo se apaga

SegmentoPinSe apaga en…
a arribaD41 y 4
b arriba derechaD55 y 6
c abajo derechaA12
d abajoA21, 4 y 7
e abajo izquierdaA3los impares y el 4
f arriba izquierdaD31, 2, 3 y 7
g centroD20, 1 y 7
  1. La perilla da 0 a 1023 en A0. Dividido por 103 queda un número de 0 a 9.
  2. Cada segmento revisa si el número está en su lista: si está, se apaga; si no, se enciende.
  3. Los pines A1, A2 y A3 también sirven como salidas digitales: así los cables del Arduino no se cruzan.

Para simular

Tinkercad lo tiene… y viene de ánodo común

En el kit real

Un dígito de 0,56", rojo: 5161BS (ánodo común).

En Tinkercad: «Visualizador de 7 segmentos»

Qué revisarTinkercad traePon esto (como el kit)
Común (propiedades)ÁnodoÁnodo (no cambiar)
Pata COM—a 5V por 220 Ω · el punto dp queda sin conectar
Segmentos—a, b, f, g a D4, D5, D3, D2 · c, d, e a A1, A2, A3
Entrada—potenciómetro en A0

En ánodo común un segmento se enciende con BAJA y se apaga con ALTA: al revés de un LED normal.

El display es una salida: el potenciómetro en A0 hace de entrada para elegir qué número mostrar.

Paso 1 · Componentes

Búscalos en el panel de componentes de Tinkercad

Arduino Uno R3 ×1

Buscar: Arduino

Placa de pruebas pequeña ×1

Buscar: Placa de pruebas

Visualizador de 7 segmentos ×1

Buscar: 7 segmentos. Común: ánodo.

Resistencia 220 Ω ×1

Entre COM y GND.

Potenciómetro ×1

Elige el número.

El display va sobre la canaleta del centro: una fila de patas en cada mitad de la protoboard.

Paso 2 · Circuito

Así se ve en Tinkercad

A0 0 ÷ 103 = 5

Paso 2 · Conexiones

Conexión por conexión

Display sobre la canaleta (columnas 12 a 16)
—Fila de arriba (fila g)g f COM a b
—Fila de abajo (fila c)e d COM c dp
Segmentos de arriba (cables a la fila j)
Arduino D2Columna 12 (g)
Arduino D3Columna 13 (f)
Arduino D4Columna 15 (a)
Arduino D5Columna 16 (b)
Segmentos de abajo (cables a la fila a)
Arduino A3Columna 12 (e)
Arduino A2Columna 13 (d)
Arduino A1Columna 15 (c)
COM, perilla y alimentación
—220 ΩColumna 14 (COM) → 18 (fila b)
Columna 18Riel +
—Potenciómetro columnas 21-2321 → −, 23 → +, 22 → A0
Arduino 5V / GNDRieles + / −

Paso 3 · Código en bloques

Arrastra estos bloques · desplázate para verlos todos

Antes de empezar

Variables → Crear variable: numero.

Son 7 bloques «si / si no», uno por segmento, todos iguales: «si el número está en la lista → ALTA (apagado), si no → BAJA (encendido)». Arma uno y duplícalo (clic derecho).
Controlsiempre, si / si no
Matemáticas÷, %, comparar ( =, <, > ), «o», «y»
Entradaleer pin analógico A0
Variablesdefinir numero en, numero
Salidadefinir pin … en ALTA / BAJA

Paso 3 · Código C++

El mismo programa en texto

// C++ code
//
int numero = 0;

void setup()
{
  pinMode(A0, INPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
}
En Tinkercad: Código → Bloques → Texto. Acepta el aviso, borra lo que haya y pega.
void loop()
{
  numero = (analogRead(A0) / 103);
  if (numero == 1 || numero == 4) {
    digitalWrite(4, HIGH);
  } else {
    digitalWrite(4, LOW);
  }
  if (numero == 5 || numero == 6) {
    digitalWrite(5, HIGH);
  } else {
    digitalWrite(5, LOW);
  }
  if (numero == 2) {
    digitalWrite(A1, HIGH);
  } else {
    digitalWrite(A1, LOW);
  }
  if ((numero == 1 || numero == 4) || numero == 7) {
    digitalWrite(A2, HIGH);
  } else {
    digitalWrite(A2, LOW);
  }
  if (numero % 2 == 1 || numero == 4) {
    digitalWrite(A3, HIGH);
  } else {
    digitalWrite(A3, LOW);
  }
  if (numero > 0 && numero < 4 || numero == 7) {
    digitalWrite(3, HIGH);
  } else {
    digitalWrite(3, LOW);
  }
  if (numero < 2 || numero == 7) {
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
  }
  delay(10); // Delay a little bit to improve simulation performance
}

Paso 4 · Simular

¡A probar!

  1. Pulsa Iniciar simulación: el display muestra un número.
  2. Gira el potenciómetro de un extremo al otro: pasa por 0, 1, 2 … 9.
  3. Compara cada número con la tabla de la diapositiva 3.

Si algo no funciona

Se ve al revésEl display quedó en «Cátodo»: déjalo en Ánodo (COM va a 5V).
Un segmento nunca prendeSu cable va a otra columna: revisa la tabla de la diapositiva 7.
Números rarosDos cables intercambiados (por ejemplo a y b).
Nada se enciendeCOM debe ir a GND a través de la 220 Ω.

Paso 5 · Kit real

Del simulador al display real

Mismas conexiones, mismo código

Las patas del 5161BS, vistas de frente con el punto abajo a la derecha:

Fila de arribag · f · COM · a · b
Fila de abajoe · d · COM · c · dp

No hace falta ninguna biblioteca: copia el C++ de la diapositiva 9 en el Arduino IDE y súbelo.

Antes de enchufar

  1. Confirma el modelo: 5161BS (ánodo común). Si es 5161AS (cátodo común), COM va a GND y en el código se intercambian los HIGH y LOW.
  2. Prueba cada segmento conectándolo un momento a 5V con su resistencia.
  3. Si quieres brillo parejo, pon una 220 Ω en cada segmento en vez de una en COM.

Alternativa · OpenCircuits

En OpenCircuits, el mismo circuito

Número 5 Iniciar.bat → SensoresDisplay de 7 segmentos · Número

El bloque que cambia

OpenCircuits no tiene bloques propios para el display, pero sí para el potenciómetro: «valor de 0 a 9» da el número directo, sin dividir.

PotenciómetroPotenciómetro pin A0: valor de 0 a 9
Controlsiempre, si / si no
Salidadefinir pin … en ALTA / BAJA

Usa map, así que el 9 aparece recién al final de la perilla. Dividir por 103 (Tinkercad) reparte los 10 números más parejo.

// C++ code
//
int numero = 0;

void setup()
{
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
}
void loop()
{
  numero = map(analogRead(A0), 0, 1023, 0, 9);
  if (numero == 1 || numero == 4) {
    digitalWrite(4, HIGH);
  } else {
    digitalWrite(4, LOW);
  }
  if (numero == 5 || numero == 6) {
    digitalWrite(5, HIGH);
  } else {
    digitalWrite(5, LOW);
  }
  if (numero == 2) {
    digitalWrite(A1, HIGH);
  } else {
    digitalWrite(A1, LOW);
  }
  if ((numero == 1 || numero == 4) || numero == 7) {
    digitalWrite(A2, HIGH);
  } else {
    digitalWrite(A2, LOW);
  }
  if (numero % 2 == 1 || numero == 4) {
    digitalWrite(A3, HIGH);
  } else {
    digitalWrite(A3, LOW);
  }
  if (numero > 0 && numero < 4 || numero == 7) {
    digitalWrite(3, HIGH);
  } else {
    digitalWrite(3, LOW);
  }
  if (numero < 2 || numero == 7) {
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
  }
  delay(10); // Delay a little bit to improve simulation performance
}

Para seguir

Retos

1 · Cuenta regresiva

Sin perilla: cuenta de 9 a 0, un número por segundo, con «contar».

2 · Dado electrónico

Al apretar un pulsador, muestra un número al azar de 1 a 6.

3 · Contador de visitas

Con el sensor infrarrojo: suma 1 cada vez que alguien pasa.

4 · El punto

Conecta dp y haz que parpadee una vez por segundo.

← → para avanzar · + − acercar el circuito · F pantalla completa