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

User Input Features of The Fan: - Potentiometer For Speed Control

The document describes different options for user input features on a fan, including a potentiometer for speed control and buttons for start/stop and locking the fan rotation angle. It then discusses using buttons as input for an Arduino, including normally open and normally closed push buttons, and how to measure and interpret the open and closed circuits of a button. Finally, it presents three programs to handle button input with an Arduino: continuously monitoring the button state, waiting for button input, and using an interrupt handler.
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
64 views

User Input Features of The Fan: - Potentiometer For Speed Control

The document describes different options for user input features on a fan, including a potentiometer for speed control and buttons for start/stop and locking the fan rotation angle. It then discusses using buttons as input for an Arduino, including normally open and normally closed push buttons, and how to measure and interpret the open and closed circuits of a button. Finally, it presents three programs to handle button input with an Arduino: continuously monitoring the button state, waiting for button input, and using an interrupt handler.
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 19

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 1


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 2


How does a button work?

• Simple switch schematic


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

LWTL: Button Input


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 Connections:


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

1 and 3

1 and 4

2 and 3

LWTL: Button Input


Push Button Switches

• A momentary button is a “Biased Switch”


• Pushing the button changes state
• State is reversed (return to biased position) when button is
released
• Two types
• NO: normally open
• NC: 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

Image from sparkfun.com

LWTL: Button Input 7


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 8


Momentary Button and LED Circuit

Digital input with a pull-down


resistor
❖ When switch is open (button not
pressed):
‣ Digital input pin is tied to ground
‣ No current flows, so there is no voltage
difference from input pin to ground
‣ Reading on digital input is LOW
❖ When switch is closed (button is
pressed):
‣ Current flows from 5V to ground, causing
LED to light up.
‣ The 10k resistor limits the current draw by
the input pin.
‣ The 330Ω resistor causes a large voltage
drop between 5V and ground, which
LWTL: Button Input causes the digital input pin to be closer to 9
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

Pull-up
resistor:
Pull-down
resistor:

LWTL: Button Input 10


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 11


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
} else {
Serial.println("off"); a continuous stream
} of “on” or “off”
}

This program does not control the LED


LWTL: Button Input 12
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 13


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 as long
while ( !start_click ) {
start_click = digitalRead( button_pin ); as start_click is
Serial.println("Waiting for button press"); FALSE
}
}
Same loop() function
void loop() {
int button;
as in the preceding
sketch
button = digitalRead( button_pin );
if ( button == HIGH ) {
Serial.println("on");
} else {
Serial.println("off");
}
}

LWTL: Button Input 14


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 15
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 16


Interrupt handler for button input
int button_interrupt = 0; // Interrupt 0 is on pin 2 !!
int toggle_on = false; // Button click switches state
Interrupt handler must be registered when program
void setup() { starts
Serial.begin(9600);
attachInterrupt( button_interrupt, handle_click, RISING); // Register handler
}
button_interrupt is the ID or
number of loop()
void the interrupt.
{ It must be A RISING interrupt occurs when the
0 or 1 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 when an
void handle_click() { 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 17


Interrupt handler for button input
int button_interrupt = 0; // Interrupt 0 is on pin 2 !!
int toggle_on = false; // Button click switches state
toggle_on is a global variable that
void setup() { remembers the “state”. It is either true or
Serial.begin(9600);
attachInterrupt( button_interrupt, handle_click,false (1 or 0).
RISING); // Register handler
}

void loop() {
if ( toggle_on ) { The loop() function only checks the
Serial.println("on");
} else { state of toggle_on. The value of
Serial.println("off"); toggle_on is set 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 18


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
}
Value of a static variable is always
void loop() { retained
if ( toggle_on ) { Use long: the time value in
Serial.println("on");
} else { milliseconds can become
Serial.println("off"); large
} Clock time when current interrupt
}
occurs
void handle_click() { Ignore events that occur in less than
200 msec from each other. These
static unsigned long last_interrupt_time = 0; // Zero only at start
unsigned long interrupt_time = millis(); are likely
// Readtothe
be clock
mechanical bounces.

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 19

You might also like