Add debounce function to buttons in arduino code

I have made a transmission controller and the code works fine as it is. But i would like to add debounce function into to the code, since the shifts would somethimes not be recognised when pushing the buttons. I am far from a good coder, so this code is very simple and I understand everything in it. But I cant figure out how to add debounce to the buttons without advancing the code too much for me too not understand it anymore.

Could anyone come with any help or tips please? See attached code.

int gear = 1;
// output pins for transistor controlled solenoids
int solA = 4;
int solB = 5;
int solC = 6;
int solD = 7;
int solE = 8;
int solTCC = 9;
int solLinePress = 10;
// input pins for up down /  with pullup resistors
int gearup = 2;
int geardown = 3;

// Pin out for single 7 digit display
int a=22; 
int b=23; 
int c=24; 
int d=25; 
int e=26; 
int f=27; 
int g=28;

void setup() {
  pinMode(solA, OUTPUT);
  pinMode(solB, OUTPUT);
  pinMode(solC, OUTPUT);
  pinMode(solD, OUTPUT);
  pinMode(solE, OUTPUT);
  pinMode(solTCC, OUTPUT);
  pinMode(solLinePress, OUTPUT);
  pinMode(gearup, INPUT);
  pinMode(geardown, INPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void loop() {

 if(gear == -1){ // Reverse

    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    
  }
      if(gear == 0){ // Neutral
    
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 1);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);

  }

  if(gear == 1){ // 1th gear
    
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 1);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }
  if(gear == 2){ // 2nd Gear
   
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 1);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
  }
  if(gear == 3){ // 3rd Gear
  
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 1);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    
  }
  if(gear == 4){ // 4th Gear
 
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);

 }
  if(gear == 5){ // 5th Gear
 
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
     }
  if(gear == 6){ / // 6th Gear
   
    digitalWrite(solA, 0);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);

     }
  if(gear == 7){ // 7th Gear
  
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
   
    
       }
  if(gear == 8){ // 8th Gear
     
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    
    
  }


    
  //takes care of gear switching

  delay(150); //delay to prevent going through gears too quick from holding the button or pressing too long

  gear += digitalRead(geardown) - digitalRead(gearup); // non debounced! But may not be a problem because of the delay by gear change
  if(gear < -1) gear = -1;
  if(gear > 8) gear = 8;
  //limits to actual gearset


}

This is code I adapted from a similar project. Uses the Arduino Helpers library.

