Go Down

Topic: Button deboncing in simon game (Read 3591 times) previous topic - next topic

valenti

Hi. Im preety new to programming and microcontrolers world, and i want to make simon game, so i did it without copying any code. It is working, but the problem is that i made button debouncing but looks like i made some mistake and i dont know where, Also tryed to set debounce time to 50ms, but it didnt help.
Code: [Select]

#include <TrueRandom.h>
#include <EEPROM.h>
int randled;
int val;
int allow=1;
int leds[50];
int buttons[50];
int button1=2;
int button2=3;
int button3=4;
int button4=5;
int turn=0, stepp=1;
int bt1, bt2, bt3, bt4, exbt10, exbt20, exbt30, exbt40, bt10, bt20, bt30, bt40, milis1, milis2, milis3, milis4, debounce=50, test1=0, test2=0, test3=0, test4=0;
unsigned long time1, time2, time3, time4;
int play=1;
int glava=1,konec=0,rec;



void setup (){
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
Serial.begin(9600);
}

void loop (){

if(glava==1){
 
if(allow==1){
 
 for(int i=0; i<49; i++){
   leds[i]=TrueRandom.random(8,12);
 }
allow=0;
}

//RECORDING BUTTONS

bt10=digitalRead(button1);
if(bt10==HIGH && exbt10==LOW){
milis1=millis();
test1=1;
}
if(test1==1 && (millis()-milis1)>debounce){
bt1=digitalRead(button1);
if (bt1==HIGH){
 buttons[turn]=8;
//Serial.println(buttons[turn]);
digitalWrite(8,HIGH);
time1=millis();
turn++;
test1=0;
}
}
if(millis()-time1>200){
 digitalWrite(8,LOW);
}


bt20=digitalRead(button2);
if(bt20==HIGH && exbt20==LOW){
milis2=millis();
test2=1;
}
if(test2==1 && (millis()-milis2)>debounce){
bt2=digitalRead(button2);
if (bt2==HIGH){
 buttons[turn]=9;
//Serial.println(buttons[turn]);
digitalWrite(9,HIGH);
time2=millis();
turn++;
test2=0;
}
}
if(millis()-time2>200){
 digitalWrite(9,LOW);
}


bt30=digitalRead(button3);
if(bt30==HIGH && exbt30==LOW){
milis3=millis();
test3=1;
}
if(test3==1 && (millis()-milis3)>debounce){
bt3=digitalRead(button3);
if (bt3==HIGH){
 buttons[turn]=10;
//Serial.println(buttons[turn]);
digitalWrite(10,HIGH);
time3=millis();
turn++;
test3=0;
}
}
if(millis()-time3>200){
 digitalWrite(10,LOW);
}


bt40=digitalRead(button4);
if(bt40==HIGH && exbt40==LOW){
milis4=millis();
test4=1;
}
if(test4==1 && (millis()-milis4)>debounce){
bt4=digitalRead(button4);
if (bt4==HIGH){
 buttons[turn]=11;
//Serial.println(buttons[turn]);
digitalWrite(11,HIGH);
time4=millis();
turn++;
test4=0;
}
}
if(millis()-time4>200){
 digitalWrite(11,LOW);
}




if(play==1){
 
 for (int k=0;k<stepp; k++){
   digitalWrite(leds[k], HIGH);
   delay(300);
   digitalWrite(leds[k], LOW);
   delay(200);
 }
 play=0;
}


       for(int j=0; j<turn;j++){
         if (buttons[j]!=leds[j]){
           val=(stepp-1);
           rec=EEPROM.read(0);
           
           digitalWrite(8,HIGH);
           digitalWrite(9,HIGH);
           digitalWrite(10,HIGH);
           digitalWrite(11,HIGH);            
           
           if(rec>=val){
           Serial.print("Napaka, tvoj dosezek je: ");
           Serial.println(val);
           Serial.print("Rekord je: ");
           Serial.println(rec);
           }
                   
           if(rec<val){
           Serial.print("Dosegli ste nov rekord: ");
           Serial.println(val);
           Serial.println("CESTITAM!!!");
           EEPROM.write(0, val);            
           }
           
           glava=0;
           konec=1;
         }
       }
       
       if(turn==stepp && konec!=1){
         delay(200);
         digitalWrite(8,LOW);
         digitalWrite(9,LOW);
         digitalWrite(10,LOW);
         digitalWrite(11,LOW);
         stepp++;
         play=1;
         turn=0;
         delay(1000);
       }
   

}


exbt10=bt10;
exbt10=bt10;
exbt20=bt20;
exbt30=bt30;
exbt40=bt40;

}

AWOL

#1
Jan 22, 2011, 02:53 pm Last Edit: Jan 22, 2011, 02:54 pm by AWOL Reason: 1
I'm not sure I know where your problem lies, but can I recommend you use the Auto-format (ctrl-T) facility in the IDE before you post your code?

