Hello,
i have a prewritten program and it involves a memory game that has 16 pushbuttons. each round round random buttons will light up that you must remember and then press. the first round is a sequence of 4 then 5 then 6. my question is when the buttons get pressed quickly they wont work. I believe it has to do with the debounce from what i have researched. Can someone help me locate this in the code please? I think I would start with just trying to lower the time that the program checks to see if the push was correct. I will post some of the code. (its divided in a number of libraries) If I am missing something let me know and I can post more.
```
byte programmingSequence[100];
int programmingSequence_length = 0;
int programmingSequence_counter = 0;
extern void programmingSequence_onFinished();
extern void programmingSequence_onFailed();
void programmingSequence_add(int newNumber) {
programmingSequence[programmingSequence_length] = newNumber;
programmingSequence_length++;
}
void programmingSequence_clear() {
memset(programmingSequence, 0, programmingSequence_length);
programmingSequence_length = 0;
}
void programmingSequence_reset() {
programmingSequence_counter = 0;
}
void programmingSequence_checkNumber(int newNumber) {
// check btn correct //
if(programmingSequence[programmingSequence_counter] == newNumber) {
programmingSequence_counter++;
// check last button correct //
if(programmingSequence_counter == programmingSequence_length) {
programmingSequence_onFinished();
// clear counter //
programmingSequence_counter = 0;
}
}
// check btn repeat //
else if(programmingSequence_counter > 0
&& programmingSequence[programmingSequence_counter - 1] == newNumber) {
}
// btn is not correct //
else {
// clear counter //
programmingSequence_counter = 0;
programmingSequence_onFailed();
}
}
bool programmingSequence_isNumberExist(int number) {
for(int i = 0; i < programmingSequence_length; i++) {
if(number == programmingSequence[i]) {
return true;
}
}
return false;
}
another library
#define BTNS_LEDS_COUNT 16
byte PINS_BTNS_LEDS[BTNS_LEDS_COUNT] = {6,8,16,17,5,9,7,19,11,10,12,2,3,18,4,20};
void btnsLeds_setOn(int ledIndex) {
digitalWrite(PINS_BTNS_LEDS[ledIndex], HIGH);
}
void btnsLeds_setOff(int ledIndex) {
digitalWrite(PINS_BTNS_LEDS[ledIndex], LOW);
}
void btnsLeds_clear() {
for(int i = 0; i < BTNS_LEDS_COUNT; i++) {
btnsLeds_setOff(i);
}
}
void btnsLeds_setOnAll() {
for(int i = 0; i < BTNS_LEDS_COUNT; i++) {
btnsLeds_setOn(i);
}
}
void btnsLeds_init() {
for(int i = 0; i < BTNS_LEDS_COUNT; i++) {
pinMode(PINS_BTNS_LEDS[i], OUTPUT);
}
btnsLeds_clear();
// delay(1000);
// for(int i = 0; i < BTNS_LEDS_COUNT; i++) {
// btnsLeds_setOn(i);
// delay(200);
// }
}
#include <ArdPin.h>
#include <ArdSensor.h>
#define BTNS_COUNT 16
int PINS_BTNS[BTNS_COUNT] = {36,38,31,30,35,39,37,28,41,40,42,32,33,29,34,27};
bool btns_lastValues[BTNS_COUNT];
ArdSensor* btnsList[BTNS_COUNT];
void btns_init() {
for(int i = 0; i < BTNS_COUNT; i++) {
btnsList[i] = new ArdSensor(PINS_BTNS[i], LOW, 50);
btns_lastValues[i] = 0;
}
}
extern void btns_onNewPressed(int index);
void btns_check() {
for(int i = 0; i < BTNS_COUNT; i++) {
btnsList[i]->check();
// check new //
bool current = btnsList[i]->isActivating();
if(current != btns_lastValues[i]) {
btns_lastValues[i] = current;
if (current == 1) {
btns_onNewPressed(i);
}
}
}
}
void btns_debug() {
for(int i = 0; i < BTNS_COUNT; i++) {
btnsList[i]->check();
Serial.println("Table reeds " + String(i) + ": " + String(btnsList[i]->isActivating())
+ ": " + String(btnsList[i]->getDirectValue()));
}
Serial.println();
}
#include <ArdSensor.h>
#include <ArdPin.h>
#define PIN_ADMIN_BTN_1 A0
ArdSensor *adminBtn1;
extern void adminBtn1_onPressed();
void admin_init() {
adminBtn1 = new ArdSensor(PIN_ADMIN_BTN_1);
adminBtn1->setCallbackOnActivated(adminBtn1_onPressed);
}
bool admin_check() {
adminBtn1->check();
}
bool admin_debug() {
adminBtn1->check();
Serial.println("Admin btn 1: " + String(adminBtn1->isActivating()));
}
#include "admin.h"
#include "box.h"
#include "btnLaser.h"
#include "btns.h"
#include "btnsLeds.h"
#include "cpz.h"
#include "hwSignals.h"
#include "laser.h"
#include "led.h"
#include "programmingSequence.h"
#include "randomNumber.h"
bool cpz_isDone = false;
bool activateMemmory_isDone = false;
//
// Cpz //
//
void cpz_onNewCount(int cpzCount) {
Serial.println("Cpz: Found: " + String(cpzCount));
// check all found //
if(cpzCount == CPZ_COUNT) {
Serial.println("Cpz: All Found");
cpz_isDone = true;
ledBtnLaser_on();
}else{
cpz_isDone = false;
ledBtnLaser_off();
laser_off();
}
}
//
// Btn laser //
//
void btnLaser_onPressed() {
Serial.println("btnLaser_onPressed");
laser_on();
}
void btnLaser_notPressed() {
Serial.println("btnLaser_notPressed");
laser_off();
}
//
// Btns Leds //
//
void btnsLeds_showTarget() {
for(int i = 0; i < programmingSequence_length; i++) {
btnsLeds_setOn(programmingSequence[i]);
delay(500);
btnsLeds_clear();
delay(200);
}
btnsLeds_clear();
}
void btnsLeds_showFailed() {
for(int j = 0; j < 5; j++) {
btnsLeds_setOnAll();
delay(100);
btnsLeds_clear();
delay(100);
}
}
void btnsLeds_showCorrect() {
for(int j = 0; j < 5; j++) {
btnsLeds_clear();
for(int i = 0; i < programmingSequence_length; i++) {
btnsLeds_setOn(programmingSequence[i]);
}
delay(100);
btnsLeds_clear();
delay(100);
}
}
//
// Game stage //
//
#define GAME_STAGE_MAX 4
int gameStage = 1;
void checkGameStage() {
// check game win //
if(gameStage == GAME_STAGE_MAX) {
Serial.println("Game: Win");
btnsLeds_setOnAll();
box_unlock();
led_on();
}
else {
Serial.println("Game: Stage " + String(gameStage));
// set new values //
programmingSequence_clear();
for(int i = 0; i < gameStage + 3 ; i++ ) {
// Serial.println("programmingSequence i: " + String(i));
// get rand number //
int randNumber = 0;
do {
randNumber = random_getNumber(1, 16);
}
while(programmingSequence_isNumberExist(randNumber) || randNumber == 0);
Serial.println(randNumber);
// add to sequence //
programmingSequence_add(randNumber);
}
// show it //
btnsLeds_showTarget();
}
}
//
// Btns //
//
void btns_onNewPressed(int btnNumber) {
Serial.println("Btn pressed: " + String(btnNumber));
btnsLeds_setOn(btnNumber);
programmingSequence_checkNumber(btnNumber);
}
//
// Programming sequence //
//
void programmingSequence_onFailed() {
Serial.println("Sequence: Failed");
btnsLeds_showFailed();
delay(2000);
gameStage = 1;
checkGameStage();
}
void programmingSequence_onFinished() {
Serial.println("Sequence: Finished");
// show correct //
btnsLeds_showCorrect();
delay(2000);
gameStage++;
checkGameStage();
}
//
// Charger //
//
void signalChargerDone_onActivated(){
Serial.println("signalChargerDone_onActivated");
activateMemmory_isDone = true;
btnsLeds_setOnAll();
// for(int j = 0; j < 5; j++) {
// btnsLeds_setOnAll();
// delay(100);
// btnsLeds_clear();
// delay(100);
// }
}
//
// Admin //
//
void adminBtn1_onPressed() {
Serial.println("Admin btn 1");
btnsLeds_setOnAll();
box_unlock();
led_on();
}
void adminBtn2_onPressed() {
Serial.println("adminBtn2_onPressed");
laser_on();
}
void adminBtn2_notPressed() {
Serial.println("adminBtn2_notPressed");
laser_off();
}
//
// Main //
//
void setup() {
Serial.begin(115200);
btns_init();
btnsLeds_init();
box_init();
random_init();
admin_init();
signalChargerDone_init();
led_init();
btnLaser_init();
cpz_init();
laser_init();
// checkGameStage();
Serial.println("Guardians_K4_Memmory_v3_Transistor");
delay(1000);
}
void loop() {
admin_check();
// transistor //
cpz_check();
if(cpz_isDone){
btnLaser_check();
}
// memmory //
if(activateMemmory_isDone){
if(gameStage < GAME_STAGE_MAX) {
btns_check();
}
}
if(!activateMemmory_isDone){
signalChargerDone_check();
}
}