Control de motor AC por pulsos con final de carrera desde app

Hola a todos:

Es mi primera vez que publico un post en este forum de antemano disculpas si de pronto no me haga entender o algún error de redacción.

Estoy realizando un control de velocidad para un motor AC desde una App hecha en MIT App Inventor, los comandos enviados desde la app son simples, que cuando pulse el botón me envíe un comando para poner andar el motor de acuerdo a la velocidad que le he dado desde la misma app y cuando lo suelte envíe otro comando para poner en LOW el pin analógico donde me regula la velocidad es como si apagara el motor.

Un saludo!

Codigo:

void setup() {
Serial.begin(38400);  
pinMode(led_Q10,OUTPUT);
digitalWrite(led_Q10,LOW);

pinMode(variar_freccarro_Q8,OUTPUT);

pinMode(finalccarro_I1,INPUT);
}

void loop(){
  if( Serial.available()){ 
     dato = Serial.read();                                    // leer el dato recibido
     }                         
fccarro = digitalRead(finalccarro_I1); 
Motores();
Finales_de_carrera();
}

void Motores(){
                                          
 if(contcarro == 0){ 
  if (dato == 'c'){                 // boton variador norte presionar
         Serial.println("y");      //enciende led movimiento
          delay(300);
          contcarro = 1;
          }                       
          }                
  if(contcarro1 == 0){               
  if (dato == 'd'){                  // boton variador norte soltar
         Serial.println("z");        //apaga led movimiento
          delay(300);
          contcarro1 = 1;
          }                       
          }                
}
  
  void Finales_de_carrera(){
if(contcarro1 != 0){
  if(freccarro<214){ 
   
  while(fccarro != HIGH){                // si final de carrera esta desativado aga esto constantemente    
    delay(100);                                //Retardo para favorecer el envio 6 desactivar final carrera
    Serial.println("6");
    delay(200);
    analogWrite(variar_freccarro_Q8,freccarro);
    Serial.print(freccarro);
    fccarro = digitalRead(finalccarro_I1);     //actualizar el valor de la variable
    }                                                                         
    //Serial.print("DE REACCIÓN: "); 
    analogWrite(variar_freccarro_Q8,LOW);
    
    delay(60); 
    Serial.print("5");                        //Retardo para favorecer el envio 6 desactivar final carrera
    contcarro = 0;
    fccarro=0;
    contcarro1 = 1;
    }
     else{
       analogWrite (variar_freccarro_Q8,frec_maxcarro);       //si sobrepasa el incremento los 214 se enviara de una rango maximo de frecuencia 255 que son 30Hz por el pin 6
       //Serial.print("REACCIÓN MÁXI:"); 
       //Serial.println(frec_maxcarro); 
       }  
       }        
        delay(500);
        while (contcarro1 == 1){                               // boton variador sur soltar       
         analogWrite(variar_freccarro_Q8,LOW);
         Serial.println("DE REACCIÓN: 0");   
         contcarro1 = 1;
         }
         }

No he podido seguir la idea que persigues.
Entiendo y corrígeme si estoy equivocado.

Tu APP envia dos comandos que son controlados por contcarro y contcarro1

Por otro lado tienes los finales de carrera

fccarro = digitalRead(finalccarro_I1);

El código llamado void Finales_de_carrera() {

no lo entiendo. Qué se supone hace?

El primer error que me salta a la vista es que olvidaste definir como publicas todas las variables.

byte const led_Q10 = 10;
byte const variar_freccarro_Q8 = 8;  //Cuidado no es PWM
byte const finalccarro_I1 = 7;

char dato;
bool fccarro;
byte contcarro,contcarro1,freccarro;

Luego no nos cuentas que Arduino usas, pero si es UNO la salida digital 7 y 8 no soportan PWM.