¿Cómo creo varios subprogramas?

Estoy programando un vehículo que sea capaz de seguir una línea negra encima de un fondo blanco (usando sensores tcrt5000), que se mantenga a cierta distancia de la pared con sensores HC-SR04 y de ser manejado a través de bluetooth.
Tengo los tres programas hechos por separado (y funcionan), pero necesito ponerlos los tres en un mismo programa.
Aquí os dejo los tres programas por separado y el intento de juntarlos.

1.º programa (Sensores tcrt5000):

#define LinR 2
#define LinL 3
#define MA1 5
#define MA2 4
#define MB1 6
#define MB2 7

void setup() {
Serial.begin(9600);
pinMode(MA1, OUTPUT);
pinMode(MA2, OUTPUT);
pinMode(MB1, OUTPUT);
pinMode(MB2, OUTPUT);
pinMode(LinR, INPUT);
pinMode(LinL, INPUT);
}

void loop() {
if (digitalRead(LinL) == 1 and digitalRead(LinR) == 0){
  analogWrite(MA1, 0);
  digitalWrite(MA2, HIGH);
  analogWrite(MB1, 0);
  digitalWrite(MB2, LOW);
}
else if (digitalRead(LinL) == 0 and digitalRead(LinR) == 1){
  analogWrite(MA1, 0);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 0);
  analogWrite(MB2, HIGH);
  }
else if (digitalRead(LinL) == 0 and digitalRead(LinR) == 0){
  digitalWrite(MA1, 0);
  digitalWrite(MA2, HIGH);
  digitalWrite(MB1, 0);
  digitalWrite(MB2, HIGH);
  }
delay(5);
}

2.º programa (Sensores HC-SR04):

#define MA1 5
#define MA2 4
#define MB1 6
#define MB2 7
#define Pecho_2 8
#define Ptrig_2 9
#define Pecho 10
#define Ptrig 11
long duracion, distancia, duracion_2, distancia_2, ;

void setup() {
 Serial.begin(9600);
 pinMode(MA1, OUTPUT);
 pinMode(MA2, OUTPUT);
 pinMode(MB1, OUTPUT);
 pinMode(MB2, OUTPUT);
 pinMode(LinR, INPUT);
 pinMode(LinL, INPUT);
 pinMode(Pecho, INPUT);
 pinMode(Ptrig, OUTPUT);
 pinMode(Pecho_2, INPUT);
 pinMode(Ptrig_2, OUTPUT);
}

void loop() {

digitalWrite(Ptrig, LOW);
delayMicroseconds(2);
digitalWrite(Ptrig, HIGH);
delayMicroseconds(10);

duracion = pulseIn(Pecho, HIGH);
distancia = (duracion*0.017);

digitalWrite(Ptrig_2, LOW);
delayMicroseconds(2);
digitalWrite(Ptrig_2, HIGH);
delayMicroseconds(10);

duracion_2 = pulseIn(Pecho_2, HIGH);
distancia_2 = (duracion_2*0.017);


if(distancia_2 < 15){
  analogWrite(MA1, 255);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 0);
  digitalWrite(MB2, LOW);
  delay(300);
}
else if(distancia > 30){
  analogWrite(MA1, 210);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 210);
  digitalWrite(MB2, LOW);
  delay(250);
  analogWrite(MA1, 0);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 255);
  digitalWrite(MB2, LOW);
  delay(350);
  analogWrite(MA1, 210); 
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 210);
  digitalWrite(MB2, LOW);
  delay(250);
}
else if(distancia < 11) {
  analogWrite(MA1, 255);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 220);
  digitalWrite(MB2, LOW);
}
else if (distancia > 12) {
  analogWrite(MA1, 220);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 255);
  digitalWrite(MB2, LOW);
}
else {
  analogWrite(MA1, 220);
  digitalWrite(MA2, LOW);
  analogWrite(MB1, 220);
  digitalWrite(MB2, LOW);
}
}

3.º programa (Bluetooth):

#define MA1 5
#define MA2 4
#define MB1 6
#define MB2 7
long dada;

void setup() {
 Serial.begin(9600);
 pinMode(MA1, OUTPUT);
 pinMode(MA2, OUTPUT);
 pinMode(MB1, OUTPUT);
 pinMode(MB2, OUTPUT);
}

void loop() {

 if(dada == 'f'){
   analogWrite(MA1, 255);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 255);
   digitalWrite(MB2, LOW);
 }
 else if(dada == 'b'){
   analogWrite(MA1, 0);
   digitalWrite(MA2, HIGH);
   analogWrite(MB1, 0);
   digitalWrite(MB2,HIGH);
 }
 else if(dada == 'r'){
   analogWrite(MA1, 0);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 255);
   digitalWrite(MB2,LOW);
 }
 else if(dada == 'l'){
   analogWrite(MA1, 255);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 0);
   digitalWrite(MB2,LOW);
 }
 else if(dada == 's'){
   analogWrite(MA1, 0);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 0);
   digitalWrite(MB2,LOW);
 }
}

4.º programa (intento de unirlos):

#define LinR 2
#define LinL 3
#define MA1 5
#define MA2 4
#define MB1 6
#define MB2 7
#define Pecho_2 8
#define Ptrig_2 9
#define Pecho 10
#define Ptrig 11
long duracion, distancia, duracion_2, distancia_2, dada;

void setup() {
 Serial.begin(9600);
 pinMode(MA1, OUTPUT);
 pinMode(MA2, OUTPUT);
 pinMode(MB1, OUTPUT);
 pinMode(MB2, OUTPUT);
 pinMode(LinR, INPUT);
 pinMode(LinL, INPUT);
 pinMode(Pecho, INPUT);
 pinMode(Ptrig, OUTPUT);
 pinMode(Pecho_2, INPUT);
 pinMode(Ptrig_2, OUTPUT);
}

void loop() {
 dada = Serial.read();
 analogWrite(MA1, 0);
 digitalWrite(MA2, LOW);
 analogWrite(MB1, 0);
 digitalWrite(MB2,LOW);
 
 if (dada == 'x'){
 void rastrejador();
 }
 else if (dada == 'y'){
 void laberint();
 }
 else if (dada == 't'){
 void bluetooth();
 }
 else {
 void loop();
 }
}

void rastrejador() {
 if (digitalRead(LinL) == 1 and digitalRead(LinR) == 0){
   analogWrite(MA1, 0);
   digitalWrite(MA2, HIGH);
   analogWrite(MB1, 0);
   digitalWrite(MB2, LOW);
 }
 else if (digitalRead(LinL) == 0 and digitalRead(LinR) == 1){
   analogWrite(MA1, 0);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 0);
   digitalWrite(MB2, HIGH);
   }
 else if (digitalRead(LinL) == 0 and digitalRead(LinR) == 0){
   analogWrite(MA1, 0);
   digitalWrite(MA2, HIGH);
   analogWrite(MB1, 0);
   digitalWrite(MB2, HIGH);
   }
 delay(5);
 if (dada == 'z'){
   void loop();
 }
 else {
   void rastrejador();
 }
}

void laberint() {
 digitalWrite(Ptrig, LOW);
 delayMicroseconds(2);
 digitalWrite(Ptrig, HIGH);
 delayMicroseconds(10);
 
 duracion = pulseIn(Pecho, HIGH);
 distancia = (duracion*0.017);
 
 digitalWrite(Ptrig_2, LOW);
 delayMicroseconds(2);
 digitalWrite(Ptrig_2, HIGH);
 delayMicroseconds(10);
 
 duracion_2 = pulseIn(Pecho_2, HIGH);
 distancia_2 = (duracion_2*0.017);


 if(distancia_2 < 15){
   analogWrite(MA1, 255);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 0);
   digitalWrite(MB2, LOW);
   delay(300);
 }
 else if(distancia > 30){
   analogWrite(MA1, 210);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 210);
   digitalWrite(MB2, LOW);
   delay(250);
   analogWrite(MA1, 0);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 255);
   digitalWrite(MB2, LOW);
   delay(350);
   analogWrite(MA1, 210); 
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 210);
   digitalWrite(MB2, LOW);
   delay(250);
 }
 else if(distancia < 11) {
   analogWrite(MA1, 255);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 220);
   digitalWrite(MB2, LOW);
 }
 else if (distancia > 12) {
   analogWrite(MA1, 220);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 255);
   digitalWrite(MB2, LOW);
 }
 else {
   analogWrite(MA1, 220);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 220);
   digitalWrite(MB2, LOW);
 }
 if (dada == 'z'){
   void loop();
 }
 else {
   void laberint();
 }
}

void bluetooth() {
 if(dada == 'f'){
   analogWrite(MA1, 255);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 255);
   digitalWrite(MB2, LOW);
 }
 else if(dada == 'b'){
   analogWrite(MA1, 0);
   digitalWrite(MA2, HIGH);
   analogWrite(MB1, 0);
   digitalWrite(MB2,HIGH);
 }
 else if(dada == 'r'){
   analogWrite(MA1, 0);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 255);
   digitalWrite(MB2,LOW);
 }
 else if(dada == 'l'){
   analogWrite(MA1, 255);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 0);
   digitalWrite(MB2,LOW);
 }
 else if(dada == 's'){
   analogWrite(MA1, 0);
   digitalWrite(MA2, LOW);
   analogWrite(MB1, 0);
   digitalWrite(MB2,LOW);
 }
 if (dada == 'z'){
   void loop();
 }
 else {
   void bluetooth();
 }
}

Y no has puesto cual es el problema....

Se me ocurre que el intento de union no te funcione bien y la razon mas evidente es el delay. Es posible que en cada programa por separado te funcione bien (aun asi deberias intentar evitarlos) pero piensa esto:

Al juntar en un solo codigo el delay 250 del programa 2 no solo esta deteniendo la ejecucion de la parte que antes detenia (el programa 2) si no que ahora detiene a TODO el CODIGO.

Hay varios temas en el foro donde se explica como remplazar la funcion delay por la funcion millis. Basicamente se trata de en vez de detener 250 milisegundos toda la ejecucion, tomar nota de la hora y no ejecutar tal o cual rutina hasta que hayan pasado 250 milisegundos.

La pregunta es, como respeto las normas no?
Dos post similares se llama doble post. Falta 1 a las normas del foro.
Pegar un código sin usar tags </> es otra falta a las mismas. Van 2.

El primer hilo de cada foro suele ser Normas del Foro. Leelo y luego edita tu otro hilo porque este será bloqueado.
Implementa las modificaciones en este hilo.
Por favor, no me hagas repetir este mensaje.

Habia otra respuesta pero el forum administrator borró el hilo que yo pretendía dejaran.
Repitamos acá todo entonces.
El problema es que no sabe unir dos o mas programas. Y el justamente lo dice. No se como unir los programas.
veo muchas repeticiones en los códigos posteados. Debes ir uniendo de a poco.
Toma 1 como base y vas agregando las variables sin repetir nada. Si lo haces el compilador te dirá luego que esta repetido como error. Asi que no vayas a preguntar luego porque me da este error si ves por ejemplo MA1 dos veces en dos lineas diferentes. Usa el sentido común.
Luego haces lo mismo con setup.
Si ya has definido un pin no lo repites. Si ya has iniciado el puerto Serial no lo repites y asi.
Tu problema estará en el loop.
Usas muchas cosas con delay y luego tienes pulsadores que no reaccionarán hasta que los delays se completen.
Solucionar eso implica que tu saltes de esta programación a otra mas complicada, pero esperemos a que eso pase.

Cuando edites tu post usando tag de código </> te responderé con mas precisiones.