2 Sensores CH-SR04 con distancia superior a 20cm 1 da valor 0

Hola, primero dar las gracias de antemano por la ayuda que recibire.
El proyecto, es algo mas de lo que aqui explico, pero para no alargar mucho me centro en el problema.
Estoy usando un arduino mega, y 2 sensores ch-sr04, es mi primer proyecto con arduino y he estado buscando por todo internet toda la informacion que he podido y me he empapado todo lo que he encontrado, con eso he podido resolver varios problemas que me han ido surgiendo, pero con referencia a este no encuentro nada.
Tengo conectado los dos sensores para que en el serial me de la medida de las distancias en cm. Comence conectado un sensor con exito, le añadi control sobre un led RGB que cambia de color segun distancia del sensor, hasta aqui todo correcto.
Primer porblema cuando quiero conectar el segundo sensor este no funciona no da lectura en el serial, despues de mucho leer, lo soluciono con la libreria newping, pero no entiendo nada de nada de librerias y he intentado comprenderla pero no lo consigo se me escapa a mi entendimiento, por lo tanto consigo que funcionen los dos sensores pefctamente pero no se añadir led RGB para que segun distancia ilumine de un cierto color, el problema es que no se como coger los valores del serial para usarlos con los comandos if, he buscado y no he hallado.
Despues lo en intentado sin la libreria y he conseguido que funcionen los dos sensores pero ahora me encuentro con el problema siguiente.
a una distancia de entre 5 y 20 cm los dos sensores funcionan correctamente, pero a partir de esta distancia, el sensor 1 se vuelve un poco mas lento en dar la lectura en el serial, aunque es correcta, pero el sensor 2 deja de dar distancia y solo da un valor 0. :sob:

Sketch:

// PINES
#define LEDR1 2
#define LEDG1 3
#define LEDB1 4
#define TIGGER1 5
#define ECHO1 6
//#define TIGGER2 7
#define ECHO2 8

// CONSTANTES
const float umbral1 = 15;
const float umbral2 = 5;

// COMIENZA A MEDIR
void iniciarTigger1()
{ 
  // CAMBIAMOS TIGGER A ALTO
  digitalWrite(TIGGER1, HIGH);
  delayMicroseconds(10); 
  // TERMINAMOS CN TIGGER EN BAJO
  digitalWrite(TIGGER1, LOW);
}

/*void iniciarTigger2()
{
  // INICIAMOS TIGGER BAJO
  digitalWrite(TIGGER2, LOW);
  delayMicroseconds(5);
 
  // CAMBIAMOS TIGGER A ALTO
  digitalWrite(TIGGER2, HIGH);
  delayMicroseconds(20);
 
  // COMENZAMOS CON TIGGER EN BAJO
  digitalWrite(TIGGER2, LOW);
}*/

//SI POSICION INCORRECTA
void MOTORcorregir() {
  LEDrojo();
}

//SI POSICION CORRECTA
void MOTORbajar() {
  LEDverde();
}

//SI POSICION BAJA
void MOTORsubir() {
  LEDverde();
}

void setup() {
  // INICIAR MONITOR SERIE
  Serial.begin(9600);

  //MODO PINES
  pinMode(LEDR1, OUTPUT);
  pinMode(LEDG1, OUTPUT);
  pinMode(LEDB1, OUTPUT);
  pinMode(TIGGER1, OUTPUT);
  pinMode(ECHO1, INPUT);
  //pinMode(TIGGER2, OUTPUT);
  pinMode(ECHO2, INPUT);

  //LED EN INICIO COLOR BLANCO
  LEDblanco();

  // PONEMOS TIGGER  EN BAJO
  digitalWrite(TIGGER1, LOW);
  delayMicroseconds(5);
}

void loop() {
  //PREPARAMOS SENSOR
  iniciarTigger1();
  //iniciarTigger2();

  //OBTENEMOS DISTANCA
  float distancia1 = calcularDistancia1();
  float distancia2 = calcularDistancia2(); 
  
  //REALIZAMOS LA OPERACION
  /*if (distancia1 < umbral1 && distancia1 > umbral2)
  {
    MOTORcorregir();
  }
  else if (distancia1 >= umbral1)
  {
    MOTORbajar();
  }
  else if (distancia1 <= umbral2)
  {
    MOTORsubir();
  }
  delay(100);*/

}

