0% found this document useful (0 votes)
12 views

Arduino Buttons Notes 2up

This document discusses using buttons as inputs for an Arduino project involving controlling a fan. It describes different types of buttons, including momentary push buttons that are normally open or normally closed. Circuit diagrams are provided showing how to connect buttons to an Arduino with pull-up or pull-down resistors. Example Arduino programs are outlined for continuously monitoring button state, waiting for button input, and using an interrupt handler. Measurements are also taken to understand how buttons work as open and closed circuits.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
12 views

Arduino Buttons Notes 2up

This document discusses using buttons as inputs for an Arduino project involving controlling a fan. It describes different types of buttons, including momentary push buttons that are normally open or normally closed. Circuit diagrams are provided showing how to connect buttons to an Arduino with pull-up or pull-down resistors. Example Arduino programs are outlined for continuously monitoring button state, waiting for button input, and using an interrupt handler. Measurements are also taken to understand how buttons work as open and closed circuits.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 11

10/25/12

Button Input:
On/off state change

Living with the Lab

Gerald Recktenwald

Portland State University

[email protected]

User input features of the fan


•  Potentiometer for speed control



❖  Continually variable input makes sense for speed control

❖  Previously discussed

•  Start/stop

❖  Could use a conventional power switch

❖  Push button (momentary) switch

•  Lock or limit rotation angle

❖  Button click to hold/release fan in one position

❖  Potentiometer to set range limit

LWTL: Button Input


2

1

10/25/12

Conventional on/off switch


Basic light switch or rocker switch



❖  Makes or breaks connection to power

❖  Switch stays in position: On or Off

❖  Toggle position indicates the state

❖  NOT in the Arduino Inventors Kit

Image from sparkfun.com


Image from lowes.com

LWTL: Button Input


3

How  does  a  bu+on  work?  

•  Simple  switch  schema8c  


•  Use  DMM  to  measure  open/closed  circuit  
•  Map  the  pin  states  

LWTL: Button Input


2

10/25/12

Measure  Open  and  Closed  Circuits  

Measured  Resistance  (Ω)  


Connect   When  not  
Pins   pressed   When  pressed  
1  and  2  

1  and  3  

1  and  4  

2  and  3  

LWTL: Button Input


Measure  Open  and  Closed  Circuits  

Data  from  Measurements:   Sketch  Connec8ons:  


Measured  Resistance  (Ω)  
Connect   When  not  
Pins   pressed   When  pressed  
1  and  2  

1  and  3  

1  and  4  

2  and  3  

LWTL: Button Input


3

10/25/12

Push  Bu+on  Switches  

•  A  momentary  bu+on  is  a   Biased  Switch  


•  Pushing  the  bu+on  changes  state  
•  State  is  reversed  (return  to  biased  posi8on)  when  bu+on  is  
released  
•  Two  types  
•  NO:  normally  open  
•  NC:  normally  closed  

Normally Open Normally Closed

LWTL: Button Input


Momentary or push-button switches


•  Normally open

❖  electrical contact is made when button is pressed

•  Normally closed

❖  electrical contact is broken when button is pressed

•  Internal spring returns button to its un-pressed state

Open Closed Image from sparkfun.com


LWTL: Button Input


8

4

10/25/12

Putting buttons into action


1.  Build the circuit: same one is used for all examples

a.  Test with LED on/off

b.  LED is only controlled by the button, not by Arduino code

2.  Create a wait to start button

a.  Simplest button implementation

b.  Execution is blocked while waiting for a button click

3.  Use an interrupt handler

a.  Most sophisticated: Don t block execution while waiting for
button input

b.  Most sophisticated: Requires good understanding of coding

c.  Requires de-bouncing

d.  Not too hard to use as a black box

LWTL: Button Input


9

Momentary Button and LED Circuit


Digital input with a pull-down resistor


5V
❖  When switch is open (button not pressed):

‣  Digital input pin is tied to ground
LED
‣  No current flows, so there is no voltage
difference from input pin to ground
Push-button
‣  Reading on digital input is LOW
switch

