Switch Case e instrucciones complejas

Muy buenas a todos, la razón por la cual hago este post es para pedir su ayuda pues he tenido unos cuantos problemas en cuanto a la ejecución de instrucciones complejas dentro del case ya que dentro de los ejemplos que he visto siempre se dan instrucciones básicas en el case y no me queda claro si es posible realizar trabajos complejos con esta estructura.

Aquí esta el código que estoy tratando de armar.

const int bt = 7;
const int ma = 8;
int estadoanterior = 0;
int estadoactual;
boolean estadoanterior_bt = HIGH;
boolean estadoactual_bt = LOW;
unsigned long currentm, tiempo;
const long pulsado = 500;
int suma;

void setup()
{
  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
}

void loop(){
  
  estadoactual = digitalRead(bt);
  estadoanterior_bt = HIGH;
  estadoactual_bt = LOW;
  suma=estadoactual+estadoanterior_bt+estadoactual_bt;
  switch(suma){
    case 1: digitalWrite(ma,LOW);
    break;
    case 2: if(estadoactual == HIGH){
    digitalWrite(ma,HIGH);
    if (estadoactual_bt != estadoanterior_bt){
      estadoanterior_bt = LOW;
      currentm = millis();
    }
    
    tiempo = millis();
    if( (tiempo - currentm) >= pulsado ){
      digitalWrite(ma, LOW);
    }
    }
  break;
  case 0: if(estadoactual == LOW){
  digitalWrite(ma,HIGH);
    if (estadoactual_bt != estadoanterior_bt){
      estadoanterior_bt = HIGH;
      currentm = millis();
    }
    
    tiempo = millis();
    if( (tiempo - currentm) >= pulsado ){
      digitalWrite(ma, LOW);
    }
  }
    break;
    }
}

Mi principal problema es que no se ejecutan las líneas que están por debajo del punto y coma, ¿como puedo hacer que deje de suceder esto? o siquiera ¿es posible usar esta estructura de esta forma?

Me gustaría agradecer de ante mano su ayuda y tiempo.

No entiendo que quieres hacer?

Tienes un gran caos en tu programación:
1ro. defines esto como globales y esta bien.

boolean estadoanterior_bt = HIGH;
boolean estadoactual_bt = LOW;

pero luego a cada paso del loop fijas los valores a

estadoanterior_bt = HIGH;
  estadoactual_bt = LOW;

Asi que no hay modo que eso avance y cuando consultas por suma resulta que estos dos valores siempre daran 1 + el valor de estadoactual sea 0 o 1, de modo que tus unicos posibles pasos serán 1 y 2 pero jamás 0.

Asi que analiza esa parte para continuar.
Luego intenta ser mas ordenado y usar el indentado de este modo, mira tu mismo programa ordenado

const int bt = 7;
const int ma = 8;

int estadoanterior = 0;
int estadoactual;
boolean estadoanterior_bt = HIGH;
boolean estadoactual_bt = LOW;
unsigned long currentm, tiempo;
const long pulsado = 500;
int suma;

void setup()
{
  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
}

void loop(){
 
  estadoactual      = digitalRead(bt);
  estadoanterior_bt = HIGH;
  estadoactual_bt   = LOW;
  suma = estadoactual + estadoanterior_bt + estadoactual_bt;

  switch(suma){
    case 0: if (estadoactual == LOW){
                digitalWrite(ma,HIGH);
                if (estadoactual_bt != estadoanterior_bt){
                  estadoanterior_bt = HIGH;
                  currentm = millis();
                }
                tiempo = millis();
                if( (tiempo - currentm) >= pulsado ){
                  digitalWrite(ma, LOW);
                }
            }
            break;

    case 1: digitalWrite(ma,LOW);
            break;

    case 2: if (estadoactual == HIGH){
                digitalWrite(ma,HIGH);
                if (estadoactual_bt != estadoanterior_bt){
                    estadoanterior_bt = LOW;
                    currentm = millis();
                }
                
                tiempo = millis();
                if (tiempo - currentm >= pulsado ){
                    digitalWrite(ma, LOW);
                }
            }
            break;
    }
}

Muchas gracias por tu ayuda y perdona por no explicar lo que trato de hacer.

Bueno el contexto es este: tengo un botón el cual quiero que realice tres acciones.

  1. Estar en estado de espera, o sea dejar en LOW el pin receptor ma
  2. Al presionarse este botón (siempre de forma sostenida) se pondrá en HIGH el pin receptor y tras el tiempo de pulsado (500 millis) regresar el pin receptor a un estado LOW. Todo esto mientras el botón sigue presionado.
  3. Se deja de presionar el botón y se realiza lo mismo que en el punto anterior cambiando el estado del pin receptor de igual forma tras 500 millis.

Por eso puse dentro del caso 0 el ultimo punto, ya que para ese momento en teoría al menos como yo entendí todas las variables de la suma se encontrarían en cero y así en cuanto termine el código dentro del caso 0 la suma vuelva a dar 1 y continuar así el bucle.

Ahora mi problema es que como me has dicho, la suma jamás me da como resultado 0, no se si sea porque tengo mal mi planteamiento y entendimiento del código o porque no se ejecutan por completo las instrucciones que están entro del case 2. Por lo que veo la primer opción es la correcta y me gustaría pedirte consejo para corregir esto y hacer que funcione de forma correcta.

Escribiendo un programa que haca algo similar y lo aplicas a tu manera.

un receptor no se puede dejar el LOW o HIGH porque eso depende de la señal que recibas y no del pin receptor (el pin receptor lee lo que tiene).
Lo que supongo que quieres hacer con LOW en el pin receptor es que ignore cualquier señal de ese pin y lo harías asi.

if(lee_pin == 1){
    Estado_pin = digitalRead(Receptor_pin);
}else{
    Estado_pin = 0;
}

y cambias en el programa si quieres leer el pin o no y else se asegura de dejar el estado_pin en LOW pero el pin sigue recibiendo lo que venga, solo que tu programa lo ignora (lo dejas en visto como en whatsapp jajaja).

ahora siguiendo con la estructura del programa.

Según veo que tienes 3 estados que dependen de dos factores.
No se si un switch puede hacer algo asi y eso me lo puede responder surbyte

swith(var_1,var_2){
  case(2,5):
  break;
  case(2,6);
  break;
}

Analizaras desde que presionas el pulsador hasta que se deja de presionar
y según el tiempo que pase entre acción de pulsado durante el pulsado y finalizacion de pulsado tu harás una cosa u otra.

Ahora tratare de escribir un ejemplo de algo parecido.

int Pin_Receptor = 13;
int Pulsador_pin = 12;
int lee_pin = 0;
bool Estado_pin = 0;
bool estado_ = 0;
int estado_Pulsador = 0;
uint32_t Tiempo;
void MiFuncion(){
	estado_Pulsador = digitalRead(Pulsador_pin);
	if(digitalRead(Pulsador_pin) == 0){
		estado_Pulsador == 0;
		estado_ = 0;
		Estado_pin = 0;
	}
	//Actua en consecuencia del estado del pin y del tiempo segun lo planificado
	if(Pulsador_pin && estado_Pulsador == 0){
		estado_Pulsador = 1;//con esto garantizo que no entre aqui si el pulsador sigue pulsado
		Tiempo = millis() + 500;
		estado_ = 0;
		Estado_pin = 0;
		//en este momento estas en LOW 
	}else
	if(tiempo > millis() && estado_led == 0 && estado_Pulsador == 1){
		Tiempo = millis() + 500;
		//Ya paso 500 milisegundos y el pulsador sigue pulsado
		///Accion
		//High pin receptor
		Estado_pin = 1;
		estado_ = 1;
	}else
	if(tiempo > millis() && estado_led == 1 && estado_Pulsador == 1){
		Tiempo = millis() + 500;
		//Ya paso 500 milisegundos desde que se puso High el receptor y el pulsador sigue pulsado
		///Accion
		//Low pin receptor
		estado_ = 0;
		Estado_pin = 1;
	}
	//Si nesecitas ejecural algun codigo mientras esra en un estado en particular
	switch(estado_led){
		case 0:
			
		break;
		case 1:
			
		break;
		case 2:
			
		break;
	}
	if(lee_pin == 1){
	    Estado_pin = digitalRead(Receptor_pin);
	}else{
	    Estado_pin = 0;
	}
}

Eso si puede estar confuso, Paciencia y entenderás.

Mi código puede ser mejor escrito. También lo admito.