#include <Wire.h>
#include <LedControl.h>
#include <MPU6050.h>
#define DIN_PIN 11
#define CS_PIN 10
#define CLK_PIN 13
#define BUTTON_PIN 12
#define BUZZER_PIN 9
#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7
LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1);
MPU6050 accel;
byte dicePatterns[6][8] = {
{0, 0, 0, 24, 24, 0, 0, 0},
{0, 96, 96, 0, 0, 6, 6, 0},
{0, 96, 96, 24, 24, 6, 6, 0},
{0, 102, 102, 0, 0, 102, 102, 0},
{0, 102, 102, 24, 24, 102, 102, 0},
{102, 102, 0, 102, 102, 0, 102, 102}
};
byte numberSegments[6] = {
0b00000110,
0b01011011,
0b01001111,
0b01100110,
0b01101101,
0b01111101
};
int previousAx = 0, previousAy = 0, previousAz = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
for (int i = 0; i < SEGMENT_COUNT; ++i) {
pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
}
lc.shutdown(0, false);
lc.setIntensity(0, 5);
lc.clearDisplay(0);
Wire.begin();
accel.initialize();
if (!accel.testConnection()) {
while (1);
}
randomSeed(analogRead(0));
}
void showDice(int num) {
lc.clearDisplay(0);
for (int i = 0; i < 8; i++) {
lc.setRow(0, i, dicePatterns[num - 1][i]);
}
}
void showSegment(int num) {
byte mask = numberSegments[num - 1];
for (int i = 0; i < SEGMENT_COUNT; ++i) {
boolean enableSegment = bitRead(mask, i);
digitalWrite(i + FIRST_SEGMENT_PIN, !enableSegment);
}
}
void rollDice() {
for (int i = 0; i < 10; i++) {
int tempNum = random(1, 7);
showDice(tempNum);
showSegment(tempNum);
delay(getDelayTime());
}
int finalNum = random(1, 7);
showDice(finalNum);
showSegment(finalNum);
tone(BUZZER_PIN, 500 + (finalNum * 100), 200);
}
int getDelayTime() {
int16_t ax, ay, az;
accel.getAcceleration(&ax, &ay, &az);
int change = abs(ax - previousAx) + abs(ay - previousAy) + abs(az - previousAz);
previousAx = ax;
previousAy = ay;
previousAz = az;
return map(change, 0, 5000, 100, 600);
}
void loop() {
int16_t ax, ay, az;
accel.getAcceleration(&ax, &ay, &az);
int change = abs(ax - previousAx) + abs(ay - previousAy) + abs(az - previousAz);
if (change > 2000 || digitalRead(BUTTON_PIN) == LOW) {
rollDice();
}
previousAx = ax;
previousAy = ay;
previousAz = az;
delay(100);
}