❖  When switch is closed (button is pressed):



‣  Current flows from 5V to ground, causing Digital
LED to light up.
330 Ω
input pin
‣  The 10k resistor limits the current draw by 10 kΩ
the input pin.

‣  The 330Ω resistor causes a large voltage
drop between 5V and ground, which causes
the digital input pin to be closer to 5V.

‣  Reading on digital input is HIGH

LWTL: Button Input


10

5

10/25/12

Technical Note

Usually we do not include an LED directly in the button


circuit. The following diagrams show plan button circuits with
pull-up and pull-down resistors. In these applications, the pull-
up or pull-down resistors should be 10k. Refer to Lady Ada
Tutorial #5:

❖  http://www.ladyada.net/learn/arduino/lesson5.html

5V 5V

Pull-up
LED
10 kΩ
resistor:
Push-button
330 Ω switch
Digital
input pin Pull-down

resistor:
330 Ω Digital
Push-button input pin
switch 10 kΩ

LWTL: Button Input


11

Programs for the LED/Button Circuit


1.  Continuous monitor of button state



❖  Program is completely occupied by monitoring the button

❖  Used as a demonstration — not practically useful

2.  Wait for button input



3.  Interrupt Handler

4.  All three programs use the same electrical circuit

LWTL: Button Input


12

6

10/25/12

Continuous monitor of button state


int button_pin = 4; // pin used to read the button!


!
void setup() {!
pinMode( button_pin, INPUT);!
Serial.begin(9600); // Button state is sent to host!
}!
!
void loop() {!
int button;!
button = digitalRead( button_pin );!
!
if ( button == HIGH ) {!
Serial.println("on");! Serial monitor shows a
} else {!
Serial.println("off");! continuous stream of
}! on or off

}!

This program does not control the LED



LWTL: Button Input
13

Programs for the LED/Button Circuit


1.  Continuous monitor of button state



❖  Program is completely occupied by monitoring the button

❖  Used as a demonstration — not practically useful

2.  Wait for button input



❖  Blocks execution while waiting

❖  May be useful as a start button

3.  Interrupt Handler



4.  All three programs use the same electrical circuit

LWTL: Button Input


14

7

10/25/12

Wait for button input



int button_pin = 4; // pin used to read the button!
!
void setup() {!
int start_click = LOW; // Initial state: no click yet!
pinMode( button_pin, INPUT);!

!
Serial.begin(9600);! while loop continues
while ( !start_click ) {! as long as start_click
start_click = digitalRead( button_pin );! is FALSE

Serial.println("Waiting for button press");!
}!
}!
!
void loop() {! Same loop() function as
int button;! in the preceding sketch

!
button = digitalRead( button_pin );!
if ( button == HIGH ) {!
Serial.println("on");!
} else {!
Serial.println("off");!
}!
}!

LWTL: Button Input


15

Programs for the LED/Button Circuit


1.  Continuous monitor of button state



❖  Program is completely occupied by monitoring the button

❖  Used as a demonstration — not practically useful

2.  Wait for button input



❖  Blocks execution while waiting

❖  May be useful as a start button

3.  Interrupt Handler



❖  Most versatile

❖  Does not block execution

❖  Interrupt is used to change a flag that indicates state

❖  Regular code in loop function checks the sate of the flag

4.  All three programs use the same electrical circuit



LWTL: Button Input
16

8

10/25/12

Interrupt handler for button input



int button_interrupt = 0; // Interrupt 0 is on pin 2 !!!
int toggle_on = false; // Button click switches state!
!
void setup() {!
Serial.begin(9600);!
attachInterrupt( button_interrupt, handle_click, RISING); // Register handler!
}!
!
void loop() {!
if ( toggle_on ) {!
Serial.println("on");!
} else {!
Serial.println("off");!
}!
}!
!
void handle_click() {!
!
static unsigned long last_interrupt_time = 0; // Zero only at start!
unsigned long interrupt_time = millis(); // Read the clock!
!
if ( interrupt_time - last_interrupt_time > 200 ) { // Ignore when < 200 msec!
toggle_on = !toggle_on;!
}!
!
last_interrupt_time = interrupt_time;!
}!

LWTL: Button Input


17

Interrupt handler for button input



int button_interrupt = 0; // Interrupt 0 is on pin 2 !!!
int toggle_on = false; // Button click switches state!
!
void setup() {! Interrupt handler must be registered when program starts

Serial.begin(9600);!
attachInterrupt( button_interrupt, handle_click, RISING); // Register handler!
}!
button_interrupt
! is the ID or number
void loop() {!
of the interrupt. It must be 0 or 1
A RISING interrupt occurs when the
if ( toggle_on ) {!
pin changes from LOW to HIGH

Serial.println("on");!
} else {!
Serial.println("off");!
}! The interrupt handler, handle_click, is
}! a user-written function that is called
!
void handle_click() {!
when an interrupt is detected

!
static unsigned long last_interrupt_time = 0; // Zero only at start!
unsigned long interrupt_time = millis(); // Read the clock!
!
if ( interrupt_time - last_interrupt_time > 200 ) { // Ignore when < 200 msec!
toggle_on = !toggle_on;!
}!
!
last_interrupt_time = interrupt_time;!
}!

LWTL: Button Input


18

9

10/25/12

Interrupt handler for button input



int button_interrupt = 0; // Interrupt 0 is on pin 2 !!!
int toggle_on = false; // Button click switches state!
!
void setup() {! toggle_on is a global variable that remembers the
Serial.begin(9600);! state . It is either true or false (1 or 0).

attachInterrupt( button_interrupt, handle_click, RISING); // Register handler!
}!
!
void loop() {!
if ( toggle_on ) {!
Serial.println("on");! The loop() function only checks the state
} else {! of toggle_on. The value of toggle_on is set
Serial.println("off");!
}! in the interrupt handler, handle_click.

}!
!
void handle_click() {!
!
static unsigned long last_interrupt_time = 0; // Zero only at start!
unsigned long interrupt_time = millis(); // Read the clock!
!
if ( interrupt_time - last_interrupt_time > 200 ) { // Ignore when < 200 msec!
toggle_on = !toggle_on;!
}! The value of toggle_on is flipped only
! when a true interrupt even occurs. De-
last_interrupt_time = interrupt_time;!
}!
bouncing is described in the next slide.

LWTL: Button Input


19

Interrupt handler for button input



int button_interrupt = 0; // Interrupt 0 is on pin 2 !!!
int toggle_on = false; // Button click switches state!
!
void setup() {!
Serial.begin(9600);!
attachInterrupt( button_interrupt, handle_click, RISING); // Register handler!
}!
!
void loop() {! Value of a static variable is always retained

if ( toggle_on ) {!
Serial.println("on");! Use long: the time value in
} else {! milliseconds can become large

Serial.println("off");!
}!
}! Clock time when current interrupt occurs

!
void handle_click() {! Ignore events that occur in less than
! 200 msec from each other. These are
static unsigned long last_interrupt_time = 0; // Zero only at start !
unsigned long interrupt_time = millis();
likely to be mechanical bounces.

// Read the clock!
!
if ( interrupt_time - last_interrupt_time > 200 ) { // Ignore when < 200 msec!
toggle_on = !toggle_on;!
}!
!
last_interrupt_time = interrupt_time;! Save current time as the new last time

}!

LWTL: Button Input


20

10

10/25/12

Other references

Ladyada tutorial

❖  Excellent and detailed

❖  http://www.ladyada.net/learn/arduino/lesson5.html

Arduino reference

❖  Minimal explanation

‣  http://www.arduino.cc/en/Tutorial/Button

❖  Using interrupts

‣  http://www.uchobby.com/index.php/2007/11/24/arduino-interrupts/

‣  http://www.arduino.cc/en/Reference/AttachInterrupt

LWTL: Button Input


21

11

You might also like