[color=#5e6d03]#include[/color] [color=#434f54]<[/color][b][color=#d35400]Arduino_Helpers[/color][/b][color=#434f54].[/color][color=#000000]h[/color][color=#434f54]>[/color] [color=#434f54]// [/color][u][color=#434f54]https://github.com/tttapa/Arduino-Helpers[/color][/u]
[color=#5e6d03]#include[/color] [color=#434f54]<[/color][b][color=#d35400]AH[/color][/b][color=#434f54]/[/color][color=#000000]Hardware[/color][color=#434f54]/[/color][b][color=#d35400]IncrementDecrementButtons[/color][/b][color=#434f54].[/color][color=#000000]hpp[/color][color=#434f54]>[/color]

[color=#434f54]// button pins for up and down respectively[/color]
[b][color=#d35400]IncrementDecrementButtons[/color][/b] [color=#000000]buttons[/color] [color=#434f54]=[/color] [color=#000000]{[/color][color=#000000]2[/color][color=#434f54],[/color] [color=#000000]3[/color][color=#000000]}[/color][color=#000000];[/color]

[color=#00979c]void[/color] [color=#5e6d03]setup[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color]
  [color=#434f54]// enables internal pull-up resistors on both button pins:[/color]
  [color=#000000]buttons[/color][color=#434f54].[/color][color=#d35400]begin[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color]
  [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]begin[/color][color=#000000]([/color][color=#000000]115200[/color][color=#000000])[/color][color=#000000];[/color]
[color=#000000]}[/color]

[color=#00979c]void[/color] [color=#5e6d03]loop[/color][color=#000000]([/color][color=#000000])[/color] [color=#000000]{[/color]
  [color=#00979c]static[/color] [color=#00979c]int8_t[/color] [color=#000000]gear[/color] [color=#434f54]=[/color] [color=#434f54]-[/color][color=#000000]1[/color][color=#000000];[/color]

  [color=#434f54]// read the buttons, and change gear accordingly[/color]
  [color=#00979c]auto[/color] [color=#000000]buttonState[/color] [color=#434f54]=[/color] [color=#000000]buttons[/color][color=#434f54].[/color][color=#d35400]update[/color][color=#000000]([/color][color=#000000])[/color][color=#000000];[/color]
  [color=#5e6d03]if[/color] [color=#000000]([/color][color=#000000]buttonState[/color] [color=#434f54]==[/color] [b][color=#d35400]IncrementDecrementButtons[/color][/b][color=#434f54]:[/color][color=#434f54]:[/color][color=#00979c]Increment[/color] [color=#434f54]&&[/color] [color=#000000]gear[/color] [color=#434f54]<[/color] [color=#000000]8[/color][color=#000000])[/color]
    [color=#434f54]++[/color][color=#000000]gear[/color][color=#000000];[/color]
  [color=#5e6d03]else[/color] [color=#5e6d03]if[/color] [color=#000000]([/color][color=#000000]buttonState[/color] [color=#434f54]==[/color] [b][color=#d35400]IncrementDecrementButtons[/color][/b][color=#434f54]:[/color][color=#434f54]:[/color][color=#00979c]Decrement[/color] [color=#434f54]&&[/color] [color=#000000]gear[/color] [color=#434f54]>[/color] [color=#434f54]-[/color][color=#000000]1[/color][color=#000000])[/color]  
    [color=#434f54]--[/color][color=#000000]gear[/color][color=#000000];[/color]
  [color=#5e6d03]else[/color] [color=#5e6d03]if[/color] [color=#000000]([/color][color=#000000]buttonState[/color] [color=#434f54]==[/color] [b][color=#d35400]IncrementDecrementButtons[/color][/b][color=#434f54]:[/color][color=#434f54]:[/color][color=#00979c]Reset[/color][color=#000000])[/color]
    [color=#000000]gear[/color] [color=#434f54]=[/color] [color=#434f54]-[/color][color=#000000]1[/color][color=#000000];[/color]

  [color=#5e6d03]if[/color] [color=#000000]([/color][color=#000000]buttonState[/color] [color=#434f54]!=[/color] [b][color=#d35400]IncrementDecrementButtons[/color][/b][color=#434f54]:[/color][color=#434f54]:[/color][color=#00979c]Nothing[/color][color=#000000])[/color]
    [b][color=#d35400]Serial[/color][/b][color=#434f54].[/color][color=#d35400]println[/color][color=#000000]([/color][color=#000000]gear[/color][color=#000000])[/color][color=#000000];[/color] [color=#434f54]// print if gear changed[/color]
[color=#000000]}[/color]

It might be a good exercise to try and implement it yourself though. Decouple it from the LEDs first, and use millis() for timing instead of using delay.

Pieter

you need to see consistent (the same value) after a delay (10 msec).

See this library's example.

By the way, did you use the pull-up or pull-down resistor for buttons?

did you use the pull-up or pull-down resistor for buttons?

why not configure the pin as INPUT_PULLUP and use the internal resistor?

the debounce I used in my pinball machine software was simply a timer to delay reading switches until 200 millis had passed. worked fine.

unsigned long PlayFieldWaitTime = 0;
int PlayFieldInterval = 250;

if (millis() > PlayFieldWaitTime) {
for (int i = 0; i < 4; i++) {
if (digitalRead(BumperSW*) == LOW) {*

  • PlayFieldWaitTime = millis() + PlayFieldInterval;*

@sevenoutpinball - 160 posts, and you still haven't figured-out code tags? :o

what are code tags?

sevenoutpinball:
what are code tags?

Stunning.

Everything we call real is made of things that cannot be regarded as real.  If quantum mechanics hasn't profoundly shocked you, you haven't understood it yet. - Niels Bohr

No private consultations undertaken!

just testing if I did it write

Everything we call real is made of things that cannot be regarded as real.  If quantum mechanics hasn't profoundly shocked you, you haven't understood it yet. - Niels Bohr

No private consultations undertaken!

just testing if I did it right

dougp:
Stunning.

actually clicking quote in the bottom right does the same thing.

IoT_hobbyist:
See this library's example.

By the way, did you use the pull-up or pull-down resistor for buttons?

Thanks for the Button library! This actually looks very promising. I use a pull-up resistor on the buttons. I will try to implement this code now and see :smiley:

The ezbutton library didn`t work that well. It did work, but the debounce did not get any better.

So this is the code i got that works the best for now.

But the only thing I would wish for now is that as long as one button is hold, it will not change more gears. So that I have to release the button and press again to change to next gear.

int gear = 0;
// output pins for transistor controlled solenoids
int solA = 4;
int solB = 5;
int solC = 6;
int solD = 7;
int solE = 8;
int solTCC = 9;
int solLinePress = 10;
// input pins for up down /  with pullup resistors
int gearup = 3;
int geardown = 2;

int gearupFake = 0;
int geardownFake = 0;

int buttonState = 0;
int lastButtonState = 1;
int buttonState1;
int lastButtonState1 = 0;

// Pin out for single 7 digit display
int a=22; 
int b=23; 
int c=24; 
int d=25; 
int e=26; 
int f=27; 
int g=28;

void setup() {

  Serial.begin(9600);
  
  pinMode(solA, OUTPUT);
  pinMode(solB, OUTPUT);
  pinMode(solC, OUTPUT);
  pinMode(solD, OUTPUT);
  pinMode(solE, OUTPUT);
  pinMode(solTCC, OUTPUT);
  pinMode(solLinePress, OUTPUT);
  
  pinMode(gearup, INPUT);
  pinMode(geardown, INPUT);
  
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void loop() {

  {
  buttonState = digitalRead(gearup);

  if (buttonState != lastButtonState)
  {
    if (buttonState == 0)
    {
      gearupFake = 1;
    }
    else 
    {
      gearupFake = 0;
    
    }
   delay(100); // Delay a little bit to avoid bouncing
  }
  lastButtonState = buttonState;
  }

 {
  buttonState1 = digitalRead(geardown);

  if (buttonState1 != lastButtonState1)
  {
    if (buttonState1 == 0)
    {
      geardownFake = 1;
    }
    else 
    {
      geardownFake = 0;
     
    }
    delay(100);
  }
  lastButtonState1 = buttonState1;
  

}
 if(gear == -1){ // Reverse

    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    
  }
      if(gear == 0){ // Neutral
    
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 1);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
  
  }

  if(gear == 1){ // 1th gear
    
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 1);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }
  if(gear == 2){ // 2nd Gear
   
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 1);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
  }
  if(gear == 3){ // 3rd Gear
  
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 1);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    
  }
  if(gear == 4){ // 4th Gear
 
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);

 }
  if(gear == 5){ // 5th Gear
 
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
     }
  if(gear == 6){ // 6th Gear
   
    digitalWrite(solA, 0);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);

     }
  if(gear == 7){ // 7th Gear
  
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
   
    
       }
  if(gear == 8){ // 8th Gear
     
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    
    
  }


    
  //takes care of gear switching

  

  gear += (geardownFake) - (gearupFake); // non debounced! But may not be a problem because of the delay by gear change
  if(gear < -1) gear = -1;
  if(gear > 8) gear = 8;
  //limits to actual gearset

  delay(200); //delay to prevent going through gears too quick from holding the button or pressing too long


}

Stiffone:
I use a pull-up resistor on the buttons

That library implemented INPUT_PULLUP, therefore, you do not need to use any external pull-up or pull-down resistor.

Stiffone:
The ezbutton library didn`t work that well. It did work, but the debounce did not get any better.

did you use button1.setDebounceTime(50) in setup() and button1.loop() function in loop()

gcjr:
why not configure the pin as INPUT_PULLUP and use the internal resistor?

I asked because, if he do NOT use any external pull-up or pull-down resistor, he needs to use INPUT_PULLUP

IoT_hobbyist:
That library implemented INPUT_PULLUP, therefore, you do not need to use any external pull-up or pull-down resistor.

did you use button1.setDebounceTime(50) in setup() and button1.loop() function in loop()

Ok does the pull-up resistor part have any thing to do with it not doing debounce very well?

Here is the code i tested.

int gear = 0;
// output pins for transistor controlled solenoids
int solA = 4;
int solB = 5;
int solC = 6;
int solD = 7;
int solE = 8;
int solTCC = 9;
int solLinePress = 10;
// input pins for up down /  with pullup resistors

#include <ezButton.h>

ezButton button1(2);  // create ezButton object that attach to pin 6;
ezButton button2(3);  // create ezButton object that attach to pin 7;

int gearupFake;
int geardownFake;

// Pin out for single 7 digit display
int a=22; 
int b=23; 
int c=24; 
int d=25; 
int e=26; 
int f=27; 
int g=28;

void setup() {

  button1.setDebounceTime(50); // set debounce time to 50 milliseconds
  button2.setDebounceTime(50); // set debounce time to 50 milliseconds
  
  pinMode(solA, OUTPUT);
  pinMode(solB, OUTPUT);
  pinMode(solC, OUTPUT);
  pinMode(solD, OUTPUT);
  pinMode(solE, OUTPUT);
  pinMode(solTCC, OUTPUT);
  pinMode(solLinePress, OUTPUT);
  
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void loop() {

  button1.loop(); // MUST call the loop() function first
  button2.loop(); // MUST call the loop() function first

int btn1State = button1.getState();
int btn2State = button2.getState();

 if(button1.isPressed())
    (gearupFake = 1);

  if(button1.isReleased())
    (gearupFake = 0);

  if(button2.isPressed())
    (geardownFake = 1);

  if(button2.isReleased())
    (geardownFake = 0);

 if(gear == -1){ // Reverse

    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    
  }
      if(gear == 0){ // Neutral
    
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 1);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, LOW);
    digitalWrite(c, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);

  }

  if(gear == 1){ // 1th gear
    
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 1);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);

  }
  if(gear == 2){ // 2nd Gear
   
    digitalWrite(solA, 1);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 1);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
  }
  if(gear == 3){ // 3rd Gear
  
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 1);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    
  }
  if(gear == 4){ // 4th Gear
 
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);

 }
  if(gear == 5){ // 5th Gear
 
    digitalWrite(solA, 0);
    digitalWrite(solB, 1);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
     }
  if(gear == 6){ // 6th Gear
   
    digitalWrite(solA, 0);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);

     }
  if(gear == 7){ // 7th Gear
  
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 0);
    digitalWrite(solD, 0);
    digitalWrite(solE, 1);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
   
    
       }
  if(gear == 8){ // 8th Gear
     
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
    digitalWrite(solC, 1);
    digitalWrite(solD, 0);
    digitalWrite(solE, 0);
    digitalWrite(solTCC, 0);
    digitalWrite(solLinePress, 0);

    digitalWrite(a, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    
    
  }


    
  //takes care of gear switching

  delay(100); //delay to prevent going through gears too quick from holding the button or pressing too long

  gear += (geardownFake) - (gearupFake); // non debounced! But may not be a problem because of the delay by gear change
  if(gear < -1) gear = -1;
  if(gear > 8) gear = 8;
  //limits to actual gearset


}

The library works well. Your implementation is incorrect.

I compared two codes. You have a problem in the code that use the library
You need to change

int gearupFake;
int geardownFake;

to

int gearupFake = 0;
int geardownFake = 0;

Other thing:

  1. You used delay function. This may make Arduino missing some pressing event
  2. It is better to change this code:
int btn1State = button1.getState();
int btn2State = button2.getState();

 if(button1.isPressed())
    (gearupFake = 1);

  if(button1.isReleased())
    (gearupFake = 0);

  if(button2.isPressed())
    (geardownFake = 1);

  if(button2.isReleased())
    (geardownFake = 0);

to

int btn1State = button1.getState();
int btn2State = button2.getState();

if(btn1State == 0)
 gearupFake = 1;
else
 gearupFake = 0;
 
if(btn2State == 0)
 geardownFake = 1;
else
 geardownFake = 0;

Thanks! I will try the code again soon. But do you have any suggestion for the function that if i hold the "gear up" button, it will not change up the gears rapidly. But wait until the button is released and pressed again for it to change gear once more.

To prevent going through gears too quick from holding the button or pressing too long, you can use this code,

Declare two variables:

constant int DIVISOR = 1000;
int gear = 0;
int gear_origin = 0

and in your code

gear_origin += (geardownFake) - (gearupFake);

gear = (int) (gear_origin / DIVISOR );

if(gear < -1) gear = -1;
if(gear > 8) gear = 8;

change value of DIVISOR to the desired value.