Medidor Ultrasonidos para Agricultura

Hola Buenas , me presento en este foro por que me atrae las posibilidades de arduino y me gusta aprender leyendo de los demás .

Tengo un proyecto en mente y es para agricultura ,en concreto para poner automáticamente en funcionamiento una electro-válvula que se active cuando la maquina se acerque a un árbol a menos de tres metros . he encontrado los sensores de ultrasonido HC-SR04 , con un modulo de dos relé y los he conectado al arduino con el código que después os dejo para que le echéis un vistazo . El problema me viene cuando quiero hacer un doble sensor, uno para cada lado y que funcione de forma individual en cada salida, que no funciona el segundo canal, alguien me puede echar una mano?
Un saludo y gracias.

//sensor de distancia
int ecoPin = 2; // cabe amarillo
int trigPin = 3; // cable blanco
int ecoPin2 = 4; // cabe amarillo
int trigPin2 = 5; // cable blanco
//led
int ledPin = 8;
int ledPin2 = 9;

long duracion, distancia; //distancia

void setup() {
 Serial.begin(9600);
 pinMode(trigPin, OUTPUT);   //envia la señal de ultrasonido
 pinMode(ecoPin, INPUT);     //reciba la señal de ultrasonido
 pinMode(ledPin, OUTPUT);    //prende el LED
 pinMode(trigPin2, OUTPUT);   //envia la señal de ultrasonido2
 pinMode(ecoPin2, INPUT);     //reciba la señal de ultrasonido2
 pinMode(ledPin2, OUTPUT);    //prende el LED2
}

void loop() {
 //funcionamento del sensor envia y recibe la señal
 digitalWrite(trigPin, LOW);  delayMicroseconds(2);
 digitalWrite(trigPin, HIGH); delayMicroseconds(5);
 digitalWrite(trigPin, LOW);
 digitalWrite(trigPin2, LOW);  delayMicroseconds(2);
 digitalWrite(trigPin2, HIGH); delayMicroseconds(5);
 digitalWrite(trigPin2, LOW);
 //fin
 duracion = pulseIn(ecoPin, HIGH);
 
 //HIGH Si alto, comienza a contar
 //LOW se detiene el tiempo
 //http://arduino.cc/en/pmwiki.php?n=Reference/PulseIn
 //retorna el pulso en microsegundos

 distancia = microsecondsToCentimeters(duracion);
 //transformo los microsegundos en centimetros

 Serial.print ("Tiempo en microsegundos: "); Serial.print(duracion);
 Serial.print("  Distancia estimada: "); Serial.print(distancia);
 Serial.print(" cm");
 Serial.println(" ");
 delay(50);
 if (distancia > 300) {
   digitalWrite(ledPin, LOW);
   delay(5);
 }
 if (distancia < 300) {
   digitalWrite(ledPin, HIGH);
   delay(2000);
 }
 if (distancia > 300) {
   digitalWrite(ledPin2, LOW);
   delay(5);
 }
 if (distancia < 300) {
   digitalWrite(ledPin2, HIGH);
   delay(2000);
   }
}
long microsecondsToCentimeters(long microseconds) {
 // La velocidad del sonido a 20º de temperatura es 340 m/s o
 // 29 microsegundos por centrimetro.
 // La señal tiene que ir y volver por lo que la distancia a
 // la que se encuentra el objeto




 return microseconds / 29 / 2;
}

Bienvenido al foro, esta es la parte linda.
Ahora el tirón de orejas.
Tienes dos hilos en la sección Proyectos que pasaste por alto

Antes de crear tu hilo lee esto
Normas del FORO EN ESPAÑOL

Qué pasó que no los leíste?

Bueno, por las razones ahi expuestas es que tu tema fue movido a Software.
Lee las normas por favor y edita tu post, porque claro, publicaste un código como vino al mundo, o sea simple texto y debe ir con etiquetas. No sabés, pues lee las normas.

Buenas ,disculpen mi metedura de pata , leí las normas del foro pero no fue mi intención poner un tema de sofware en proyecto, me equivoqué.
Seguiré con la lectura para llevar a cabo mi idea.
Un saludo y gracias.

