Using Arduino to ignore button presses

arduino diagram

How I programmed an Arduino to accept a button press and then ignore subsequent button presses

I am working on an art project that involves a button. The button will start the device, but ignore any extra button presses for a set amount of time. This post focuses on my small journey, and a few things I learned along the way.

My Background

I have a very basic knowledge of electronics. I have an Arduino starter kit, and I played around with the tutorials until I understood the basics. After that I moved on. I figured I could always pick it back up again if needed.

The Requirements

  • Start a garage door opener (I’ll refer to it as the “opener” from now on)
  • Use the opener’s wired-button terminals/leads/pins to control it. These are the same leads that you would use hook up to a button on the wall in your house to use your garage door opener.
  • The opener has 2 terminals/leads – if they touch together, the opener will start
  • Use a button to communicate with the Arduino. It will decide if it should (or should not) use those terminals to start the opener

Hardware

I need 2 buttons: One to communicate with the Arduino, and the other one controlled by the Arduino. To do this I need something called a Relay.

What’s a Relay

A Relay is a fancy switch that is controlled by electricity. It does this with an electromagnet. Imagine a light switch – you add some parts so that if you hold a magnet to one side, the switch will flip. Take the magnet away and the switch flips back off. Wrap that into a box and you have a relay.

  • If no electricity is running to the Relay, then there is no magnet. The switch is off
  • If electricity is running to the Relay, then the electromagnet is on. The magnet attracts the switch to the other side and turns the switch on

You can hear a Relay when it switches. It makes a distinct “click” noise. You find them in a lot of everyday things, like your windshield wipers.

That’s the basics. Yet there are a few more features:

  • The Relay can do the exact opposite. It can be ON when no electricity is running, and turn OFF when the electricity is on
  • Relays are used to operate high voltage electronics, while protecting sensitive equipment. The Arduino can only handle about 5 volts. It could never power a household light bulb. To do this you wire the light bulb with the full power, and use a relay to control that power. The Arduino is safely behind the Relay, protected from the high voltage.

A relay typically has 5 pins:

  1. Input 1: the positive (+)
  2. Input 2: the negative (-)
  3. a common (or COM): this is one half of the thing you are switching
  4. Normally Closed (or N/C): when power is on, the switch is on
  5. Normally Open (or N/O): when power is off, the switch is on

I read a couple articles before this started making sense to me. This one helped me the most: https://www.instructables.com/id/How-Electronic-Switches-Work-For-Noobs-Relays-and/

My Relay

My Relay had no labels and looked different from most of the tutorials. I figured it out by connecting a couple alligator clips to a 9v battery. After connecting them to the pins on the relay, I listened for the click of the magnetic switch. After that I used my volt meter to determine which pins were Normally-Closed and Normally-Open.

The hardware layout

Relay Setup:

  • I connected my ~5 on the Arduino to one pin on the relay, and 5v on the Arduino to the other pin
  • The Common (middle) lead connects to one terminal on the garage door opener
  • The N/C (Normally Closed) pin connects to the other terminal on the garage door opener

Button Setup:

  • The button setup is like all the other button tutorials
  • I connected ground (GRD) on the Arduino to one end of the button
  • I connected ~9 on the Arduino to the other end of the button
My first time drawing a diagram in fritzing!

The Code

Intended behavior:

  1. When the button is pressed (or LOW) on ~5, I trigger a “button press” using the relay for the garage door opener (it starts)
  2. I then run a delay for a set amount of time
    • the delay allows my code to ignore everything until after the delay has finished

Quick notes:

  • I use the built-in LED on the Arduino to show when it is ignoring button presses (LED_BUILTIN)
  • I write debug messages to the serial. Not a big deal but it makes the code a little more busy looking
/**
 * Ignore button presses after accepting the first, for a set amount of time
 * Jason Jerome
 */

int gDoorPin = 5;
int buttonPin = 9;

String msg = "seconds to wait: ";
int secondsToWait = 20;

void setup()
{
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(gDoorPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);

  digitalWrite(gDoorPin, HIGH);
  Serial.println("Hi - ready");
}

void loop()
{
  if (digitalRead(buttonPin) == LOW)
  {
    Serial.println("button pressed");
    digitalWrite(LED_BUILTIN, HIGH);

    startOpener();

    Serial.println(msg + secondsToWait);
    delay(secondsToWait * 1000);

    Serial.println("done - ready for more");
    digitalWrite(LED_BUILTIN, LOW);
  }
}

void startOpener() {
  Serial.println("gDoor - activating");
  digitalWrite(gDoorPin, LOW);
  delay(500);
  digitalWrite(gDoorPin, HIGH);
}

Here’s a video of it in action:

This has been a fun project so far. I’m very happy to have most of the electronics figured out so early in the process. I can now move on to designing and building the other parts!