Lab_interaccio/2010/contador/contador.pde
2025-02-25 21:29:42 +01:00

597 lines
15 KiB
Plaintext

int dataIn = 2;
int load = 3;
int clock = 4;
int pul1 = 3;
int pul2 = 2;
int maxInUse = 1; //change this variable to set how many MAX7219's you'll use
int e = 0; // just a variable
int j = 0;
int i = 0;
int i1 = 0;
int i2 = 0;
int i3 = 0;
int count=0;
int pinArray[] = {
0x01, 0x02, 0x03, 0x04};
int val = 0;
int jug1 = 0;
int jug2 = 0;
int jug1a = 0;
int jug2a = 0;
int jug1b = 0;
int jug2b = 0;
int jug1ab = 0;
int jug2ab = 0;
int p1 = 0;
int p2 = 0;
int p1a = 0;
int p2a = 0;
int mem1 = 0;
int mem2 = 0;
int mem3 = 0;
int extra = 0;
int especial_timer=0;
int especial=0;
int contador=0;
// define max7219 registers
byte max7219_reg_noop = 0x00;
byte max7219_reg_digit0 = 0x01;
byte max7219_reg_digit1 = 0x02;
byte max7219_reg_digit2 = 0x03;
byte max7219_reg_digit3 = 0x04;
byte max7219_reg_digit4 = 0x05;
byte max7219_reg_digit5 = 0x06;
byte max7219_reg_digit6 = 0x08;
byte max7219_reg_digit7 = 0x01;
byte max7219_reg_decodeMode = 0x09;
byte max7219_reg_intensity = 0x0a;
byte max7219_reg_scanLimit = 0x0b;
byte max7219_reg_shutdown = 0x0c;
byte max7219_reg_displayTest = 0x0f;
int valor[] = {
0xED,0x05,0x7C,0x5D,0x95,0xD9,0xF9,0x0D,0xFD,0xDD,0xEF};
int valor1[] = {
0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};
void putByte(byte data) {
byte i = 8;
byte mask;
while(i > 0) {
mask = 0x01 << (i - 1); // get bitmask
digitalWrite( clock, LOW); // tick
if (data & mask){ // choose bit
digitalWrite(dataIn, HIGH);// send 1
}
else{
digitalWrite(dataIn, LOW); // send 0
}
digitalWrite(clock, HIGH); // tock
--i; // move to lesser bit
}
}
void maxSingle( byte reg, byte col) { //maxSingle is the "easy" function to use for a //single max7219
digitalWrite(load, LOW); // begin
putByte(reg); // specify register
putByte(col); //((data & 0x01) * 256) + data >> 1); // put data
digitalWrite(load, LOW); // and load da shit
digitalWrite(load,HIGH);
}
void maxAll (byte reg, byte col) { // initialize all MAX7219's in the system
int c = 0;
digitalWrite(load, LOW); // begin
for ( c =1; c<= maxInUse; c++) {
putByte(reg); // specify register
putByte(col); //((data & 0x01) * 256) + data >> 1); // put data
}
digitalWrite(load, LOW);
digitalWrite(load,HIGH);
}
void maxOne(byte maxNr, byte reg, byte col) { //maxOne is for adressing different MAX7219's, whilele having a couple of them cascaded
int c = 0;
digitalWrite(load, LOW); // begin
for ( c = maxInUse; c > maxNr; c--) {
putByte(0); // means no operation
putByte(0); // means no operation
}
putByte(reg); // specify register
putByte(col); //((data & 0x01) * 256) + data >> 1); // put data
for ( c =maxNr-1; c >= 1; c--) {
putByte(0); // means no operation
putByte(0); // means no operation
}
digitalWrite(load, LOW); // and load da shit
digitalWrite(load,HIGH);
}
void consumo_max() {
maxSingle(2,0xFF);
maxSingle(3,0xFF);
maxSingle(1,0xFF);
maxSingle(4,0xFF);
maxSingle(8,0xFF);
maxSingle(5,0xFF);
maxSingle(7,0xFF);
maxSingle(6,0xFF);
}
void test() {
delay(1000);
i=i+1;
if (i>=10)
{
i1=i1+1;
if (i1>=10) i1=0;
maxSingle(2,valor[i1]);
maxSingle(3,valor[i1]);
maxSingle(1,valor1[i1]);
maxSingle(4,valor1[i1]);
i=0;
}
maxSingle(8,valor[i]);
maxSingle(5,valor[i]);
maxSingle(7,valor1[i]);
maxSingle(6,valor1[i]);
}
void extra_time() { // MODO TIE BREAK
if ((p1>p2+1)&&(p1>7)) // final gana jugador1
{
extra = 0;
jug1=0;
jug2=0;
i=0;
i1=0;
jug1a=0;
jug2a=0;
p1=0;
p2=0;
i2=i2+1;
maxSingle(4,valor1[i]);
maxSingle(1,valor1[i1]);
maxSingle(5,valor[jug1]);
maxSingle(3,valor[jug1a]);
maxSingle(8,valor[jug2]);
maxSingle(2,valor[jug2a]);
maxSingle(6,valor1[i2]);
}
if ((p2>p1+1)&&(p2>7)) // final gana jugador2
{
extra = 0;
jug1=0;
jug2=0;
i=0;
i1=0;
jug1a=0;
jug2a=0;
p1=0;
p2=0;
i3=i3+1;
maxSingle(4,valor1[i]);
maxSingle(1,valor1[i1]);
maxSingle(5,valor[jug1]);
maxSingle(3,valor[jug1a]);
maxSingle(8,valor[jug2]);
maxSingle(2,valor[jug2a]);
maxSingle(7,valor1[i3]);
}
if ((i==6)&&(i1==6)&&(especial==0)) // habilitacion del tie break
{
extra = 1;
if ((analogRead(pul1)<128)&&(mem1==0))
{
mem1 = 1;
jug1=jug1+1;
if (jug1>=10)
{
jug1=0;
jug1a=jug1a+1;
if (jug1a>=10) jug1a=0;
}
p1=p1+1;
maxSingle(3,valor[jug1a]);
maxSingle(5,valor[jug1]);
}
if ((analogRead(pul2)<128)&&(mem2==0))
{
mem2 = 1;
jug2=jug2+1;
if (jug2>=10)
{
jug2=0;
jug2a=jug2a+1;
if (jug2a>=10) jug2a=0;
}
p2=p2+1;
maxSingle(2,valor[jug2a]);
maxSingle(8,valor[jug2]);
}
}
}
void jugador1() {
if ((analogRead(pul1)<128)&&(mem1==0)&&(extra==0)&&(especial==0)) // modo normal jugador1
{
mem1 = 1;
if (jug1==0)
{
jug1=15;
maxSingle(3,valor[1]);
maxSingle(5,valor[5]);
}
else if (jug1==15)
{
jug1=30;
maxSingle(3,valor[3]);
maxSingle(5,valor[0]);
}
else if (jug1==30)
{
jug1=40;
maxSingle(3,valor[4]);
maxSingle(5,valor[0]);
}
else if (jug1==40)
{
if (jug2==40)
{
jug1=41;
maxSingle(3,valor[4]);
maxSingle(5,valor[10]);
}
else if (jug2==41)
{
jug1=40;
jug2=40;
maxSingle(3,valor[4]);
maxSingle(5,valor[0]);
maxSingle(2,valor[4]);
maxSingle(8,valor[0]);
}
else
{
jug1=0;
jug2=0;
if (i==9) i=0;
else i=i+1;
maxSingle(3,valor[0]);
maxSingle(5,valor[0]);
if (((i==6)&&(i1<4))||(i==7))
{
i1=0;
i=0;
i2=i2+1;
maxSingle(4,valor1[0]);
maxSingle(1,valor1[0]);
if (i2==10)
{
i2=0;
maxSingle(6,valor1[i2]);
}
else maxSingle(6,valor1[i2]);
}
else maxSingle(4,valor1[i]);
maxSingle(2,valor[0]);
maxSingle(8,valor[0]);
}
}
else if (jug1==41)
{
jug1=0;
jug2=0;
if (i==9) i=0;
else i=i+1;
maxSingle(3,valor[0]);
maxSingle(5,valor[0]);
if (((i==6)&&(i1<4))||(i==7))
{
i1=0;
i=0;
i2=i2+1;
maxSingle(4,valor1[0]);
maxSingle(1,valor1[0]);
if (i2==10)
{
i2=0;
maxSingle(6,valor1[i2]);
}
else maxSingle(6,valor1[i2]);
}
else maxSingle(4,valor1[i]);
maxSingle(2,valor[0]);
maxSingle(8,valor[0]);
}
}
else if (analogRead(pul1)>1020)
{
delay(10);
mem1 = 0;
}
}
void jugador2() {
if ((analogRead(pul2)<128)&&(mem2==0)&&(extra==0)&&(especial==0)) // modo normal jugador2
{
mem2 = 1;
if (jug2==0)
{
jug2=15;
maxSingle(2,valor[1]);
maxSingle(8,valor[5]);
}
else if (jug2==15)
{
jug2=30;
maxSingle(2,valor[3]);
maxSingle(8,valor[0]);
}
else if (jug2==30)
{
jug2=40;
maxSingle(2,valor[4]);
maxSingle(8,valor[0]);
}
else if (jug2==40)
{
if (jug1==40)
{
jug2=41;
maxSingle(2,valor[4]);
maxSingle(8,valor[10]);
}
else if (jug1==41)
{
jug1=40;
jug2=40;
maxSingle(3,valor[4]);
maxSingle(5,valor[0]);
maxSingle(2,valor[4]);
maxSingle(8,valor[0]);
}
else
{
jug2=0;
jug1=0;
if (i1==9) i1=0;
else i1=i1+1;
maxSingle(2,valor[0]);
maxSingle(8,valor[0]);
if (((i1==6)&&(i<4))||(i1==7))
{
i1=0;
i=0;
i3=i3+1;
maxSingle(1,valor1[0]);
maxSingle(4,valor1[0]);
if (i3==10)
{
i3=0;
maxSingle(7,valor1[i3]);
}
else maxSingle(7,valor1[i3]);
}
else maxSingle(1,valor1[i1]);
maxSingle(3,valor[0]);
maxSingle(5,valor[0]);
}
}
else if (jug2==41)
{
jug2=0;
jug1=0;
if (i1==9) i1=0;
else i1=i1+1;
maxSingle(3,valor[0]);
maxSingle(5,valor[0]);
if (((i1==6)&&(i<4))||(i1==7))
{
i1=0;
i=0;
i3=i3+1;
maxSingle(1,valor1[0]);
maxSingle(4,valor1[0]);
if (i3==10)
{
i3=0;
maxSingle(7,valor1[i3]);
}
else maxSingle(7,valor1[i3]);
}
else maxSingle(1,valor1[i1]);
maxSingle(2,valor[0]);
maxSingle(8,valor[0]);
}
}
else if (analogRead(pul2)>1020)
{
delay(10);
mem2 = 0;
}
}
void especial_mode()
{
// si pulsas los dos se inicia el contador
if ((analogRead(pul2)<128)&&(analogRead(pul1)<128)&&(mem3==0))
{
mem3=1;
especial_timer = millis();
//Serial.println(especial_timer);
}
else if ((analogRead(pul2)<128)&&(analogRead(pul1)<128)&&(mem3==1))
{
contador = millis() - especial_timer;
Serial.println(contador);
}
else if ((((analogRead(pul2)>1020)||(analogRead(pul1)>1020)))&&(mem3==1)) mem3=0;
// si contador excede de dos segundos se activa el modo
if(contador > 2000)
{
maxSingle(2,valor[0]);
maxSingle(8,valor[0]);
maxSingle(1,valor1[0]);
maxSingle(7,valor1[0]);
maxSingle(4,valor1[0]);
maxSingle(6,valor1[0]);
maxSingle(3,valor[0]);
maxSingle(5,valor[0]);
//if (especial==0) especial=1;
//else especial=0;
if (especial==0) especial=1;
else especial=0;
especial_timer = 0;
jug1 = 0;
jug2 = 0;
jug1a = 0;
jug2a = 0;
jug1b = 0;
jug2b = 0;
jug1ab = 0;
jug2ab = 0;
p1 = 0;
p2 = 0;
p1a = 0;
p2a = 0;
extra=0;
contador=0;
i=i1=i2=i3=0;
}
if ((p1a>p2a+1)&&(p1a>11)) // final gana jugador1
{
jug1b=0;
jug2b=0;
jug1ab=0;
jug2ab=0;
p1a=0;
p2a=0;
i2=i2+1;
if (i2==2)
{
i2=0;
i3=0;
i=i+1;
if (i==10) i=0;
}
maxSingle(4,valor1[i2]);
maxSingle(1,valor1[i3]);
maxSingle(5,valor[jug1b]);
maxSingle(3,valor[jug1ab]);
maxSingle(8,valor[jug2b]);
maxSingle(2,valor[jug2ab]);
maxSingle(6,valor1[i]);
}
if ((p2a>p1a+1)&&(p2a>11)) // final gana jugador2
{
jug1b=0;
jug2b=0;
jug1ab=0;
jug2ab=0;
p1a=0;
p2a=0;
i3=i3+1;
if (i3==2)
{
i2=0;
i3=0;
i1=i1+1;
if (i1==10) i1=0;
}
maxSingle(4,valor1[i2]);
maxSingle(1,valor1[i3]);
maxSingle(5,valor[jug1b]);
maxSingle(3,valor[jug1ab]);
maxSingle(8,valor[jug2b]);
maxSingle(2,valor[jug2ab]);
maxSingle(7,valor1[i1]);
}
if (especial==1)
{
extra = 1;
if ((analogRead(pul1)<128)&&(mem1==0))
{
mem1 = 1;
jug1b=jug1b+1;
if (jug1b>=10)
{
jug1b=0;
jug1ab=jug1ab+1;
if (jug1ab>=10) jug1ab=0;
}
p1a=p1a+1;
maxSingle(3,valor[jug1ab]);
maxSingle(5,valor[jug1b]);
}
if ((analogRead(pul2)<128)&&(mem2==0))
{
mem2 = 1;
jug2b=jug2b+1;
if (jug2b>=10)
{
jug2b=0;
jug2ab=jug2ab+1;
if (jug2ab>=10) jug2ab=0;
}
p2a=p2a+1;
maxSingle(2,valor[jug2ab]);
maxSingle(8,valor[jug2b]);
}
}
}
void setup () {
pinMode(dataIn, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(load, OUTPUT);
beginSerial(9600);
digitalWrite(13, HIGH);
//////////////////////////////////////////////initiation of the max 7219
maxAll(max7219_reg_scanLimit, 0x07);
maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits)
maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode
maxAll(max7219_reg_displayTest, 0x00); // no display test
for (e=1; e<=8; e++) { // empty registers, turn all LEDs off
maxAll(e,0);
}
maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set
// range: 0x00 to 0x0f
maxSingle(2,valor[0]);
maxSingle(8,valor[0]);
maxSingle(1,valor1[0]);
maxSingle(7,valor1[0]);
maxSingle(4,valor1[0]);
maxSingle(6,valor1[0]);
maxSingle(3,valor[0]);
maxSingle(5,valor[0]);
}
void loop () {
//test();
//consumo_max();
especial_mode();
extra_time();
jugador1();
jugador2();
//Serial.println(millis());
}
void off(void){
for (count=0;count<4;count++) {
digitalWrite(pinArray[count], HIGH);
}
}