unificar codigos con Ping, sensor de ultrasonidos

Hola buenas

estoy trabajando en un proyecto para el instituto, este consiste en controlar un coche por BT con Arduino UNO. hasta aqui todo bien el programa con BT funvciona de maravilla, el problema viene cuano le quise añadir un sensor Ping por ultrasonidos, hice un programa aparte para provar el sensor ping para que hiciese la misma funcion que los coches modernos cuando aparcan (ese pitido k va augmentando su intermitencia a medida que te hacercas al obstaculo). Bién, ambos programas funcionan bien pero al unificarlos (metiendo el void loop del Ping en el loop del programa del BT y lo mismo con el setup. Una vez hecho esto ambos sensores funcionan i el ping realiza su funcion, el problema esta en que la señal del BT se retrasa o nosiquiera llega, es decir tiene unos segundos de retraso (antes era inmediata). Nose como hacer para meter el programa ping en el programa pincipal, y creo que el problema viene de los void loop() y void setup() al unirlos, ya que por separado ambos funcionann de maravilla.

Muchas gracias y perdon por la ortografia! (estoy desde un telefono movil)
Aquí os dejo el codigo del sensor Ping.

#include <Ping.h>

const int sensor = 8; //pin que da y recibe la señal del sensor
const int zumbador = 2; // zumbador
int distancia; //guardamos la distancia que nos da el sensor
int pausa; //quanto tiempo ha de esperar

Ping ultrasonidos = Ping(sensor);

void setup () {
pinMode(zumbador, OUTPUT);
}

void loop (){
ultrasonidos. fire();
distancia = ultrasonidos. centimeters();

if(distancia < 7){
pausa = distancia * 10;
digitalWrite(zumbador, HIGH);
delay(pausa); }

digitalWrite(zumbador, LOW);
delay(pausa);
}

Sin ver el código BT, te puedo decir lo que se ha repetido en el foro hasta la saciedad:
Si tu programa debe hacer más de una cosa "a la vez", debes huir de los delays, ya que durante ese tiempo el arduino estará "rascándose la barriga" mientras podría estar, por ejemplo, mirando qué llega por BT.
Comienza por probar y comprender el código blink sin delay a ver si eres capaz de eliminar tus delays. Si buscas un poco en este foro verás varios hilos que tratan el mismo problema.

aha, si es posible que sea eso ya que es precisamente lo que le pasa, que se queda pajara durante un rato, pero el sensor de ultrasonidos funciona todo el rato, Muchisimas gracias vere que puedo hacer :slight_smile:
Aquí te dejo el codigo del BT. coguiendo la idea basica (ya k uso la misma app) de www.MOBOTCAR.es

int adelante = 11; // adelante
int atras = 12; // atras
int izquierda = 10; // izquierda
int derecha = 9; // derecha

int luces_cortas = 7; // luces cortas
int luces_largas = 6; // luces largas
int luces_traseras = 5; // luces traseras
int reverse_lights = 4; // Pin 4 - Reverse Lights
int sensor = 8; //receptor y emisor de sañales del sensor por ultrasonidos
int zumbador = 2; // zumbador
int distancia; //guardamos la distancia que nos da el sensor por ultrasonidos
int pausa; // tiempo de espera (sensor ultrasonidos
char val; // Variable to receive data from the serial port

#include <Ping.h>
Ping ultrasonidos = Ping(sensor);

void setup() {

// initialize the digital pins as output
pinMode(adelante, OUTPUT);
pinMode(atras, OUTPUT);
pinMode(izquierda, OUTPUT);
pinMode(derecha, OUTPUT);
pinMode(luces_cortas, OUTPUT);
pinMode(luces_largas, OUTPUT);
pinMode(luces_traseras, OUTPUT);
pinMode(reverse_lights, OUTPUT);
pinMode(zumbador, OUTPUT);

Serial.begin(9600); // Start serial communication at 9600bps
}

// Fordward action
void go_adelante() {
analogWrite(adelante, 190);//PWM

digitalWrite(atras, LOW);
}

// Stop Forward action
void stop_go_adelante() {
digitalWrite(adelante, LOW);
}

// Reverse action
void go_atras() {
digitalWrite(atras, HIGH);
digitalWrite(adelante, LOW);

digitalWrite(reverse_lights, HIGH);
}

// Stop Reverse action
void stop_go_atras() {
digitalWrite(atras, LOW);
digitalWrite(reverse_lights, LOW);
}

// Turbo action
void go_turbo() {

analogWrite(adelante, 255); //PWM
digitalWrite(atras, LOW);
}

// Stop Turbo action
void stop_go_turbo() {
digitalWrite(adelante, LOW);
}

// Left action
void go_izquierda() {
digitalWrite(izquierda, HIGH);
digitalWrite(derecha, LOW);
}

// Right action
void go_derecha() {
digitalWrite(derecha, HIGH);
digitalWrite(izquierda, LOW);
}

// Stop turn action
void stop_giro() {
digitalWrite(derecha, LOW);
digitalWrite(izquierda, LOW);
}

// Stop car
void stop_coche() {
digitalWrite(adelante, LOW);
digitalWrite(atras, LOW);

digitalWrite(derecha, LOW);
digitalWrite(izquierda, LOW);
digitalWrite(reverse_lights, LOW);
}

// Short Lights ON
void luces_cortas_on() {
analogWrite(luces_cortas, 190);
digitalWrite(luces_traseras, HIGH);
}

// Short Lights OFF
void luces_cortas_off() {
digitalWrite(luces_cortas, LOW);
digitalWrite(luces_traseras, LOW);
}

// Long Lights ON
void luces_largas_on() {
digitalWrite(luces_largas, HIGH);
}

// Long Lights OFF
void luces_largas_off() {
digitalWrite(luces_largas, LOW);
}

// Reverse Lights ON
void luces_traseras_on() {
digitalWrite(luces_traseras, HIGH);
}

// Reverse Lights OFF
void luces_traseras_off() {
digitalWrite(reverse_lights, LOW);
}

// Read serial port and perform command
void performCommand() {
if (Serial.available()) {
val = Serial.read();
}
if (val == 'f') { // adelante
go_adelante();
} else if (val == 'z') { // Stop adelante
stop_go_adelante();
} else if (val == 'b') { // atras
go_atras();
} else if (val == 'y') { // Stop atras
stop_go_atras();
} else if (val == 't') { // Turbo
go_turbo();
} else if (val == 'x') { // Stop Turbo
stop_go_turbo();
} else if (val == 'l') { // derecha
go_derecha();
} else if (val == 'r') { // izquierda
go_izquierda();
} else if (val == 'v') { // Stop giro
stop_giro();
} else if (val == 's') { // Stop
stop_coche();
} else if (val == 'a') { // Short luces cortas
luces_cortas_on();
} else if (val == 'c') { // Stop luces cortas
luces_cortas_off();
} else if (val == 'd') { // luces largas
luces_largas_on();
} else if (val == 'e') { // Stop luces largas
luces_largas_off();
}
}
void loop() {
performCommand();
}

Echando un vistazo somero, veo que el otro código no utiliza delays, así que puedes usarlo como base perfectamente. Los setup los puedes combinar sin mayores problemas. Yo dejaría el loop, con estas dos líneas:
performCommand();
performBeep();
Esta última función deberá medir la distancia y el tiempo transcurrido desde el último encendido o apagado del zumbador, y cambiar el estado del zumbador si ha transcurrido el tiempo o la distancia se ha salido del rango.
Inténtalo, y si te atrancas pide ayuda.
Saludos.