/*
Digital Rulet
LEFT RIGHT
3 3
--- ---
1 | 4 | 6 1 | 4 | 6
--- ---
2 | 5 | 7 2 | 5 | 7
--- ---
L_LEDx R_LEDx
*/
#define LED_BIT0 0
#define LED_BIT1 1
#define LED_BIT2 2
#define LED_BIT3 3
#define LED_CTL 4
#define SW_START 9
#define SW_TEST 10
#define R_LED1 0x0001
#define R_LED2 0x0002
#define R_LED3 0x0004
#define R_LED4 0x0008
#define R_LED5 0x0010
#define R_LED6 0x0020
#define R_LED7 0x0040
#define L_LED1 0x0100
#define L_LED2 0x0200
#define L_LED3 0x0400
#define L_LED4 0x0800
#define L_LED5 0x1000
#define L_LED6 0x2000
#define L_LED7 0x4000
#define LED_READY 0x8000
int rulet_num[38]={37,1,13,36,24,3,15,34,22,5,17,32,20,7,11,30,26,9,28,0,2,14,35,23,4,16,33,21,6,18,31,19,8,12,29,25,10,27};
int current_num = 99; // Store the current rulet ball position, 99 indicates the initial status.
int digit_array[] = {
R_LED1|R_LED2|R_LED3 |R_LED5|R_LED6|R_LED7, //0
R_LED6|R_LED7|R_LED6|R_LED7, //1
R_LED2|R_LED3|R_LED4|R_LED5|R_LED6 , //2
R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //3
R_LED1 |R_LED4 |R_LED6|R_LED7, //4
R_LED1 |R_LED3|R_LED4|R_LED5 |R_LED7, //5
R_LED1|R_LED2|R_LED3|R_LED4|R_LED5 |R_LED7, //6
R_LED1 |R_LED3 |R_LED6|R_LED7, //7
R_LED1|R_LED2|R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //8
R_LED1 |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //9
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3 |R_LED5|R_LED6|R_LED7, //10
L_LED6|L_LED7|L_LED6|L_LED7 |R_LED6|R_LED7|R_LED6|R_LED7, //11
L_LED6|L_LED7|L_LED6|L_LED7 |R_LED2|R_LED3|R_LED4|R_LED5|R_LED6 , //12
L_LED6|L_LED7|L_LED6|L_LED7 |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //13
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1 |R_LED4 |R_LED6|R_LED7, //14
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1 |R_LED3|R_LED4|R_LED5 |R_LED7, //15
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3|R_LED4|R_LED5 |R_LED7, //16
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1 |R_LED3 |R_LED6|R_LED7, //17
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //18
L_LED6|L_LED7|L_LED6|L_LED7|R_LED1 |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //19
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1|R_LED2|R_LED3 |R_LED5|R_LED6|R_LED7, //20
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED6|R_LED7|R_LED6|R_LED7, //21
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED2|R_LED3|R_LED4|R_LED5|R_LED6 , //22
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //23
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1 |R_LED4 |R_LED6|R_LED7, //24
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1 |R_LED3|R_LED4|R_LED5 |R_LED7, //25
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1|R_LED2|R_LED3|R_LED4|R_LED5 |R_LED7, //26
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1 |R_LED3 |R_LED6|R_LED7, //27
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1|R_LED2|R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //28
L_LED2|L_LED3|L_LED4|L_LED5|L_LED6 |R_LED1 |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //29
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3 |R_LED5|R_LED6|R_LED7, //30
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7 |R_LED6|R_LED7|R_LED6|R_LED7, //31
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7 |R_LED2|R_LED3|R_LED4|R_LED5|R_LED6 , //32
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7 |R_LED3|R_LED4|R_LED5|R_LED6|R_LED7, //33
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1 |R_LED4 |R_LED6|R_LED7, //34
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1 |R_LED3|R_LED4|R_LED5 |R_LED7, //35
L_LED3|L_LED4|L_LED5|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3|R_LED4|R_LED5 |R_LED7, //36
L_LED1|L_LED2|L_LED3 |L_LED5|L_LED6|L_LED7|R_LED1|R_LED2|R_LED3 |R_LED5|R_LED6|R_LED7 //00
};
// The setup() method runs once, when the sketch starts
void setup() {
// initialize the digital pin as an output:
pinMode(LED_BIT0, OUTPUT); // for 4bit decorder bit0
pinMode(LED_BIT1, OUTPUT); // for 4bit decorder bit1
pinMode(LED_BIT2, OUTPUT); // for 4bit decorder bit2
pinMode(LED_BIT3, OUTPUT); // for 4bit decorder bit3
pinMode(LED_CTL, OUTPUT); // for decorder on/off
pinMode(SW_START, INPUT); // For tact SW for start rulet
pinMode(SW_TEST, INPUT); // For tact SW for test display
}
// Circulate lights as rulet ball
void rulet_circulate() {
int delay_base = 200;
int i, j, k;
int random_val;
for(i=10; i>0; i-=2) {
random_val = random(0,i*2) + i; // Random Integer; to define number of slots that a ball moves.
for(j=0; j<random_val; j++) {
current_num++;
if (current_num > 37 ) {
current_num = 0;
}
for(k=0; k<((11-i)*delay_base); k++) { // Ball speed control. Faster to slower.
led_display(digit_array[rulet_num[current_num]]);
}
}
}
}
// Rulet light test
void rulet_test() {
int delay_base = 1500;
int i, k;
for(i=0; i<38; i++) {
for(k=0; k<delay_base; k++) {
led_display(digit_array[i]);
}
}
}
// the loop() method runs over and over again,
// as long as the Arduino has power
int sw_val; // Global value to keep the switch status of last loop.
void loop()
{
if (current_num == 99) { // This runs only when the first loop
sw_val = wait_for_start(L_LED1|L_LED2|L_LED5|R_LED5|R_LED7|R_LED6|R_LED3|L_LED3); // initial LED display
}
if (sw_val == SW_START) {
rulet_circulate();
led_display(digit_array[current_num]);
sw_val = wait_for_start(digit_array[current_num]);
} else {
rulet_test();
sw_val = wait_for_start(L_LED1|L_LED2|L_LED5|R_LED5|R_LED7|R_LED6|R_LED3|L_LED3); // initial LED display
}
}
// Return when the start or test sw is pushed.
int
wait_for_start(int disp_bit) {
int sw_start, sw_test;
sw_start = LOW; sw_test = LOW;
sw_start = digitalRead(SW_START);
sw_test = digitalRead(SW_TEST);
while(sw_start == LOW && sw_test == LOW) {
led_display(disp_bit|LED_READY); // If either switch is not pushed, display the current value and ready LED.
sw_start = digitalRead(SW_START);
sw_test = digitalRead(SW_TEST);
}
if(sw_test == HIGH) {
return SW_TEST;
} else {
return SW_START;
}
}
void led_display(int parm) {
if (parm & R_LED1) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW);
digitalWrite(LED_BIT1, LOW);
digitalWrite(LED_BIT2, LOW);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & R_LED2) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH);
digitalWrite(LED_BIT1, LOW);
digitalWrite(LED_BIT2, LOW);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & R_LED3) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW);
digitalWrite(LED_BIT1, HIGH);
digitalWrite(LED_BIT2, LOW);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & R_LED4) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH);
digitalWrite(LED_BIT1, HIGH);
digitalWrite(LED_BIT2, LOW);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & R_LED5) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW);
digitalWrite(LED_BIT1, LOW);
digitalWrite(LED_BIT2, HIGH);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & R_LED6) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH);
digitalWrite(LED_BIT1, LOW);
digitalWrite(LED_BIT2, HIGH);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & R_LED7) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW);
digitalWrite(LED_BIT1, HIGH);
digitalWrite(LED_BIT2, HIGH);
digitalWrite(LED_BIT3, LOW);
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED1) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW);
digitalWrite(LED_BIT1, LOW);
digitalWrite(LED_BIT2, LOW);
digitalWrite(LED_BIT3, HIGH);
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED2) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH); // set the LED on
digitalWrite(LED_BIT1, LOW); // set the LED on
digitalWrite(LED_BIT2, LOW); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED3) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW); // set the LED on
digitalWrite(LED_BIT1, HIGH); // set the LED on
digitalWrite(LED_BIT2, LOW); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED4) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH); // set the LED on
digitalWrite(LED_BIT1, HIGH); // set the LED on
digitalWrite(LED_BIT2, LOW); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED5) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW); // set the LED on
digitalWrite(LED_BIT1, LOW); // set the LED on
digitalWrite(LED_BIT2, HIGH); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED6) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH); // set the LED on
digitalWrite(LED_BIT1, LOW); // set the LED on
digitalWrite(LED_BIT2, HIGH); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
if (parm & L_LED7) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, LOW); // set the LED on
digitalWrite(LED_BIT1, HIGH); // set the LED on
digitalWrite(LED_BIT2, HIGH); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
if (parm & LED_READY) {
digitalWrite(LED_CTL, HIGH);
digitalWrite(LED_BIT0, HIGH); // set the LED on
digitalWrite(LED_BIT1, HIGH); // set the LED on
digitalWrite(LED_BIT2, HIGH); // set the LED on
digitalWrite(LED_BIT3, HIGH); // set the LED on
digitalWrite(LED_CTL, LOW);
}
}