Electronic Dice

Difficulty: ● ○ ○ ○ ○

No products found in parts_required metafield

How It Works ?

Shake detection: Vibration ball switch → pin goes LOW when shakenRandom generation: Pick a number 0-5 → maps to dice faces 1-6Sparkle animation: Random LEDs light up with decreasing speed → creates anticipationDisplay result: 5×5 LED matrix shows the dice pattern → clear visual outcome

GENESIS

Connection Guide

Snap your modules as shown above, copy the code into the Arduino IDE and Click upload

example.ino
#include <FastLED.h>

// Configuration
#define LED_PIN          15
#define BUTTON_PIN       6  // Button connected to Pin 8
#define COLOR_ORDER      GRB
#define CHIPSET          WS2811
#define BRIGHTNESS       10

// Matrix dimensions
const uint8_t kMatrixWidth = 5;
const uint8_t kMatrixHeight = 5;

// Number of LEDs
#define NUM_LEDS (kMatrixWidth * kMatrixHeight)
CRGB leds[NUM_LEDS];

// Function to map XY coordinates to LED index
uint16_t XY(uint8_t x, uint8_t y) {
  // Simple row-major order mapping
  return (y * kMatrixWidth) + x;
}

// Define Dice Faces (5x5 grid)
const bool diceFaces[6][5][5] = {
  // Face 1
  {
    {false, false, false, false, false},
    {false, false, false, false, false},
    {false, false, true,  false, false},
    {false, false, false, false, false},
    {false, false, false, false, false}
  },
  // Face 2
  {
    {true,  false, false, false, false },
    {false, false, false, false, false},
    {false, false, false, false, false},
    {false, false, false, false, false},
    {false,  false, false, false, true }
  },
  // Face 3
  {
    {true,  false, false, false, false },
    {false, false, false, false, false},
    {false, false, true,  false, false},
    {false, false, false, false, false},
    {false,  false, false, false, true }
  },
  // Face 4
  {
    {true,  false, false,  false, true },
    {false, false, false, false, false},
    {false,  false, false,  false, false },
    {false, false, false, false, false},
    {true,  false, false,  false, true }
  },
  // Face 5
  {
    {true,  false, false,  false, true },
    {false, false, false, false, false},
    {false,  false, true,  false, false },
    {false, false, false, false, false},
    {true,  false, false,  false, true }
  },
  // Face 6
  {
    {true,  false, true,  false, true },
    {false,  false, false,  false, false },
    {false,  false, false,  false, false },
    {false,  false, false,  false, false },
    {true,  false, true,  false, true }
  }
};

// Function to display a specific dice face
void displayDiceFace(int faceIndex) {
  // Clear all LEDs
  FastLED.clear();

  // Calculate starting positions to center the 5x5 dice face
  int startX = (kMatrixWidth - 5) / 2;
  int startY = (kMatrixHeight - 5) / 2;

  // Light up LEDs based on the dice face pattern
  for(int y = 0; y < 5; y++) {
    for(int x = 0; x < 5; x++) {
      if(diceFaces[faceIndex][y][x]) {
        leds[XY(startX + x, startY + y)] = CRGB::White; // Set to white color
      }
    }
  }

  // Update the LED matrix
  FastLED.show();
}

// Function to perform the sparkle and transition to dice face
void sparkleAndDisplayDice(int faceIndex) {
  const int sparkleDuration = 1500; // Total duration of sparkle effect in ms
  const int sparkleInterval = 1;   // Initial interval between sparkles in ms
  unsigned long startTime = millis();
  int currentInterval = sparkleInterval;

  // Sparkle Phase: Randomly light up LEDs with decreasing speed
  while (millis() - startTime < sparkleDuration) {
    int sparkleCount = random(5, 15); // Number of LEDs to sparkle each interval

    for(int i = 0; i < sparkleCount; i++) {
      int x = random(0, kMatrixWidth);
      int y = random(0, kMatrixHeight);
      leds[XY(x, y)] = CHSV(random(0, 256), 255, 255); // Random color
    }

    FastLED.show();
    delay(currentInterval);

    // Gradually increase the interval to slow down sparkles
    if(currentInterval < 200) { // Max interval of 500ms
      currentInterval += 1;
    }
  }

  // Fade Out Phase: Gradually turn off LEDs
  for(int brightness = 255; brightness >= 0; brightness -= 5) {
    for(int i = 0; i < NUM_LEDS; i++) {
      leds[i].fadeToBlackBy(15); // Fade each LED
    }
    FastLED.show();
    delay(1);
  }

  // Display the dice face smoothly
  displayDiceFace(faceIndex);
}

void setup() {
  // Initialize Serial Communication for Debugging
  Serial.begin(9600);
  Serial.println("=== LED Matrix Dice Display Initialized ===");

  // Initialize FastLED
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
  FastLED.setBrightness(BRIGHTNESS);

  // Initialize Button Pin
  pinMode(BUTTON_PIN, INPUT_PULLUP); // Use internal pull-up resistor
  Serial.println("Button pin initialized with INPUT_PULLUP.");

  // Seed the random number generator
  randomSeed(analogRead(A0)); // Use an unconnected analog pin for randomness
  Serial.println("Random seed initialized.");
}

void loop() {
  // Check if the button is pressed (active LOW)
  if (digitalRead(BUTTON_PIN) == LOW) {
    Serial.println("Button pressed!");

    // Simple debounce: wait for 50ms and check again
    delay(50);
    if (digitalRead(BUTTON_PIN) == LOW) {
      Serial.println("Button press confirmed.");

      // Select a random dice face (0 to 5)
      int randomFace = random(0, 6);
      Serial.print("Selected Dice Face: ");
      Serial.println(randomFace + 1); // Display 1-6 instead of 0-5

      // Perform sparkle animation and display the selected dice face
      sparkleAndDisplayDice(randomFace);
      Serial.println("Displayed dice face on LED matrix.");


      // Wait until the button is released
      while(digitalRead(BUTTON_PIN) == LOW) {
        delay(10); // Small delay to avoid busy-waiting
      }

      Serial.println("Button released.");
    } else {
      Serial.println("Button press ignored (debounce).");
    }
  }
}