Code: [Select]
int bt1, bt2, bt3, bt4, exbt10, exbt20, exbt30, exbt40, bt10, bt20, bt30, bt40, milis1, milis2, milis3, milis4, debounce=50, test1=0, test2=0, test3=0, test4=0
Mixing constant and variable declarations is a recipe for hair-loss.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

valenti

oh sorry, and thanks for that tip. I also changed debounce time to 100ms so you have to hold button 100ms to count, but still sometimes one click counts as 2.. very rare but it does :s
Code: [Select]
#include <TrueRandom.h>
#include <EEPROM.h>
int randled;
int val;
int allow=1;
int leds[50];
int buttons[50];
int button1=2;
int button2=3;
int button3=4;
int button4=5;
int turn=0, stepp=1;
int bt1, bt2, bt3, bt4, exbt10, exbt20, exbt30, exbt40, bt10, bt20, bt30, bt40, milis1, milis2, milis3, milis4;
int debounce=100;
int test1=0;
int test2=0;
int test3=0;
int test4=0;
unsigned long time1, time2, time3, time4;
int play=1;
int glava=1,konec=0,rec;



void setup (){
 pinMode(9,OUTPUT);
 pinMode(8,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(2,INPUT);
 pinMode(3,INPUT);
 pinMode(4,INPUT);
 pinMode(5,INPUT);
 Serial.begin(9600);
}

void loop (){

 if(glava==1){

   if(allow==1){

     for(int i=0; i<49; i++){
       leds[i]=TrueRandom.random(8,12);
     }
     allow=0;
   }

   //RECORDING BUTTONS

   bt10=digitalRead(button1);
   if(bt10==HIGH && exbt10==LOW){
     milis1=millis();
     test1=1;
   }
   if(test1==1 && (millis()-milis1)>debounce){
     bt1=digitalRead(button1);
     if (bt1==HIGH){
       buttons[turn]=8;
       Serial.println(buttons[turn]);
       digitalWrite(8,HIGH);
       time1=millis();
       turn++;
       test1=0;
     }
   }
   if(millis()-time1>200){
     digitalWrite(8,LOW);
   }


   bt20=digitalRead(button2);
   if(bt20==HIGH && exbt20==LOW){
     milis2=millis();
     test2=1;
   }
   if(test2==1 && (millis()-milis2)>debounce){
     bt2=digitalRead(button2);
     if (bt2==HIGH){
       buttons[turn]=9;
       Serial.println(buttons[turn]);
       digitalWrite(9,HIGH);
       time2=millis();
       turn++;
       test2=0;
     }
   }
   if(millis()-time2>200){
     digitalWrite(9,LOW);
   }


   bt30=digitalRead(button3);
   if(bt30==HIGH && exbt30==LOW){
     milis3=millis();
     test3=1;
   }
   if(test3==1 && (millis()-milis3)>debounce){
     bt3=digitalRead(button3);
     if (bt3==HIGH){
       buttons[turn]=10;
       Serial.println(buttons[turn]);
       digitalWrite(10,HIGH);
       time3=millis();
       turn++;
       test3=0;
     }
   }
   if(millis()-time3>200){
     digitalWrite(10,LOW);
   }


   bt40=digitalRead(button4);
   if(bt40==HIGH && exbt40==LOW){
     milis4=millis();
     test4=1;
   }
   if(test4==1 && (millis()-milis4)>debounce){
     bt4=digitalRead(button4);
     if (bt4==HIGH){
       buttons[turn]=11;
       Serial.println(buttons[turn]);
       digitalWrite(11,HIGH);
       time4=millis();
       turn++;
       test4=0;
     }
   }
   if(millis()-time4>200){
     digitalWrite(11,LOW);
   }




   if(play==1){

     for (int k=0;k<stepp; k++){
       digitalWrite(leds[k], HIGH);
       delay(300);
       digitalWrite(leds[k], LOW);
       delay(200);
     }
     play=0;
   }


   for(int j=0; j<turn;j++){
     if (buttons[j]!=leds[j]){
       val=(stepp-1);
       rec=EEPROM.read(0);

       digitalWrite(8,HIGH);
       digitalWrite(9,HIGH);
       digitalWrite(10,HIGH);
       digitalWrite(11,HIGH);            

       if(rec>=val){
         Serial.print("Napaka, tvoj dosezek je: ");
         Serial.println(val);
         Serial.print("Rekord je: ");
         Serial.println(rec);
       }

       if(rec<val){
         Serial.print("Dosegli ste nov rekord: ");
         Serial.println(val);
         Serial.println("CESTITAM!!!");
         EEPROM.write(0, val);            
       }

       glava=0;
       konec=1;
     }
   }

   if(turn==stepp && konec!=1){
     delay(200);
     digitalWrite(8,LOW);
     digitalWrite(9,LOW);
     digitalWrite(10,LOW);
     digitalWrite(11,LOW);
     stepp++;
     play=1;
     turn=0;
     delay(1000);
   }


 }


 exbt10=bt10;
 exbt10=bt10;
 exbt20=bt20;
 exbt30=bt30;
 exbt40=bt40;

}

Go Up