Go Down

Topic: Pushbutton-controlled blinking LED (Read 3096 times) previous topic - next topic

rcox

I am new to Arduino programming, and as an excercise in asynchronous digital I/O, I've extended the "Blinking LED without using delay" tutorial example to read input from a button.  I thought it might be helpful to others.

--Randy

/* Pushbutton-controlled blinking LED
* ----------------------------------
*
* Reads a pushbutton to determine the rate at which the LED should
* blink.  If you hold the pushbutton down for x milliseconds, the
* LED will blink on and off every x milliseconds.
*
* Created 25 September 2006
* Randy Cox
*
* This is an extension of one of the tutorial examples from the
* Arduino website (http://www.arduino.cc/en/Main/LearnArduino):
*
* Blinking LED without using delay
* --------------------------------
*
* turns on and off a light emitting diode(LED) connected to a digital  
* pin, without using the delay() function.  this means that other code
* can run at the same time without being interrupted by the LED code.
*
* Created 14 February 2006
* David A. Mellis
* http://arduino.berlios.de
*/

int ledPin = 13;                // LED connected to digital pin 13
int ledValue = LOW;             // previous value of the LED
long ledStartTime = 0;          // will store last time LED was updated
long ledBlinkInterval = 1000;   // interval at which to blink (milliseconds)

int buttonPin = 2;              // an active-high momentary pushbutton on pin 2
int buttonValue = HIGH;         // the current state of the button
long buttonPressTime = 0;       // will store the time that the button was pressed


void setup()
{
 pinMode(ledPin, OUTPUT);      // sets the digital pin as output
}

void loop()
{
 // Check to see if the button is pressed.  If so, mark the time.  When the
 // button is released, calculate how long it was pressed, and make the led
 // blink at the same rate.
 buttonValue = digitalRead(buttonPin);

 // button press
 if (buttonValue==LOW && buttonPressTime==0) {
   buttonPressTime = millis();  // capture the time of the press
 }

 // button release
 if (buttonValue==HIGH && buttonPressTime!=0) {
   ledBlinkInterval = millis() - buttonPressTime;  // set the new flash interval
   buttonPressTime = 0;                            // clear the button press time
 }

 // check to see if it's time to blink the LED; that is, is the difference
 // between the current time and last time we blinked the LED bigger than
 // the interval at which we want to blink the LED.
 if (millis() - ledStartTime > ledBlinkInterval) {
   ledStartTime = millis();   // remember the last time we blinked the LED

   // if the LED is off turn it on and vice-versa.
   if (ledValue == LOW)
     ledValue = HIGH;
   else
     ledValue = LOW;

   digitalWrite(ledPin, ledValue);
 }
}

Go Up