User Tools

Site Tools


arduino:arduino_crash_course:basic_interaction

This is an old revision of the document!


Basic Interaction

Polling versus interrupts

There are two common techniques used to make a microcontroller (like the Arduino) respond to changes in its inputs. One is polling, the other is interrupts.

In a polling setup, the mircocontoller explicitly examines all its input sources during its main loop to see what state each input is in, and then it responds accordingly.

In an interrupt scheme, the microcontroller does essentially nothing in its main loop, but it is directed to do something specific when an input source jostles it into action.

Of the two, polling is probably easier to get started with. Following is a simple example of using polling.

Switch-controlled LED

The following examples use polling to determine the state of a switch. If the switch is pressed, Arduino will turn an LED on. If it is not pressed, it will turn the LED off.

Using external pulldown resistors

The following example requires pulldown resistors on the input switch.

LightSwitch.ino
/*
 LightSwitch
 Turn an LED on and off.
 Requires pulldown resistor on input.
 */
 
int pushButtonPin = 2;  // connect the push button to digital pin 2
int ledPin = 13;        // connect the LED to pin 13
 
void setup() {
  pinMode(pushButtonPin, INPUT);  // make the pushbutton's pin an input
  pinMode(ledPin, OUTPUT);        // make LED's pin an output
}
 
void loop() {
  int buttonState = digitalRead(pushButtonPin);  // read the input pin
 
    // set LED state accordingly
  if (buttonState == HIGH)       // if the button is pushed
    digitalWrite(ledPin, HIGH);  // turn the LED on
  else                           // otherwise
    digitalWrite(ledPin, LOW);   // turn the LED off
 
  //delay(1);        // delay in between reads for stability (?)
}

Notice the use of an if-else statement. The if-else statement is an example of flow control.

A more compact version of the above that eliminates the if-else statement:

LightSwitch2.ino
/*
 LightSwitch2
 Turn an LED on and off.
 Requires pulldown resistor on input.
 */
 
int pushButtonPin = 2;  // connect the push button to digital pin 2
int ledPin = 13;        // connect the LED to pin 13
 
void setup() {
  pinMode(pushButtonPin, INPUT);  // make the pushbutton's pin an input
  pinMode(ledPin, OUTPUT);        // make LED's pin an output
}
 
void loop() {
  int buttonState = digitalRead(pushButtonPin);  // read the input pin
  digitalWrite(ledPin, buttonState);             // turn the LED on or off
  //delay(1);        // delay in between reads for stability (?)
}

And an even more compact version:

LightSwitch3.ino
/*
 LightSwitch3
 Turn an LED on and off.
 Requires pulldown resistor on input.
 */
 
int pushButtonPin = 2;  // connect the push button to digital pin 2
int ledPin = 13;        // connect the LED to pin 13
 
void setup() {
  pinMode(pushButtonPin, INPUT);  // make the pushbutton's pin an input
  pinMode(ledPin, OUTPUT);        // make LED's pin an output
}
 
void loop() {
  digitalWrite(ledPin, digitalRead(pushButtonPin));  // read the input pin and turn the LED on or off
  //delay(1);        // delay in between reads for stability (?)
}

Using internal pullups

Using extenal resistors as part of switch state detection is so common that the microchip that is at the heart of the Arduino has built-in pullup resistors that can be turned on manually. Internal pullup resistors can be enabled with:

digitalWrite(pushButtonPin, HIGH);  // turn on pullup resistors

Here are the first two versions above but modified to use internal pullup resistors.

LightSwitchPullup.ino
/*
 LightSwitchPullup
 Turn an LED on and off.
 Internal pullup version.
 */
 
int pushButtonPin = 2;  // connect the push button to digital pin 2
int ledPin = 13;        // connect the LED to pin 13
 
void setup() {
  pinMode(pushButtonPin, INPUT);      // make the pushbutton's pin an input
  digitalWrite(pushButtonPin, HIGH);  // turn on internal pullup resistors
  pinMode(ledPin, OUTPUT);            // make LED's pin an output
}
 
void loop() {
  int buttonState = digitalRead(pushButtonPin);  // read the input pin
 
  // set LED state accordingly
  // note the inverted logic
  if (buttonState == LOW)        // if the button is pushed
    digitalWrite(ledPin, HIGH);  // turn the LED on
  else                           // otherwise
    digitalWrite(ledPin, LOW);   // turn the LED off
}
LightSwitchPullup2.ino
/*
 LightSwitchPullup2
 Turn an LED on and off.
 Internal pullup version.
 */
 
int pushButtonPin = 2;  // connect the push button to digital pin 2
int ledPin = 13;        // connect the LED to pin 13
 
void setup() {
  pinMode(pushButtonPin, INPUT);  // make the pushbutton's pin an input
  digitalWrite(pushButtonPin, HIGH);  // turn on internal pullup resistors
  pinMode(ledPin, OUTPUT);        // make LED's pin an output
}
 
void loop() {
  int buttonState = !digitalRead(pushButtonPin);  // read the input pin
  digitalWrite(ledPin, buttonState);              // turn the LED on or off
}
arduino/arduino_crash_course/basic_interaction.1351976837.txt.gz · Last modified: 2012/11/03 21:07 by mithat

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki