Control de 2 Lamparas y un motor usando Switch Case?

Hola! y muy buenas a todos. Primeramente quisiera presentarme,como veran soy nuevo en el foro y no quisiera pasar por alto esto.Soy Josué García, actualmente estoy cursando mis estudios medio-superior con carrera técnica en Sistemas Automáticos, y de igual forma que soy nuevo en este foro se podría decir que soy un nuevo miembro de la gran comunidad que es arduino. Dejando de lado esto quisiera comentarles a ustedes mi problema.

Como proyecto final de penúltimo semestre se me dio la tarea de realizar 3 proyectos que son en base a micro controladores, dicho esto se nos introdujo brevemente a lo que es arduino, pero solamente nos dieron la placa y lo demás corría por nuestra cuenta, y sin ningún conocimiento de programación en C más que mi experiencia programando PICs usando Mstudio o MicroCode, me adentre a esta plataforma y hasta ahora (2 semanas de experiencia) domino lo básico. Ahora según esto el programa es muy sencillo pero por mas que busco no encuentro solución.

Mi programa consiste en lo siguiente: Cuando pulse una vez un boton o pulsador la primera lampara encenderá, cuando lo pulse una siguiente vez, la segunda lampara encenderá y la primera quedara también encendida, finalmente cuando pulse una siguiente vez el motor comenzara a funcionar a la par de que las lamparas anteriores están encendidas. Base a esto cree un codigo pero el gran problema era el rebote del boton el cual no solucione por completo, teniendon que usar algunos delay para evitar el rebote, el rebote se soluciono pero no por completo. Codigo:

int pulse = 0;
int boton = 0;

void setup() 

{
pinMode(2,INPUT);

pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
}

void loop()
{
boton = digitalRead(2);
if (boton == HIGH)

{pulse = pulse + 1;}
delay(120);
if(pulse == 4){pulse = 0;}


switch(pulse)

{
case 0:

digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
break;

case 1:

digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
break;
delay(40);

case 2:

digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
break;
delay(40);

case 3:

digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
break;
}

}

Así que un profesor me dijo y oriento con un diagrama de estados que este rebote se podría solucionar usando 2 casos para cada estado, osea que si el botón estaba en HIGH la primera lampara encendería y soltando el botón este pasaría a LOW y aprovechando la función IF se configuraría para que cuando este en LOW la lampara quede encendida y pulsandolo de nuevo pasaría a HIGH y haciendo uso de lo mismo hacer que la segunda lampara encienda mientras la primera se mantiene encendida, y este es el código:

int boton = 0;
int y = 0;
void setup() 

{
pinMode(2,INPUT);

pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
}

void loop()
{

boton = digitalRead(2);
if(boton == LOW){y = 0;}
switch(boton)

{

case 0:
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
break;
if(boton == HIGH){y = 1;}

case 1:
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
break;
if(boton == LOW){y = 2;}

case 2:
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
break;
if(boton == HIGH){y = 3;}

case 3:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
break;
if(boton == LOW){y = 4;}

case 4:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
break;
if(boton == HIGH){y = 5;}

case 5:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
break;
if(boton == LOW){y = 6;}

case 6:
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
break;
if(boton == HIGH){y = 0;}
}

}

Según yo el código quedaría así, el problema es que el programa inicia con la salida en LOW por lo que el caso 0 se cumple, cuando pulso el botón enciende la primera lampara o Led(porque aun estoy probando Jaja) y con eso se cumple el caso 1, pero si suelto el botón el LED se apaga y no pasa al siguiente caso... Y lo que supongo es que esto es porque previamente definí que LOW seria igual a 0 por eso se me apaga el LED porque si suelto esta en LOW y pasa de nuevo al caso 0, mi gran duda es como podría solucionar esto...porque después de investigar mucho aun no encuentro solución.

Sin más les agradezco su tiempo y su ayuda de antemano, y espero me puedan orientar, de antemano también una disculpa si el problema es sencillo de solucionar, pero como saben soy nuevo en esto. Ahora si les mando un Saludo!:)

Mira a ver si esta técnica simple soluciona el problema del rebote.

int pulse 	= 0;
int boton 	= 0;
int botonAnt 	= 0;

void setup() {
	pinMode(2,INPUT);

	pinMode(3,OUTPUT);
	pinMode(4,OUTPUT);
	pinMode(5,OUTPUT);
}

void loop() {

	boton = digitalRead(2);
	if (boton == HIGH && botonAnt == LOW) {
	    if (pulse++ > 4) 
	       pulse = 0;
	}
	botonAnt = boton;		// prueba a ver si esta simple acción resuelve elproblema del rebote.
					// supongo que tienes una resistencia de 10k entre boton y gnd

	switch (pulse)	{
		case 0:
			digitalWrite(3,LOW);
			digitalWrite(4,LOW);
			digitalWrite(5,LOW);
			break;
		case 1:
			digitalWrite(3,HIGH);
			digitalWrite(4,LOW);
			digitalWrite(5,LOW);
			break;
			// delay(40); FUERA DE LUGAR o esta dentro del case y antes del break o no esta
		case 2:
			digitalWrite(3,HIGH);
			digitalWrite(4,HIGH);
			digitalWrite(5,LOW);
			break;
			// delay(40); FUERA DE LUGAR
		case 3:
			digitalWrite(3,HIGH);
			digitalWrite(4,HIGH);
			digitalWrite(5,HIGH);
			break;
        }
}

surbyte: Mira a ver si esta técnica simple soluciona el problema del rebote.

int pulse     = 0;
int boton   = 0;
int botonAnt    = 0;

void setup() { pinMode(2,INPUT);

pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);

}

void loop() {

boton = digitalRead(2);
if (boton == HIGH && botonAnt == LOW) {
    if (pulse++ > 4) 
       pulse = 0;
}
botonAnt = boton;       // prueba a ver si esta simple acción resuelve elproblema del rebote.
                // supongo que tienes una resistencia de 10k entre boton y gnd

switch (pulse)  {
    case 0:
        digitalWrite(3,LOW);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        break;
    case 1:
        digitalWrite(3,HIGH);
        digitalWrite(4,LOW);
        digitalWrite(5,LOW);
        break;
        // delay(40); FUERA DE LUGAR o esta dentro del case y antes del break o no esta
    case 2:
        digitalWrite(3,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(5,LOW);
        break;
        // delay(40); FUERA DE LUGAR
    case 3:
        digitalWrite(3,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        break;

        } }

Gracias por tu respuesta, pero ya había intentado esa técnica, lo aplique como me lo muestra, tal cual en el código pero incluso tiene mas rebote, que cuando tenia el delay de 120milisegundos, sobre los otros delay si perdón error mio jaja, pero había intentado ponerlos adentro del case y fuera, para probar pero como no cambiaba nada lo deje asi, jaja, y supongo que los if en el segundo codigo también irán dentro del case pero ya lo intente así y nada, veré que puedo hacer, de igual forma Gracias!!

Quizás pueda mejorar agregando una comprobación del tiempo en que demoras entre cada pulsación del botón

int pulse   = 0;
int boton   = 0;
int botonAnt  = 0;
int ultBoton = 0;

void setup() {
  pinMode(2,INPUT);

  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop() {

  boton = digitalRead(2);
  if (boton == HIGH && botonAnt == LOW && millis() - ultBoton > 100) {
      if (pulse++ > 4) 
         pulse = 0;
      ultBoton = millis();
  }
  botonAnt = boton;   // prueba a ver si esta simple acción resuelve elproblema del rebote.
          // supongo que tienes una resistencia de 10k entre boton y gnd

  switch (pulse)  {
    case 0:
      digitalWrite(3,LOW);
      digitalWrite(4,LOW);
      digitalWrite(5,LOW);
      break;
    case 1:
      digitalWrite(3,HIGH);
      digitalWrite(4,LOW);
      digitalWrite(5,LOW);
      break;
      // delay(40); FUERA DE LUGAR o esta dentro del case y antes del break o no esta
    case 2:
      digitalWrite(3,HIGH);
      digitalWrite(4,HIGH);
      digitalWrite(5,LOW);
      break;
      // delay(40); FUERA DE LUGAR
    case 3:
      digitalWrite(3,HIGH);
      digitalWrite(4,HIGH);
      digitalWrite(5,HIGH);
      break;
        }
}

Cambia el valor 100 por un valor que muestre una mejora (en caso que 100 no sea el más adecuado)

if (boton == HIGH && botonAnt == LOW && millis() - ultBoton > 100) {