Carro bluetooth con sensor ultrasonico para parking

Estoy intentando unir dos códigos, el del carro y el del sensor ultrasónico para parking pero hace cosas extrañas, por separado los códigos funcionan pero al ejecutarlos juntos enloquece, he estado investigando y creo que el problema yace en los delays, solo que no entiendo del todo como debo cambiarlo por millis para que el programa no se detenga, agradecería su apoyo en este proyecto. Anexo el código.

//Declaramos un nombre a los pines del Arduino parte del carroBt
#define izqA 5             
#define izqB 6              
#define derA 9              
#define derB 10                                  
#define buzzer 3             
#define leds 4
//Declaramos un nombre a los pines del sensor
const int trigPin = 7;
const int echoPin = 8;
const int buzzerb = 11;
const int ledPin = 13;

//Declaracion de variables carritobt
int vel;
char estado = "";  
String velocidad = "";
//Declaracion de variables sensor
long duration;
int distance;
int safetyDistance;


void setup()  {
  Serial.begin(9600); //Establecemos la velocidad para la comunicacion en serie a 9600 baudios 
//Declaramos los Pines correspondientes como Salidas del carro     
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(leds, OUTPUT);
  //sensor
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  pinMode(buzzer, OUTPUT);
  pinMode(ledPin, OUTPUT);

} 

void loop()  { 
parking; //Ejecutamos el void parking
//Si recibimos algun dato al Modulo Bluetooth lo guardamos en la variable "estado"
  if(Serial.available()>0){ 
    estado = Serial.read();
    delay(2);
  }
  if(estado == 'A'){  //Si se recibe el carcarter 'A' enseguida esperamos un comando hacia el carrito
    comandos();
  }else if(estado >= '0' && estado <= '9'){ //Si recibimos un numero entre '1' y '9' esperamos que nos lleguen mas numeros para establecer la velocidad de los motores
    velocidad += estado; //le ponemos el valor del primer dato recibido a la variable velocidad
    while(Serial.available()>0){  //Mientras tengamos datos en la comunicacion serie, guardaremos esto en la String velocidad
      char c = Serial.read();
      velocidad += c;
      delay(2);  //Establecemos un retardo de 2ms para evitar que no nos llegue un dato
    }

    if(velocidad.length()>0){
      vel = velocidad.toInt();  //le establecemos el dato recibido a la variable vel, con esto hemos establecido la velocidad a los motores
      velocidad = "";
    }
    estado = "";
  }
}

void comandos(){
  if(Serial.available()>0){ 
    estado = Serial.read();
  }
  //Segun el valor de la valiable "estado" realizamos una accion
  switch(estado){
    //Generamos un pitido en el Buzzer
    case 'p':                
      digitalWrite(buzzer,HIGH);
      break;
    //Apagamos el pitido del Buzzer
    case 'z':                 
      digitalWrite(buzzer,LOW);
      break;
    //Encendemos los led's
    case 'q':                 
      digitalWrite(leds,HIGH);
      break;
    //Apagamos los led's
    case 'w':                 
      digitalWrite(leds,LOW);
      break;
    //Avanzamos
    case 'a':                 
      avanzarder();
      avanzarizq();
      break;
    //Giramos a la izquierda
    case 'b':                
      avanzarder();
      pararizq();
      break;
    //Lo Detenemos
    case 'c':                 
      pararder();
      pararizq();
      break;
    //Giramos a la derecha
    case 'd':                
      pararder();
      avanzarizq();
      break;
    //Retrocedemos
    case 'e':                
      retrocederder();
      retrocederizq();
      break;
    //Si el valor de "estado" es distinto a los anteriores detenemos el carro
    default:                  
      pararder();
      pararizq();
      break;
  }
  estado = "";
}

//Avanzamos con el motor derecho
void avanzarder(){
  analogWrite(derA, vel);
  analogWrite(derB, 0);
}


//Avanzamos con el motor izquierdo
void avanzarizq(){
  analogWrite(izqA, vel);
  analogWrite(izqB, 0);
}


//Retrocedemos con el motor derecho
void retrocederder(){
  analogWrite(derA, 0);
  analogWrite(derB, vel);  
}

//Retrocedemos con el motor izquierdo
void retrocederizq(){
  analogWrite(izqA, 0);
  analogWrite(izqB, vel);
}

//Detenemos el motor derecho
void pararder(){
  analogWrite(derA, 0);
  analogWrite(derB, 0);
}

//Detenemos el motor izquierdo
void pararizq(){
  analogWrite(izqA, 0);
  analogWrite(izqB, 0);
}
void parking() {
// Clear del trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);

// Establece el trigPin en estado HIGH durante 10 microsegundos
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

// Lee el echoPin y devuelve el tiempo de viaje de la onda sonora en microsegundos.
duration = pulseIn(echoPin, HIGH);

// Calculo de la distancia
distance= duration*0.034/2;

safetyDistance = distance;
if (safetyDistance <= 5){
  digitalWrite(buzzerb, HIGH);
  digitalWrite(ledPin, HIGH);
}
else{
  digitalWrite(buzzerb, LOW);
  digitalWrite(ledPin, LOW);
}

// Print en el Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
}

No veo delays significativos en tu código para tener que cambiarlos a millis.
El único retardo que te puede estar afectando es la función " pulseIn()", tal como la tienes puede esperar hasta 1seg si no tiene un obstáculo en rango de detección. Prueba a definirle un tiempo mas corto de espera a ver si mejora:

duration = pulseIn(echoPin, HIGH, 75);

Solo perderás 75 miliseg. si no tienes nada al frente, pero cuidado te devolverá un cero, mira como este cero afecta a tu código.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.