//ENCIENDE LED BLANCO
void LEDblanco()
{
  //PONER LED EN BLANCO
  analogWrite(LEDR1, 255);
  analogWrite(LEDG1, 255);
  analogWrite(LEDB1, 255);
}

//ENCIENDE LED VERDE
void LEDverde()
{
  //PONER LED EN VERDE
  analogWrite(LEDR1, 0);
  analogWrite(LEDG1, 250);
  analogWrite(LEDB1, 0);
}

//ENCIENDE LED ROJO
void LEDrojo()
{
  //PONER LED EN ROJO
  analogWrite(LEDR1, 250);
  analogWrite(LEDG1, 0);
  analogWrite(LEDB1, 0);
}

// CALCULO DE DISTANCIA1
// DEVUELVE UNA VARIABLE FLOAT QUE CONTIENE LA DISTANCIA
float calcularDistancia1()
{
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo1 = pulseIn(ECHO1, HIGH);
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  float distancia1 = tiempo1 / 2 / 29;
  Serial.print("Sensor1 = ");
  Serial.print(distancia1);
  Serial.print("cm / ");    
}

// CALCULO DE DISTANCIA2
// DEVUELVE UNA VARIABLE FLOAT QUE CONTIENE LA DISTANCIA
float calcularDistancia2()
{
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo2 = pulseIn(ECHO2, HIGH);
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  float distancia2 = tiempo2 / 2 / 29;
  Serial.print("Sensor2 = ");
  Serial.print(distancia2);
  Serial.print("cm");
  Serial.println();
  delay(500);  
}

Hay muchas lineas comentadas, por que son instrucciones que tendre que añadir cuando resuelva el problema que ahora me tiene loco, y algunas por que las he desechado momentaneamente por mejoras del sketch o eso me he creido yo :rofl:

Bueno espero haberme explicado y si alguien puede guiarme o darme alguna pista de por donde tirar estare muy agradecido, cualquier duda o pregunta do ddeis en comentarme, contestare lo antes posible, gracias y saludos.

El primer problema es que has comentado las sentencias relativas al disparo del segundo sensor, por eso no realiza ninguna medición.

Se recomienda que secuencia para generar el pulso de disparo sea

digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us

delayMicroseconds(4);

digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us

delayMicroseconds(10);

digitalWrite(TriggerPin, LOW);


Saludos

Aca elcódigo con la librería newping.h

#include <NewPing.h>

#define SONAR_NUM 2      // Number of sensors.
#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.

// PINES
#define LEDR1   2
#define LEDG1   3
#define LEDB1   4
//#define TIGGER2 7
#define ECHO2 8

NewPing sonar[SONAR_NUM] = {   // Sensor object array.
  NewPing(5, 6, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping. 
  NewPing(5, 8, MAX_DISTANCE), 
};

float distancia[SONAR_NUM];
// CONSTANTES
const float umbral[SONAR_NUM] = {15, 5};

//SI POSICION INCORRECTA
void MOTORcorregir() {
  LEDrojo();
}

//SI POSICION CORRECTA
void MOTORbajar() {
  LEDverde();
}

//SI POSICION BAJA
void MOTORsubir() {
  LEDverde();
}

void setup() {
  // INICIAR MONITOR SERIE
  Serial.begin(9600);

  //MODO PINES
  pinMode(LEDR1, OUTPUT);
  pinMode(LEDG1, OUTPUT);
  pinMode(LEDB1, OUTPUT);
  //LED EN INICIO COLOR BLANCO
  LEDblanco();
}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
    delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
    Serial.print(i);
    Serial.print("=");
    distancia[i] = sonar[i].ping_cm();
    Serial.print(distancia[i]);
    Serial.print("cm ");
  }
  Serial.println();
  
  //REALIZAMOS LA OPERACION
    if (distancia1 < umbral[0] && distancia1 > umbral[1])  {
        MOTORcorregir();
    }
    else if (distancia[0] >= umbral[0])
    {
        MOTORbajar();
    }
    else if (distancia[0] <= umbral[1])
    {
        MOTORsubir();
    }
    delay(100);
}

//ENCIENDE LED BLANCO
void LEDblanco() {
  //PONER LED EN BLANCO
  analogWrite(LEDR1, 255);
  analogWrite(LEDG1, 255);
  analogWrite(LEDB1, 255);
}

