ElectroDado

Este circuito actúa como un dado electrónico interactivo. Al presionar el botón, se activa primero un efecto visual en el que los segmentos del display de 7 segmentos parpadean de manera aleatoria durante aproximadamente un segundo, creando una animación dinámica y atractiva. Una vez culminado este efecto, el sistema genera y muestra un número aleatorio del 1 al 6, imitando el comportamiento de un dado real.

Materiales necesarios

  • Arduino Uno (o compatible)
  • Display LED de 8 segmentos (ánodo común)
  • 8 resistencias de 220 Ω
  • Botón pulsador
  • Resistencia de 10k Ω
  • Protoboard (Breadboard)
  • Cables de conexión (Jumper wires)

Circuito

Código

int boton = 0;  // Variable para leer el estado del botón
int numero = 0; // Número aleatorio que se mostrará en el display

// Definir pines para cada segmento (suponiendo display de ánodo común)
const int segA = 7;
const int segB = 6;
const int segC = 5;
const int segD = 4;
const int segE = 3;
const int segF = 2;
const int segG = 9;
// Si cuentas con un octavo segmento (por ejemplo, el punto decimal), asigna otro pin:
// const int segDP = 10;

void setup() {
  pinMode(8, INPUT);  // Pin del botón
  pinMode(segA, OUTPUT);
  pinMode(segB, OUTPUT);
  pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT);
  pinMode(segE, OUTPUT);
  pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT);
  // pinMode(segDP, OUTPUT);  // Si usas el punto decimal
  
  // Inicializa la semilla para números aleatorios (por ejemplo, leyendo un valor analógico no conectado)
  randomSeed(analogRead(0));
}

void randomEffect() {
  // Efecto aleatorio: durante 1 segundo, cada segmento se enciende o apaga de forma aleatoria
  unsigned long startTime = millis();
  while (millis() - startTime < 1000) { // 1000 ms = 1 segundo
    digitalWrite(segA, random(0, 2)); // random(0,2) retorna 0 o 1 (para display de ánodo común: LOW enciende, HIGH apaga)
    digitalWrite(segB, random(0, 2));
    digitalWrite(segC, random(0, 2));
    digitalWrite(segD, random(0, 2));
    digitalWrite(segE, random(0, 2));
    digitalWrite(segF, random(0, 2));
    digitalWrite(segG, random(0, 2));
    // Si cuentas con el segmento del punto decimal:
    // digitalWrite(segDP, random(0, 2));
    delay(100); // Breve retraso para apreciar el cambio
  }
}

void displayNumber(int num) {
  // Muestra un dígito específico en el display de 7 segmentos (ánodo común: LOW enciende el segmento)
  switch (num) {
    case 1:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
      break;
    case 2:
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, LOW);
      break;
    case 3:
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, LOW);
      break;
    case 4:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      break;
    case 5:
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      break;
    case 6:
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      break;
    default:
      // En caso de valor no esperado, se apagan todos los segmentos
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
      break;
  }
}

void loop() {
  boton = digitalRead(8); // Leer el estado del botón
  
  if (boton == HIGH) {
    // Al presionar el botón, se ejecuta el efecto de encendido aleatorio
    randomEffect();
    
    // Luego se genera y muestra un número aleatorio del 1 al 6
    numero = random(1, 7);  // random(1,7) genera valores entre 1 y 6
    displayNumber(numero);
    
    delay(200); // Pequeño retraso para evitar múltiples lecturas en un solo clic
  }
}

Versiones y mejoras posibles

  1. Agregar un buzzer
  2. Agregar un segundo display para 2 digitos