Go Down

Topic: Serial transmission duration different with serial monitor on and off...???? (Read 276 times) previous topic - next topic

thegerman12

Ok, another question for the experts.... 

I found a multi-button debounce program online that is perfect for what i am looking for.  When i run it with the serial monitor, i press a button, it outputs to the serial monitor for as long as i hold the button down (working perfectly).  When i close the serial monitor, i press and release the button, the serial TX light stays on for an additional 5 seconds, and it is sending that data for a longer period of time than the button is pressed.  Any ideas on why this would continue to send data?

Here is the code:
Code: [Select]
#define DEBOUNCE 10  // button debouncer, how many ms to debounce, 5+ ms is usually plenty

// here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc
byte buttons[] = {3,4,5,6}; // using digital pins 3,4,5,6
// This handy macro lets us determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)
// we will track if a button is just pressed, just released, or 'currently pressed'
volatile byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS];

void setup() {
  byte i;

  // set up serial port
  Serial.begin(19200);
// Serial.print("Button checker with ");
// Serial.print(NUMBUTTONS, DEC);
// Serial.println(" buttons");

  // pin13 LED
  pinMode(13, OUTPUT);

  // Make input & enable pull-up resistors on switch pins
  for (i=0; i< NUMBUTTONS; i++) {
    pinMode(buttons[i], INPUT);
    digitalWrite(buttons[i], HIGH);
  }

  // Run timer2 interrupt every 15 ms
  TCCR2A = 0;
  TCCR2B = 1<<CS22 | 1<<CS21 | 1<<CS20;

  //Timer2 Overflow Interrupt Enable
  TIMSK2 |= 1<<TOIE2;

}

SIGNAL(TIMER2_OVF_vect) {
  check_switches();
}

void check_switches()
{
  static byte previousstate[NUMBUTTONS];
  static byte currentstate[NUMBUTTONS];
  static long lasttime;
  byte index;

  if (millis() < lasttime) {
     // we wrapped around, lets just try again
     lasttime = millis();
  }

  if ((lasttime + DEBOUNCE) > millis()) {
    // not enough time has passed to debounce
    return;
  }
  // ok we have waited DEBOUNCE milliseconds, lets reset the timer
  lasttime = millis();

  for (index = 0; index < NUMBUTTONS; index++) {

    currentstate[index] = digitalRead(buttons[index]);   // read the button

    /*     
    Serial.print(index, DEC);
    Serial.print(": cstate=");
    Serial.print(currentstate[index], DEC);
    Serial.print(", pstate=");
    Serial.print(previousstate[index], DEC);
    Serial.print(", press=");
    */

    if (currentstate[index] == previousstate[index]) {
      if ((pressed[index] == LOW) && (currentstate[index] == LOW)) {
          // just pressed
          justpressed[index] = 1;
      }
      else if ((pressed[index] == HIGH) && (currentstate[index] == HIGH)) {
          // just released
          justreleased[index] = 1;
      }
      pressed[index] = !currentstate[index];  // remember, digital HIGH means NOT pressed
    }
    //Serial.println(pressed[index], DEC);
    previousstate[index] = currentstate[index];   // keep a running tally of the buttons
  }
}

void loop() {
  for (byte i = 0; i < NUMBUTTONS; i++) {
    if (justpressed[i]) {
      justpressed[i] = 0; //this sends a single serial Byte regardless of whether button is held down
      Serial.print(i+1);  //i+1 because we want the button "0" to be sent as button 1
      //Serial.println(" Just pressed");
      // remember, check_switches() will CLEAR the 'just pressed' flag
    }
    if (justreleased[i]) {
      justreleased[i] = 0;
    //  Serial.print(i, DEC);
    //  Serial.println(" Just released");
      // remember, check_switches() will CLEAR the 'just pressed' flag
    }
    if ((pressed[i]) && (i < 2)) { // want to stream serial data for button 1 and 2 while button is pressed
      Serial.print(i+1, BYTE);  //i+1 because we want button "0' to be sent as button 1
      //Serial.println(" pressed");
      // is the button pressed down at this moment
   
   }
  }
}



Thanks guys!

Go Up