The problem is that it will only go through the POT case once, if you want it to repeatedly read the potentiometer, and then change the LED brightness, you would have to put the case in a loop. So, you might do something like this: case POT: int Mode = digitalRead(BUTTONPIN); while(Mode == LOW) { val = (analogRead(pot) / 4); analogWrite(LED_PIN, val); Serial.println(val); state = OFF; break; Mode = digitalRead(BUTTONPIN); } } If you want to use the debounce, do something like this: static enum { OFF, ON, POT } state; unsigned long now = millis(); int x = 0; while (x == 0) { switch (state) { case OFF: analogWrite(LED_PIN, 255); if (button_press()) { state = ON; } break; case ON: analogWrite(LED_PIN, 0); if (button_press()) { state = POT; } break; case POT: val = (analogRead(pot) / 4); analogWrite(LED_PIN, val); Serial.println(val); if (button_press()) { state = OFF; } break; } } This should work. What it's doing is basically just going through this while loop over and over and over again, and whenever the button is pressed, THEN it will switch state, but otherwise, it'l just do the same state again and again. This way the potentiometer will work AND the debounce.