//ENCIENDE LED VERDE
void LEDverde()
{
  //PONER LED EN VERDE
  analogWrite(LEDR1, 0);
  analogWrite(LEDG1, 250);
  analogWrite(LEDB1, 0);
}

//ENCIENDE LED ROJO
void LEDrojo()
{
  //PONER LED EN ROJO
  analogWrite(LEDR1, 250);
  analogWrite(LEDG1, 0);
  analogWrite(LEDB1, 0);
}

Cuentame si funciona.

Gracias @anon90500195 por contestar, el segundo tigger esta comentado pues estoy usando un mismo pulso en un pin comun para los dos tigger, anteriormente usaba pulsos undividiales en pin distintos para cada tigger pero el resultado es el mismo, por eso esta comentado el tigger 2.
Los parametros de disparo los probare a ver que tal, aunque he provado ya muchas variaciones, pero no recuerdo esta en concreto, ta te contare.... Gracias

Gracias @Surbyte, funcionara seria genial, pues con la libreria la medicion es mas esacta, pruebo y te cuento..

@anon90500195 he probado con los parametros que me has pasado:

quote="gatul, post:2, topic:979614"]
Se recomienda que secuencia para generar el pulso de disparo sea

digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us

delayMicroseconds(4);

digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us

delayMicroseconds(10);

digitalWrite(TriggerPin, LOW);

[/quote]

Seguire investigando... gracias.

No puedes usar un único pulso de disparo para ambos sensores.
Imagina que ambos estan a la misma distancia del obstáculo
¿Cómo lees el segundo si "contesta" al mismo tiempo que el primero?

¿Se entiende?

Buenas, @Surbyte, muchas gracias, es lo que necesitaba, al meter los parametros del umbral ya puedo hacer lo que necesitaba con el motor, es precisamente lo que llevaba intentando hacer algun tiempo, pero como soy muy novato no sabia como lograrlo, lei varias cosillas que encontre por google pero no daba pie con bolo .... :rofl:.
Voy a reorganizar el sketch y lo pego completo para que sirva de ayuda a quien lo necesite, gracias makina...

@anon90500195, si se puede, de hecho lo he puesto asi, con ello consigo que los dos tigger se disparen a la vez pues estan controlados por el mismo pin que manda un unico pulso que llega a los dos tigger, pero despues cada uno tiene su echo en diferentes pines con lo cual recibe 2 lecturas distintas.
Es cierto que no sabria explicarte cientificamente o tecnicamente el proceso, pues no llego a eso, pero comparado con la electricidad, es como si alimentas dos interruptores con una sola fase, pero el vuelta de lampara de cada cual va a distintas luces, las dos encienden cuando pulsamos el interrptor adecuado... no se si me explique correctamente .....
de todos modos, con la modificacion que me ha facilitado @Surbyte y usando la libreria newping.h todo genial.
Lo que sigo sin entender, por que uno de los sensores no daba resultados justo cuando sobrepasaba los 20cm, con menos distancia todo funcionaba correctamente.... algo a estudiar en otro momento....

No me entendiste la idea, la tomaste literalmente.
Lo que te quise decir es un poquito más complejo, me explico.
Es verdad que puedes disparar ambos sensores desde el mismo pin, obviamente si, pero el problema es la lectura del pulso de respuesta.
Te pongo un ejemplo.
Disparas ambos sensores a un tiempo T0.
El sensor que llamaremos S1 tiene un obstáculo a 20 cm. El otro, S2, lo tiene a 5 cm.
La señal de S1 tarda un tiempo X en volver que llamaremos T1, la señal de S2 demorará X/4 y la llamaremos T2.
Ahora tu esperas la respuesta de S1 para calcular la distancia en función de T1, la respuesta de S2 la detectarás luego, ¿de acuerdo?
Cuando la respuesta de S2 llega tu todavía esperas la respuesta de S1 porque la respuesta tarda más (T1 es mayor a T2).
Detectas esa respuesta y pasas a esperar la respuesta de S2 que en realidad ya volvió hace rato largo, perdiste el pulso a T2 y por ende la medición.

Entonces, si, puedes usar el mismo pin pero no el mismo pulso de disparo, salvo que de antemano sepas que S2 va a medir una distancia lo suficientemente mayor a la de S1 como para no perder su respuesta.

¿Se entiende ahora a qué me refería?

Ahora, ¿cómo lo puedes hacer correctamente con un solo pin?
Generas el pulso de disparo (se dispararán ambos sensores)
Esperas la respuesta de S1.
Generas otro disparo.
Ahora esperas la respuesta de S2.

Saludos

Correcto, @anon90500195 ahora te he entendido, y por ende creo que ya entiendo por que a mas distancia la respuesta mas lenta e incluso erronea.

Probare para salir de dudas si puede ser este el problema de lectura a mas de 20cm....muchas gracias por la aclaracion, y perdona mi torpeza.. :stuck_out_tongue_winking_eye:

No hay nada que perdonar, me alegro que se haya entendido la explicación y te sirviera (además me ahorré la analogía que te iba a plantear con interruptores y luces. :joy: ).

En resumen y para que quede claro, con un solo pin de disparo, primero haces la medición con un sensor ignorando al otro, luego haces la medición con el segundo ignorando al primero.

Saludos

Clariiisimo, cuando haga las pruebas te comento si solventa el error desconocido de los 20cm..:joy::joy:

@anon90500195, bueno he probado a hacer lo que me has sugerido:

Pero el problema persiste, o quizas yo no he sabido hacerlo correctamente, soy muuuyyy novato.... dejo el sketch para que me corrigas.

// PINES
#define LEDR1 2
#define LEDG1 3
#define LEDB1 4
#define TIGGER1 5
#define ECHO1 6
//#define TIGGER2 7
#define ECHO2 8

// CONSTANTES
const float umbral1 = 15;
const float umbral2 = 5;

// COMIENZA A MEDIR
void iniciarTigger1()
{ 
  // CAMBIAMOS TIGGER A BAJO
  digitalWrite(TIGGER1, LOW);
  delayMicroseconds(4); 
  digitalWrite(TIGGER1, HIGH);
  delayMicroseconds(10); 
  digitalWrite(TIGGER1, LOW);
}

/*void iniciarTigger2()
{
  // INICIAMOS TIGGER BAJO
  digitalWrite(TIGGER2, LOW);
  delayMicroseconds(5);
 
  // CAMBIAMOS TIGGER A ALTO
  digitalWrite(TIGGER2, HIGH);
  delayMicroseconds(20);
 
  // COMENZAMOS CON TIGGER EN BAJO
  digitalWrite(TIGGER2, LOW);
}*/

//SI POSICION INCORRECTA
void MOTORcorregir() {
  LEDrojo();
}

//SI POSICION CORRECTA
void MOTORbajar() {
  LEDverde();
}

//SI POSICION BAJA
void MOTORsubir() {
  LEDverde();
}

void setup() {
  // INICIAR MONITOR SERIE
  Serial.begin(9600);

  //MODO PINES
  pinMode(LEDR1, OUTPUT);
  pinMode(LEDG1, OUTPUT);
  pinMode(LEDB1, OUTPUT);
  pinMode(TIGGER1, OUTPUT);
  pinMode(ECHO1, INPUT);
  //pinMode(TIGGER2, OUTPUT);
  pinMode(ECHO2, INPUT);

  //LED EN INICIO COLOR BLANCO
  LEDblanco();  
}

void loop() {
  //Apago echo2
  digitalWrite(ECHO2, LOW);
  //Disparo
  iniciarTigger1();
  //Calculo 1
  float distancia1 = calcularDistancia1();
  //Apago echo1
  digitalWrite(ECHO1, LOW);
  //Disparo
  iniciarTigger1();
  //Calculo 2
  float distancia2 = calcularDistancia2();


  //OBTENEMOS DISTANCA
  //float distancia1 = calcularDistancia1();
  //float distancia2 = calcularDistancia2(); 
  
  //REALIZAMOS LA OPERACION
  /*if (distancia1 < umbral1 && distancia1 > umbral2)
  {
    MOTORcorregir();
  }
  else if (distancia1 >= umbral1)
  {
    MOTORbajar();
  }
  else if (distancia1 <= umbral2)
  {
    MOTORsubir();
  }
  delay(100);*/

}

//ENCIENDE LED BLANCO
void LEDblanco()
{
  //PONER LED EN BLANCO
  analogWrite(LEDR1, 255);
  analogWrite(LEDG1, 255);
  analogWrite(LEDB1, 255);
}

//ENCIENDE LED VERDE
void LEDverde()
{
  //PONER LED EN VERDE
  analogWrite(LEDR1, 0);
  analogWrite(LEDG1, 250);
  analogWrite(LEDB1, 0);
}

//ENCIENDE LED ROJO
void LEDrojo()
{
  //PONER LED EN ROJO
  analogWrite(LEDR1, 250);
  analogWrite(LEDG1, 0);
  analogWrite(LEDB1, 0);
}

// CALCULO DE DISTANCIA1
// DEVUELVE UNA VARIABLE FLOAT QUE CONTIENE LA DISTANCIA
float calcularDistancia1()
{
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo1 = pulseIn(ECHO1, HIGH);
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  float distancia1 = tiempo1 / 2 / 29;
  Serial.print("Sensor1 = ");
  Serial.print(distancia1);
  Serial.print("cm / ");    
}

// CALCULO DE DISTANCIA2
// DEVUELVE UNA VARIABLE FLOAT QUE CONTIENE LA DISTANCIA
float calcularDistancia2()
{
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo2 = pulseIn(ECHO2, HIGH);
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  float distancia2 = tiempo2 / 2 / 29;
  Serial.print("Sensor2 = ");
  Serial.print(distancia2);
  Serial.print("cm");
  Serial.println();
  delay(500);  
}

Por ahora, la unica solucion que he encontrado y la que mejor me va, es el uso de la libreria newping.h, como me recomendo @Surbyte, en cuanto tenga el skech un poco depurado lo comparto...

Esto

digitalWrite(ECHO2, LOW);

No va, lo mismo para ECHO1. Son entradas.
Como efecto "secundario" estás deshabilitando la resistencias pull-up de ambos pines, aunque en este caso no afecta en nada hay que tener cuidado con estas cosas, si tus entradas fuesen INPUT_PULLUP estarías generándote un problema innecesario.

Acá

float distancia1 = tiempo1 / 2 / 29;

deberías usar

float distancia1 = tiempo1 / 2.0 / 29.0;

para forzar las operaciones con coma flotante, de otro modo los literales se consideran enteros, y las operaciones entre int y unsigned long no tienen decimales en su resultado.

Yo pondría la secuencia de trigger directamente en la función de medición para no perder microsegundos entre que se retorna de la rutina de trigger y se llama a la de medición.
Igual no se si afecte demasiado, a lo sumo podría traer problemas a distancias muy cortas, creo...

Por ahora no veo otra cosa "rara", después lo miro a fondo.

Saludos

Tambien puedes con NewPing separar los trigger.

Si, ya lo sabe

Saludos

correcto es la unica forma por ahora que he cnsegido que responda bien, ademas muy bien la verdad... estoy depurando para poner codigo por si alguien le va bien...

Primeramente dejar claro que la unica solucion que he va correcta es cn la libreria newpig.h lo demas ya es por puro afan de conocimiento y investigacion....

@anon90500195 segun tus instrucciones :

he modificado el sketch, ahora esta asi:

// PINES
#define LEDR1 2
#define LEDG1 3
#define LEDB1 4
#define TIGGER1 5
#define ECHO1 6
//#define TIGGER2 7
#define ECHO2 8

// CONSTANTES
const float umbral1 = 15;
const float umbral2 = 5;

/*// COMIENZA A MEDIR
void iniciarTigger1()
{ 
  // CAMBIAMOS TIGGER A BAJO
  digitalWrite(TIGGER1, LOW);
  delayMicroseconds(4); 
  digitalWrite(TIGGER1, HIGH);
  delayMicroseconds(10); 
  digitalWrite(TIGGER1, LOW);
}*/

/*void iniciarTigger2()
{
  // INICIAMOS TIGGER BAJO
  digitalWrite(TIGGER2, LOW);
  delayMicroseconds(5);
 
  // CAMBIAMOS TIGGER A ALTO
  digitalWrite(TIGGER2, HIGH);
  delayMicroseconds(20);
 
  // COMENZAMOS CON TIGGER EN BAJO
  digitalWrite(TIGGER2, LOW);
}*/

//SI POSICION INCORRECTA
void MOTORcorregir() {
  LEDrojo();
}

//SI POSICION CORRECTA
void MOTORbajar() {
  LEDverde();
}

//SI POSICION BAJA
void MOTORsubir() {
  LEDverde();
}

void setup() {
  // INICIAR MONITOR SERIE
  Serial.begin(9600);

  //MODO PINES
  pinMode(LEDR1, OUTPUT);
  pinMode(LEDG1, OUTPUT);
  pinMode(LEDB1, OUTPUT);
  pinMode(TIGGER1, OUTPUT);
  pinMode(ECHO1, INPUT);
  //pinMode(TIGGER2, OUTPUT);
  pinMode(ECHO2, INPUT);

  //LED EN INICIO COLOR BLANCO
  LEDblanco();  
}

void loop() {
  
  //Disparo
  //iniciarTigger1();
  //Calculo 1
  float distancia1 = calcularDistancia1();
  
  //Disparo
  //iniciarTigger1();
  //Calculo 2
  float distancia2 = calcularDistancia2();


  //OBTENEMOS DISTANCA
  //float distancia1 = calcularDistancia1();
  //float distancia2 = calcularDistancia2(); 
  
  //REALIZAMOS LA OPERACION
  /*if (distancia1 < umbral1 && distancia1 > umbral2)
  {
    MOTORcorregir();
  }
  else if (distancia1 >= umbral1)
  {
    MOTORbajar();
  }
  else if (distancia1 <= umbral2)
  {
    MOTORsubir();
  }
  delay(100);*/

}

//ENCIENDE LED BLANCO
void LEDblanco()
{
  //PONER LED EN BLANCO
  analogWrite(LEDR1, 255);
  analogWrite(LEDG1, 255);
  analogWrite(LEDB1, 255);
}

//ENCIENDE LED VERDE
void LEDverde()
{
  //PONER LED EN VERDE
  analogWrite(LEDR1, 0);
  analogWrite(LEDG1, 250);
  analogWrite(LEDB1, 0);
}

//ENCIENDE LED ROJO
void LEDrojo()
{
  //PONER LED EN ROJO
  analogWrite(LEDR1, 250);
  analogWrite(LEDG1, 0);
  analogWrite(LEDB1, 0);
}

// CALCULO DE DISTANCIA1
// DEVUELVE UNA VARIABLE FLOAT QUE CONTIENE LA DISTANCIA
float calcularDistancia1()
{
  //Disparar tigger
  digitalWrite(TIGGER1, LOW);
  delayMicroseconds(4); 
  digitalWrite(TIGGER1, HIGH);
  delayMicroseconds(10); 
  digitalWrite(TIGGER1, LOW);
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo1 = pulseIn(ECHO1, HIGH);
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  float distancia1 = tiempo1 / 2.0 / 29.0;
  Serial.print("Sensor1 = ");
  Serial.print(distancia1);
  Serial.print("cm / ");    
}

// CALCULO DE DISTANCIA2
// DEVUELVE UNA VARIABLE FLOAT QUE CONTIENE LA DISTANCIA
float calcularDistancia2()
{
  //Disparar tigger
  digitalWrite(TIGGER1, LOW);
  delayMicroseconds(4); 
  digitalWrite(TIGGER1, HIGH);
  delayMicroseconds(10); 
  digitalWrite(TIGGER1, LOW);
  // La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
  unsigned long tiempo2 = pulseIn(ECHO2, HIGH);
  // Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
  float distancia2 = tiempo2 / 2 / 29;
  Serial.print("Sensor2 = ");
  Serial.print(distancia2);
  Serial.print("cm");
  Serial.println();
  delay(500);  
}

hay muchas lineas comentadas para saber que he probado o no y que va bien o no, perdon por el caos.

Tambien me he dado cuenta que ademas de que cuando el sensor 1 da distancias superiores a 20cm el sensor 2 indica distancia 0 y las lecturas se relentizan, si el senor 1 da distancias mayor a 20cm pero el sensor 2 lo pongo a distancias menores a 20cm si me da distancias correctas en los 2 sensores y las lecturasa tienen una velocidad normal.... me he quedao loco ..... :rofl:
En fin continuo la investigacion ....seguro que s una chorrada que no soy capaz de ver...

Haz la prueba de usar pines diferentes para el trigger para ver si se comporta igual o mejora.

Saludos