How to add the debouncing time on push button for 7 Segment display counter?

How to add the debouncing time on push button for 7 Segment display counter?

Look my code below.



// Start of code.

#include <EEPROM.h>

// counter button definition

#define button1 A0

#define button2 A1

// segment pin definitions

#define SegA 2

#define SegB 3

#define SegC 4

#define SegD 5

#define SegE 6

#define SegF 7

#define SegG 8

// common pins of the four digits definitions

#define Dig1 9

#define Dig2 10

#define Dig3 11

#define INDLED 13

// variable declarations

byte current_digit;

int count = 0;

const int COUNTER_EEPROM_ADDRESS = 0;

void setup() 

{

  pinMode(button1, INPUT_PULLUP);

  pinMode(button2, INPUT_PULLUP);

  pinMode(SegA, OUTPUT);

  pinMode(SegB, OUTPUT);

  pinMode(SegC, OUTPUT);

  pinMode(SegD, OUTPUT);

  pinMode(SegE, OUTPUT);

  pinMode(SegF, OUTPUT);

  pinMode(SegG, OUTPUT);

  pinMode(Dig1, OUTPUT);

  pinMode(Dig2, OUTPUT);

  pinMode(Dig3, OUTPUT);

  pinMode(INDLED, OUTPUT);

  disp_off();  // turn off the display

  // Timer1 module overflow interrupt configuration

  TCCR1A = 0;

  TCCR1B = 1;  // enable Timer1 with prescaler = 1 ( 16 ticks each 1 µs)

  TCNT1  = 0;  // set Timer1 preload value to 0 (reset)

  TIMSK1 = 1;  // enable Timer1 overflow interrupt

  // Get the latest count from EEPROM

  EEPROM.get(COUNTER_EEPROM_ADDRESS, count);

  if (count > 999 || count < 0)

    count = 0;

      }

    ISR(TIMER1_OVF_vect)   // Timer1 interrupt service routine (ISR)

{

  disp_off();  // turn off the display

  switch (current_digit)

  {

    

    case 1:

      disp( (count / 100) % 10);   // prepare to display digit 1

      digitalWrite(Dig1, LOW);     // turn on digit 1

      break;

    case 2:

      disp( (count / 10) % 10);   // prepare to display digit 2

      digitalWrite(Dig2, LOW);    // turn on digit 2

      break;

    case 3:

      disp(count % 10);   // prepare to display digit 3 (most right)

      digitalWrite(Dig3, LOW);  // turn on digit 3

  }

  current_digit = (current_digit % 3) + 1;

}

// main loop

void loop()

{

  

      if (digitalRead(button1) == 0)

    

   {

     count++;  // increment 'count' by 1

     if (count > 999 || count < 0)

      count = 0;

     EEPROM.put(COUNTER_EEPROM_ADDRESS, count);

    delay(100);  // wait 200 milliseconds

  }

   if (digitalRead(button2) == 0)

  {

    count--;  // increment 'count' by 1

    if (count > 999 || count < 0)

      count = 0;

    EEPROM.put(COUNTER_EEPROM_ADDRESS, count);

    delay(100);  // wait 200 milliseconds

  }

  if ((digitalRead(button1) == 0) && (digitalRead(button2) == 0))

 

    {

     // write a 0 to all 512 bytes of the EEPROM

      

     for (int i = 0; i < 512; i++)

      

      EEPROM.write(i, 0);

      // turn the LED on when we're done

        digitalWrite(INDLED, HIGH);

             

  }

}

  

void disp(byte number)

