Button as a Switch doesn't work

What did I do wrong? I hope you can help me.

int kitchen = 6;
int working = 8;
int gaming = 10;
int oldbutton = 0;
int button = 12;
int state = 0;

void setup()
{ 
  pinMode(tv, OUTPUT);
  pinMode(sleeping, OUTPUT);
  pinMode(kitchen, OUTPUT);
  pinMode(working, OUTPUT);
  pinMode(gaming, OUTPUT);
  pinMode(button, INPUT);
  pinMode(12, OUTPUT);
}

void loop()
{ 
  digitalRead(button);
  if(button && !oldbutton) // same as if(button == high && oldbutton == low)
  {
    //we have a new button press
    if(state == 0) // if the state is off, turn it on
    {
      digitalWrite(12, HIGH);
      state = 1;
    }
    else // if the state is on, turn it off
    {
      digitalWrite(12, LOW);
      state = 0; 
    }
    oldbutton = 1;
  }
  else if(!button && oldbutton) // same as if(button == low && oldbutton == high)
  {
    // the button was released
    oldbutton = 0;
  }
  while (state == 1);
  {
    digitalWrite(tv, HIGH);
    digitalWrite(sleeping, HIGH);
    digitalWrite(kitchen, HIGH);
    digitalWrite(working, HIGH);
    digitalWrite(gaming, HIGH);
  }
}

Did it compile?
There are a couple of significant errors that should have generated errors when compiling.

See if you can figure those out, or post the error messages - and we can steer you in the right direction.

p.s. thanks for using code tags !

Usually when we read a pin we assign the state of the pin to a variable. The digitalRead() function.

bool buttonState =  digitalRead(button);

I do it this way (button wired to ground)

/*
The circuit:
   - pushbutton attached to pin 2 from ground
   - the internal pullup on pin 2 is enabled
   - LED attached from pin 13 to ground (or use the built-in LED on most
    Arduino boards)
*/

// this constant won't change:
const byte  buttonPin = 2;    // the pin that the pushbutton is attached to
const byte ledPin = 13;       // the pin that the LED is attached to

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

void setup()
{
   // initialize the button pin as a input:
   pinMode(buttonPin, INPUT_PULLUP);
   // initialize the LED as an output:
   pinMode(ledPin, OUTPUT);
   // initialize serial communication:
   Serial.begin(9600);
}


void loop()
{

   static unsigned long timer = 0;
   unsigned long interval = 20;
   if (millis() - timer >= interval)
   {
      timer = millis();
      
      // 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 == LOW)  // button presssed
         {
            // if the current state is LOW then the button went from off to on:
            buttonPushCounter++;
            Serial.println("on");
            Serial.print("number of button pushes: ");
            Serial.println(buttonPushCounter);
         }
         else // button released
         {
            // if the current state is HIGH then the button went from on to off:
            Serial.println("off");
         }
         // save the current state as the last state, for next time through the loop
         lastButtonState = buttonState;
      }      
   }
}

See state change detect for active low switch.

1 Like

Looks like you haven't posted the complete sketch...

  pinMode(tv, OUTPUT);
  pinMode(sleeping, OUTPUT);

These 2 pins are not defined.

Also as @lastchancename said... you need to assign the result of the pin read to something.

 if(button && !oldbutton)

button = 12.

1 Like

Nothing after this line will ever run if it becomes true, because it is an endless loop.

1 Like

Does this:

  if( 12 && !0 )

After seeing that, I assume there are many other errors in your sketch. Probably, you used guesswork to put it together.

1 Like

?? button is also 12

shouldn't this be INPUT_PULLUP?

value is not captured

button is the pin number, not the value at the input to the pin

is this testing for release

and this for press?

semicolon is the body of while.
but while will never exit once state is == 1 because state will never change

consider

#define MyHW
#ifdef MyHW
const byte butPin = A1;
#else

const byte butPin = 12;
#endif

const byte ledPin = 13;

byte butState;
byte state;

void loop ()
{
    byte but = digitalRead (butPin);

    if (butState != but)    // state change
    {
        butState = but;
        delay (10);         // debounce

        if (LOW == but)     // pressed
            digitalWrite (ledPin, ! digitalRead (ledPin));  // toggle
    }
}

void setup ()
{
    pinMode (ledPin, OUTPUT);
    pinMode (butPin, INPUT_PULLUP);
    butState = digitalRead (butPin);
}

Hi, @knochengolem
Welcome to the forum.

Thanks for using code tags. :+1:

Can you please tell us your electronics, programming, arduino, hardware experience?

You need to explain what went wrong?
What your project is and what is it supposed to do.
What you project did that was the fault.

Thanks... Tom... :smiley: :+1: :coffee: :australia:

1 Like

Hello
You may start with:

  • Button: Use a pushbutton to control an LED.
  • Debounce: Read a pushbutton, filtering noise.

Thank you now it works. :grinning:

Can you please post your working code and explain what you did to solve your problem?
This will help with closure to this thread and may help others.

Thanks.. Tom... :smiley: :+1: :coffee: :australia:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.