El error de tu código está muy claro para mi.
Tienes dos sensores, no puedes iniciar un disparo en dos sensores ultrasónicos y esperar la respuesta primero en 1 sin importar donde esta el otro.
Si el 2do tiene un obstáculo mas cercano que el primero, simplemente lo pierde.

Por eso envias un eco y esperas a que regrese y luego envias el otro y haces lo mismo. Es tan rápido que no notarás la diferencia.
Lo mejor sería que hagas una rutina genérica o uses una librería como NewPing.h tiene un ejemplo con 15 sensores si mal recuerdo.

Bueno este es mi versión de tu programa usando NewPing claro está.

tiene grandes ventajas el uso de esa librería, ejemplo cuando detecta que ha finalizado una lectura no pierde tiempo y ya hace la siguiente.

#include <NewPing.h>

#define SONAR_NUM      2 // Number or sensors.
#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM];         // Where the ping distances are stored.
uint8_t currentSensor = 0;          // Keeps track of which sensor is active.

//NewPing(uint8_t trigger_pin, uint8_t echo_pin, int max_cm_distance) {
NewPing sonar[SONAR_NUM] = {     // Sensor object array.
  NewPing( 3, 2, MAX_DISTANCE),  // Each sensor's trigger pin, echo pin, and max distance to ping.
  NewPing( 5, 4, MAX_DISTANCE)
};

int ledPin1   = 8;
int ledPin2   = 9;

unsigned long currentmillis;


void setup() {
  Serial.begin(115200);
  pingTimer[0] = millis() + 75;           // First ping starts at 75ms, gives time for the Arduino to chill before starting.
  for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor.
    pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
  pinMode(ledPin1, OUTPUT);     // configura el LED1 como salida
  pinMode(ledPin2, OUTPUT);    // configura el LED2 como salida
}

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) {       // Loop through all the sensors.
    if (millis() >= pingTimer[i]) {               // Is it this sensor's time to ping?
      pingTimer[i] += PING_INTERVAL * SONAR_NUM;  // Set next time this sensor will be pinged.
      if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
      sonar[currentSensor].timer_stop();          // Make sure previous timer is canceled before starting a new ping (insurance).
      currentSensor = i;                          // Sensor being accessed.
      cm[currentSensor] = 0;                      // Make distance zero in case there's no ping echo for this sensor.
      sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
    }
  }
  // The rest of your code would go here.
  currentmillis = millis();
  if (cm[0] < 300) {
      switch(estado1) {
        case 0: startmillis1 = currentmillis;  // tomo el valor de millis()
                digitalWrite(ledPin1, HIGH);
                estado1 = 1;                   // cambio al sig estado1
                break;
        case 1: if (currentmillis - startmillis1 > 2000UL){
                    digitalWrite(ledPin1, LOW);
                    estado1 = 2;
                }
                break;
        case 2: if (currentmillis - startmillis1 > 5L) {
                    estado1 = 0;  // 5 mseg de descanso nada mas?
                }
                break;
      }             
  }
  else  
      digitalWrite(ledPin, LOW);

  if (cm[1] < 300) {
      switch(estado2) {
        case 0: startmillis2 = currentmillis;  // tomo el valor de millis()
                digitalWrite(ledPin2, HIGH);
                estado1 = 1;                   // cambio al sig estado1
                break;
        case 1: if (currentmillis - startmillis2 > 2000UL){
                    digitalWrite(ledPin2, LOW);
                    estado1 = 2;
                }
                break;
        case 2: if (currentmillis - startmillis2 > 5L) {
                    estado2 = 0;  // 5 mseg de descanso nada mas?
                }
                break;
      }             
  }
  else  
      digitalWrite(ledPin2, LOW);

}

void echoCheck() { // If ping received, set the sensor distance to array.
  if (sonar[currentSensor].check_timer())
    cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

void oneSensorCycle() { // Sensor ping cycle complete, do something with the results.
  for (uint8_t i = 0; i < SONAR_NUM; i++) {
    Serial.print(i);
    Serial.print("=");
    Serial.print(cm[i]);
    Serial.print("cm ");
  }
  Serial.println();
}

Muchas gracias, probaré con lo que me comentas a ver que tal.

Un saludo.