{

  

  switch (number)

  {

    case 0:  // print 0

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, HIGH);

      digitalWrite(SegF, HIGH);

      digitalWrite(SegG, LOW);

      break;

    case 1:  // print 1

      digitalWrite(SegA, LOW);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, LOW);

      digitalWrite(SegE, LOW);

      digitalWrite(SegF, LOW);

      digitalWrite(SegG, LOW);

      break;

    case 2:  // print 2

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, LOW);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, HIGH);

      digitalWrite(SegF, LOW);

      digitalWrite(SegG, HIGH);

      break;

    case 3:  // print 3

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, LOW);

      digitalWrite(SegF, LOW);

      digitalWrite(SegG, HIGH);

      break;

    case 4:  // print 4

      digitalWrite(SegA, LOW);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, LOW);

      digitalWrite(SegE, LOW);

      digitalWrite(SegF, HIGH);

      digitalWrite(SegG, HIGH);

      break;

    case 5:  // print 5

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, LOW);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, LOW);

      digitalWrite(SegF, HIGH);

      digitalWrite(SegG, HIGH);

      break;

    case 6:  // print 6

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, LOW);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, HIGH);

      digitalWrite(SegF, HIGH);

      digitalWrite(SegG, HIGH);

      break;

    

    case 7:  // print 7

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, LOW);

      digitalWrite(SegE, LOW);

      digitalWrite(SegF, LOW);

      digitalWrite(SegG, LOW);

      break;

    case 8:  // print 8

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, HIGH);

      digitalWrite(SegF, HIGH);

      digitalWrite(SegG, HIGH);

      break;

    case 9:  // print 9

      digitalWrite(SegA, HIGH);

      digitalWrite(SegB, HIGH);

      digitalWrite(SegC, HIGH);

      digitalWrite(SegD, HIGH);

      digitalWrite(SegE, LOW);

      digitalWrite(SegF, HIGH);

      digitalWrite(SegG, HIGH);

  }

}

void disp_off()

{

   digitalWrite(Dig1, HIGH);

   digitalWrite(Dig2, HIGH);

   digitalWrite(Dig3, HIGH);

  

}

// end of code.

you should edit your post using </> for your code

what do "denounce" mean?

"&&", not "&" (logical vs bitwise)

Thanks for correction.

This is just to Erase EEPROM when I push 2 buttons together, So Yep I want some 2sec delay also add here beside of debounce time.

@gcjr For example: When I push button 100ms the counter will start triggering (adding one digit per one push) let say after keep holding the button 300ms the counter should start counting fast within 50ms.

don't see any 2 sec delay

when you press buttons 1 or 2, it looks like they will in/decrement count every 100 msec

if you push both, the EEPROM will be erased, but unless you release both at exactly the same time, the last button release will in/decrement count.

detecting a button "press" by recognizing a change in button state would fix that

@gcjr .

Unfortunately I didn't add that 2 sec yet I don't know where and how to implement ))). To simplify the task Lets put on side that erasing of EEPROM feature.

How we can just add delay For example only on Button1 so it will trigger after 100ms but when I hold 300ms it start increasing digits within 50ms. ?

Thanks for Help.

capture a timestamp, msec = millis();. when the current time > 300, increment and for every 50 msec after that (so maybe add 50 to the timestamp)

@gcjr It didn't work out looks like its complicated for me as I'm beginner on software (((

/ variable declarations

byte current_digit;

int count = 0;

const int COUNTER_EEPROM_ADDRESS = 0;

unsigned long previousMillis = 0;  //will store last time LED was blinked

const long period = 1000;         // period at which to blink in ms
if (currentMillis - previousMillis > period)

  

 {previousMillis = currentMillis;   // save the last time you blinked the LED

 }

if (digitalRead(button2) == 0)

{

             

    count--;  // increment 'count' by 1

    if (count > 999 || count < 0)

      count = 0;

    EEPROM.put(COUNTER_EEPROM_ADDRESS, count);

    delay(100);  // wait 200 milliseconds

  }

consider following. you'll have to figure out how to recognize both buttons pressed

byte pinsBut [] = { A1, A2, A3 };
#define N_BUT   sizeof(pinsBut)

byte butState [N_BUT];

unsigned long msec;
unsigned long msec0;

int count;

// -----------------------------------------------------------------------------
int
chkButtons ()
{
    for (unsigned n = 0; n < sizeof(pinsBut); n++)  {
        byte but = digitalRead (pinsBut [n]);
        
        if (LOW == but)  {
            if (butState [n] != but)  {
                butState [n] = but;
                msec0        = msec;
            }

            else if ( (msec - msec0) > 300)  {
                msec0 += 50;
                return n;
            }
        }
    }
    return -1;
}

// -----------------------------------------------------------------------------
void
loop ()
{
    msec = millis ();

    switch (chkButtons ())  {
    case 0:
        Serial.println (++count);
        break;

    case 1:
        if (0 > --count)
            count = 0;
        Serial.println (count);
        break;
    }
}

// -----------------------------------------------------------------------------
void
setup ()
{
    Serial.begin (9600);

    for (unsigned n = 0; n < sizeof(pinsBut); n++)  {
        pinMode (pinsBut [n], INPUT_PULLUP);
        butState [n] = digitalRead (pinsBut [n]);
    }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.