Maker Pro
Maker Pro

Arduino momentary input to turn on consecutive outputs

Tom Núñez

Apr 16, 2016
4
Joined
Apr 16, 2016
Messages
4
Hi guys,

I would like some help writing a code for Arduino. Here is what I want to do:

When a momentary input is detected, an output (LED) is turned on and stays on. When a 2nd input pulse is detected (from the same input pin), the next output goes high (while the first output still stays high).

So: 1st pulse = 1 LED on, 2nd pulse = 2 LEDs on, 3rd pulse = 3 LEDs on, 4th pulse = 4LEDs on. (All input pulses from the same input pin)

Would be very grateful for any suggestions!

Tom
 

(*steve*)

¡sǝpodᴉʇuɐ ǝɥʇ ɹɐǝɥd
Moderator
Jan 21, 2010
25,510
Joined
Jan 21, 2010
Messages
25,510
0) You need to initialize everything (set pins as inputs or outputs, set output states, etc.)

1) Check how switches are connected to digital inputs. Typically you have a resistor to one supply rail and the switch connected to the other (google "arduino switch input schematic"). Pressing the switch changes the state from high to low (or vice versa) and releasing it returns it to the original state.

2) You will need to debounce the switch (google "debounce switch arduino input"). There are also some examples we've worked through on this site. The basic trick is that you ignore any change in state of the switch unless it has been prolonged (e.g. for more than 1/20th of a second).

3) You need to keep a "current state" (this might be the number of LEDs that should be turned on). Whenever you detect an actual keypress you change the state. When the state changes you update the output states.

This is a trivial program, but for something more complex you might look at state-transition diagrams to model the behaviour and as a methodology for designing the program.

Here is a massive thread that deals with all sorts of stuff that's more complex but boils down to the same thing.
 

Tom Núñez

Apr 16, 2016
4
Joined
Apr 16, 2016
Messages
4
Have written this:

// this constant won't change:
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 13;
const int ledPin2 = 12;
const int ledPin3 = 7;
const int ledPin4 = 4;

; // the pin that the LED is attached to

// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button

int current; // Current state of the button
// (LOW is pressed b/c i'm using the pullup resistors)
long millis_held; // How long the button was held (milliseconds)
long secs_held; // How long the button was held (seconds)
long prev_secs_held; // How long the button was held in the previous check
byte previous = HIGH;
unsigned long firstTime; // how long since the button was first pressed

void setup() {
// initialize the button pin as a input:
pinMode(buttonPin, INPUT);
// initialize the LED as an output:
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);

// initialize serial communication:
Serial.begin(9600);
}


void loop() {
// read the pushbutton input pin:
buttonState = digitalRead(buttonPin);

// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH);

// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;
Serial.println("on");
Serial.print("number of button pushes: ");
Serial.println(buttonPushCounter);
} else
// if the current state is LOW then the button
// wend from on to off:
Serial.println("off");

// Delay a little bit to avoid bouncing
delay(50);
}



// turns on the LED every four button pushes by
// checking the modulo of the button push counter.
// the modulo function gives you the remainder of
// the division of two numbers:
if (buttonPushCounter >0) {
digitalWrite(ledPin, HIGH);
if (buttonPushCounter >1)
digitalWrite(ledPin2, HIGH);
if (buttonPushCounter >2)
digitalWrite(ledPin3, HIGH);
if (buttonPushCounter >3)
digitalWrite(ledPin4, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
delay(500);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
delay(500);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
delay(500);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
delay(500);
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);

}
if (buttonPushCounter == 4) (buttonPushCounter = 0);

}

// END OF CODE

I had it working this morning but I was modifying it and accidentally changed something, now it doesn't work..
I'm sure it's improper use of '{' or '}'..

I'd be very grateful for someone to de-bug this :S Also, I'm not sure how to add the debounce to this - whenever I try to do so I get errors..

Tom
 

Amar Dhore

Dec 2, 2015
129
Joined
Dec 2, 2015
Messages
129
You should be saving lastButtonState


if(buttonState != lastButtonState)
lastButtonState = buttonState //try this line
 

NorthGuy

Mar 24, 2016
53
Joined
Mar 24, 2016
Messages
53
I didn't look through all your code (hard to follow with the lost indentations), but you need to be careful with things like that:

Code:
if (buttonState == HIGH);

// if the current state is HIGH then the button
// wend from off to on:
buttonPushCounter++;

Here the semicolon after "if" terminates the statement, so whatever follows is a separate stetement (which always executes). Because of the semicolon, the "if" has absolutely no effect. You need to remove this semicolon.
 

DatLe

May 31, 2016
15
Joined
May 31, 2016
Messages
15
Can you try on this code.
1. Detect when button is press, and set buttonIsPressed=true;
2. Check when its pressed and do this:
if(buttonIsPressed)
{
buttonIsPressed=false;
if(step==0)
{
LED1_On();
step++;
}
else if(step==1)
{
LED2_On();
step++;
}
else if(.... so on)...
}
 
Top