Keypad doesn't always register when running other code at the same time


i'm having trouble in end of airsoft bomb project on mega 2560. lot of code, grateful take time me out.
 the first thing need set code , timer. while in process there no other tasks running in background since no conditions other voids being met. when done countdown timer running , if press '*' able input disarm code. whilst doing countdown still running, in different void, time not shown on lcd. every time countdown looping different void cheking state of 3 cables (one of them can cut disarm) code inputting. problem i'm having trouble getting arduino register keys beeing pressed. keys work better others, different ones every time restart countdown. need press keys 10-15 times time time register. when setting code , timer before countdown starts not having trouble it. have tried without buzzer , leds make sure not current issue , without lcd plugged in, makes no difference. i'm guessing there problem in code, cannot see problems. no delays being used while countdown running, millis.

code: [select]
void loop() {
  char keypressed = mykeypad.getkey();
  greenledlevel = digitalread(greenledpin);
  redledlevel = digitalread(redledpin);
 
  if (bbombarmed == high) {
    redledlevel = 255;
    greenledlevel = 0;
  }
  else if (bbombarmed == low) {
    redledlevel = 0;
    greenledlevel = 255;
  }
  analogwrite(redledpin, redledlevel);
  analogwrite(greenledpin, greenledlevel);
  if (bbombarmed == low && bdetonated == low && bdisarmed == low && bgameover == low) {
    randomizewire();
    while (bcodeset == low && btimerset == low) {setcode();}
    while (bcodeset == high && btimerset == low) {settimer();}
  }
  else if (bbombarmed == high && bdetonated == low && bdisarmed == low && bgameover == low) {
    countdown();
    if (keypressed == '*') {
      bdisarmattempt = high;
    }
    if (bdisarmattempt == high) {
      disarming();
    }
    while (bwirecut == high) {wirecut();}
  }
  else if (bbombarmed == low && bdetonated == low && bdisarmed == high) {
    disarmed();
  }
  else if (bbombarmed == high && bdetonated == high) {
    detonation();
  }
  else if (bgameover == high) {
    if (keypressed != no_key) {
      keybuzzer();
      bdetonated = low;
      bcodeset = low;
      btimerset = low;
      bdisarmed = low;
      bdisarmattempt = low;
      bgameover = low;
    }
  }
}

void countdown() {
  char keypressed = mykeypad.getkey();
  unsigned long time = millis();

  checkwires();
  if (time - timecountdown >= 90 && time - timecountdown <= 110) {
    digitalwrite(buzzer, low);
  }
  if (timeremaining[0] == 0 && timeremaining[1] == 0) {
    if (timeremaining[2] >0 && timeremaining[2] <= 2) {
      if (time - timecountdown >= 490 && time - timecountdown <= 510) {
        digitalwrite(buzzer, high);
      }
      if (time - timecountdown >= 590 && time - timecountdown <= 610) {
        digitalwrite(buzzer, low);
      }
    }
    else if (timeremaining[2] < 1) {
      if (time - timecountdown >= 323 && time - timecountdown <= 343) {
        digitalwrite(buzzer, high);
      }
      if (time - timecountdown >= 423 && time - timecountdown <= 443) {
        digitalwrite(buzzer, low);
      }
      if (time - timecountdown >= 656 && time - timecountdown <= 676) {
        digitalwrite(buzzer, high);
      }
      if (time - timecountdown >= 756 && time - timecountdown <= 776) {
        digitalwrite(buzzer, low);
      }
    }
  }
  if (time - timecountdown >= 1000){
    if (timeremaining[0] == 0 && timeremaining[1] == 0 && timeremaining[2] == 0 && timeremaining[3] == 0) {
      bdetonated = high;
    }
    else if (timeremaining[0] >= 1 && timeremaining[1] == 0 && timeremaining[2] == 0 && timeremaining[3] == 0) {
      timeremaining[0] = timeremaining[0] - 1;
      timeremaining[1] = 9;
      timeremaining[2] = 5;
      timeremaining[3] = 9;
    }
    else if (timeremaining[1] >= 1 && timeremaining[2] == 0 && timeremaining[3] == 0) {
      timeremaining[1] = timeremaining[1] - 1;
      timeremaining[2] = 5;
      timeremaining[3] = 9;
    }
    else if (timeremaining[2] >= 1 && timeremaining[3] == 0) {
      timeremaining[2] = timeremaining[2] - 1;
      timeremaining[3] = 9;
    }
    else {
      timeremaining[3] = timeremaining[3] - 1;
    }
    if (bdisarmattempt == low) {
      lcd.clear ();
      lcd.print("detonation in:");
      lcd.setcursor(0, 2);
      lcd.print(timeremaining[0]);
      lcd.setcursor(1, 2);
      lcd.print(timeremaining[1]);
      lcd.setcursor(2, 2);
      lcd.print(":");
      lcd.setcursor(3, 2);
      lcd.print(timeremaining[2]);
      lcd.setcursor(4, 2);
      lcd.print(timeremaining[3]);
  }
    digitalwrite(buzzer, high);
    timecountdown = time;
  }
}

void checkwires() {
  redwirestate = digitalread(redwirepin);
  blackwirestate = digitalread(blackwirepin);
  bluewirestate = digitalread(bluewirepin);

  if ((redwirestate == low && bredwirecutok == high) || (blackwirestate == low && bblackwirecutok == high) || (bluewirestate == low && bbluewirecutok == high)) {
    bwirecut = high;
  }
  else if ((redwirestate == low && bredwirecutok == low) || (blackwirestate == low && bblackwirecutok == low) || (bluewirestate == low && bbluewirecutok == low)) {
    bdetonated = high;
  }
}

void disarming() {
  char keypressed = mykeypad.getkey();

  if (keystep == 0) {
    lcd.clear ();
    lcd.print("set disarm code:");
    lcd.setcursor(0, 2);
    lcd.print("*");
    lcd.setcursor(1, 2);
    lcd.print("*");
    lcd.setcursor(2, 2);
    lcd.print("*");
    lcd.setcursor(3, 2);
    lcd.print("*");
    keystep = 1;
  }
  else if (keystep == 1) {
    if (keypressed != no_key && keypressed >='0' && keypressed <='9') {
      disarm[0] = keypressed;
      lcd.setcursor(0, 2);
      lcd.print(disarm[0]);
      keystep = 2;
    }
  }
  else if (keystep == 2) {
    if (keypressed != no_key && keypressed >='0' && keypressed <='9') {
      disarm[1] = keypressed;
      lcd.setcursor(1, 2);
      lcd.print(disarm[1]);
      keystep = 3;
    }
  }
  else if (keystep == 3) {
    if (keypressed != no_key && keypressed >='0' && keypressed <='9') {
      disarm[2] = keypressed;
      lcd.setcursor(2, 2);
      lcd.print(disarm[2]);
      keystep = 4;
    }
  }
  else if (keystep == 4) {
    if (keypressed != no_key && keypressed >='0' && keypressed <='9') {
      disarm[3] = keypressed;
      lcd.setcursor(3, 2);
      lcd.print(disarm[3]);
      keystep = 5;
    }
  }
  else if (keystep == 5) {
    if (disarm[0] == code[0] && disarm[1] == code[1] && disarm[2] == code[2] && disarm[3] == code[3]) {
      keystep = 0;
      bdisarmed = high;
      bbombarmed = low;
      bdisarmattempt = low;
    }
    else {
      keystep = 0;
      bdisarmattempt = low;
    }
  }       
}

i have included voids running when problem occurs, since allowed include 9000 characters in post.


Arduino Forum > Using Arduino > Programming Questions > Keypad doesn't always register when running other code at the same time


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts