detener auto con sensor de movimiento

Hola tengo un pequeño proyecto de un auto de juguete manejado por bluetooth con el celular android , el auto funciona pero tengo pequeños errores en la programación que no he podido solucionar , uno de eso es que el sensor ultrasonico detenga el auto cuando este por chocar .

Aquí dejo el codigo por si me pueden ayudar , el sensor detecta la distancia pero mientras acelera no detiene el auto si esta es menor a lo asiganado, PERO si la distancia es menor ANTES de acelerar este no acelera , no se si me explique bien :frowning:

#include<SoftwareSerial.h>
#include <Ultrasonic.h>
SoftwareSerial mySerial(0,1);


int led=13;
int valor;
long distancia;
long tiempo;
void setup(){ 
  Serial.begin(9600); 
  pinMode(13, OUTPUT); 
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(6, OUTPUT); 
  pinMode(7, INPUT); 
} 
  
void loop(){   
    
    
  
  
 
     
     
   if (Serial.available()){
    delay(100);
    while(Serial.available()){       //LECTURA SERIAL
      valor=Serial.read();
      
      digitalWrite(6,LOW); //sensor 
    delayMicroseconds(2);
    digitalWrite(6, HIGH); 
    delayMicroseconds(10);
    tiempo=pulseIn(7, HIGH); 
    distancia= int(0.017*tiempo);   
    Serial.println(distancia);
                                      
        if(valor=='1'&&distancia>=20){
            digitalWrite(13, HIGH);
            digitalWrite(12, LOW);       // Motor hacia adelante
         
        }
        else if(valor=='2'){       // Motor hacia atras
            digitalWrite(12, HIGH);
            digitalWrite(13, LOW);  
        }
        else if(valor=='3'){
           digitalWrite(10, HIGH);
           digitalWrite(11, LOW);  
            delay(500);
          digitalWrite(10, LOW);
        }                                      
        else if(valor=='4'){
          digitalWrite(11, HIGH);
           digitalWrite(10, LOW);  
            delay(500);
          digitalWrite(11, LOW);
        }
        else if(valor=='5'){          
        
          digitalWrite(13, HIGH);
          digitalWrite(12, LOW); 
          digitalWrite(11, HIGH);
          digitalWrite(10, LOW);
          delay(500);
          digitalWrite(11, LOW);
        }
        else if(valor=='6'){           
          digitalWrite(13, HIGH);
          digitalWrite(12, LOW); 
          digitalWrite(10, HIGH);
          digitalWrite(11, LOW);
          delay(500);
          digitalWrite(10, LOW);
        }
        
        else if(valor=='7'){          
        
          digitalWrite(12, HIGH);
          digitalWrite(13, LOW); 
          digitalWrite(11, HIGH);
          digitalWrite(10, LOW);
          delay(400);
          digitalWrite(11, LOW);
        }
        else if(valor=='8'){           
          digitalWrite(12, HIGH);
          digitalWrite(13, LOW); 
          digitalWrite(10, HIGH);
          digitalWrite(11, LOW);
          delay(400);
          digitalWrite(10, LOW);
        }
        
        
        
        
        
         else if(valor=='0'){           // Frenar Motor
          digitalWrite(12, LOW);
          digitalWrite(13, LOW); 
          digitalWrite(10, LOW);
          digitalWrite(11, LOW);
        }
        
        
        }
 
    }
  }

Primero te felicito por haber usado los tags para insertar códigos, ya que soy uno de los que mas reta a los nuevos cuando no lo hacen voy a aplaudir a quienes lo hagan como en tu caso.

Segundo.
Tu código dice:

if(valor=='1'&&distancia>=20){
            digitalWrite(13, HIGH);
            digitalWrite(12, LOW);       // Motor hacia adelante
         
        }
        else if(valor=='2'){       // Motor hacia atras
            digitalWrite(12, HIGH);
            digitalWrite(13, LOW);

Si lo terminaras acá verias que si funciona bien porque iria hacia adelante con 1 y distancia >= 20 y si no es >= 20 lo manda para atras.

en el primer if espera valor == '1' del BT Y ADEMAS y acá esta el problema que la distancia >= 20

pero luego le pones otro else if, por lo tanto tienes opciones 3, 4, 5, 6, 7, 8
Si alguna de esas sigue para adelante cosa que no documentaste ahi tienes el problema.

Hace dias tenias el problema ya lo tenia tirado , pero gracias a tu comentario revise todas las validaciones y encontré el problema :smiley:

Por si alguien mas le sirve el problema se encontraba aquí

  if (Serial.available()){
    delay(100);
    while(Serial.available()){

esto hacia que la distancia se calculase solo una vez al ingresar un dato.

muchas gracias ;D

Tienes razón, no adverti el doble Serial.available()

era eso mas que mi observación.