Pages: [1]   Go Down
Author Topic: Get the push button sense once  (Read 552 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm using the push button with the built in pull-up resistor;

pinMode(b1, INPUT_PULLUP);

and have such a main loop. Whenever I press the push button and hold, the empty string called "pass" takes dozens of "1", as expected smiley
However I want to make it sense the push once until I release it and push again.
By that structure, it is not likely to implement I think.

What would your suggestions be ?

void loop()
{
  if(digitalRead(b1) == LOW)
  {
    pass += "1";
    counter += 1;
  }
}
Logged

Global Moderator
Netherlands
Offline Offline
Shannon Member
*****
Karma: 227
Posts: 14048
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


You must make a variable that holds the state of the button. Only if the state changes there is action

something like this
Code:

int pressed = 0;

void loop()
{
  if (digitalRead(b1) == LOW && pressed == 0)
  {
    pressed = 1;
    pass += "1";
    counter++;
  }
  if (digitalRead(b1) == HIGH && pressed == 1)
  {
    pressed = 0;
  }
}

give it a try
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seems pretty logical but doesn't work.
I've implemented more or less a similar solution but it didn't work either. Strange


You must make a variable that holds the state of the button. Only if the state changes there is action

something like this
Code:

int pressed = 0;

void loop()
{
  if (digitalRead(b1) == LOW && pressed == 0)
  {
    pressed = 1;
    pass += "1";
    counter++;
  }
  if (digitalRead(b1) == HIGH && pressed == 1)
  {
    pressed = 0;
  }
}

give it a try

Logged

East Anglia (UK)
Offline Offline
Faraday Member
**
Karma: 118
Posts: 4405
May all of your blinks be without delay()
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

This code does what I would expect
Code:
String pass;
int counter =0;
int pressed = 0;
int b1 = 3;

void setup()
{
  pinMode(b1, INPUT_PULLUP);
  Serial.begin(9600);
}
void loop()
{
  if (digitalRead(b1) == LOW && pressed == 0)
  {
    pressed = 1;
    pass += "1";
    counter++;
    Serial.println(pass);
  }
  if (digitalRead(b1) == HIGH && pressed == 1)
  {
    pressed = 0;
  }
}
Sample output of 4 button presses
Code:
1
11
111
1111
NOTE - no debounce implemented but the button action seems relatively snappy so not a problem
Logged

Please do not send me PMs asking for help.  Post in the forum then everyone will benefit from seeing the questions and answers.

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1
11
111

at 1 press. Very snappy :/
What can I do ?
Logged

East Anglia (UK)
Offline Offline
Faraday Member
**
Karma: 118
Posts: 4405
May all of your blinks be without delay()
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Debounce the button by the look of it.
Logged

Please do not send me PMs asking for help.  Post in the forum then everyone will benefit from seeing the questions and answers.

Queens, New York
Offline Offline
Faraday Member
**
Karma: 108
Posts: 3785
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

And maybe look for a button state change.
Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Pages: [1]   Go Up
Jump to: