2 untasonic HC-SR04 and 2 relays

Hello, I am trying to do this logic:

If HC-SR04 1 detects distance lower than 15cm and HC-SR04 2 distance is greater than 10cm, turn on and off relay 1 and disable relay 2 ( and keep looping this ON and OFF )
If HC-SR04 2 detects distance lower than 10cm and HC-SR04 1 distance is greater than 10cm turn on and off ( in loop ) relay 2 and disable relay 1( and keep looping this ON and OFF until the condiotion for logic 1 returns )

but I'm having crazy returns in the relay and distance reading.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//(rs,e,d4,d5,d6,d7)

const int TRIG_PIN = 9; // Arduino pin connected to Ultrasonic Sensor's TRIG pin
const int ECHO_PIN = 8; // Arduino pin connected to Ultrasonic Sensor's ECHO pin
const int RELAY_PIN1 = 13; // Arduino pin connected to Relay's pin
const int DISTANCE_THRESHOLD = 50; // centimeters
const int RELAY_PIN2 = 10;
#define tmpliga 2000
#define tmpdesliga 2000
const int btrigPin = 7; //sensor B
const int bechoPin = 6; //sensor B

// variables will change:
float duration_us, distance_cm;

void setup() {
Serial.begin (9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("test");
delay(5000);
lcd.clear();
// initialize serial port
pinMode(TRIG_PIN, OUTPUT); // set arduino pin to output mode
pinMode(ECHO_PIN, INPUT); // set arduino pin to input mode
pinMode(btrigPin, OUTPUT);
pinMode(bechoPin, INPUT);
pinMode(RELAY_PIN1, OUTPUT);
pinMode(RELAY_PIN2, OUTPUT);
digitalWrite(RELAY_PIN1, HIGH);
digitalWrite(RELAY_PIN2, HIGH);

}

void loop() {
int duration_usB, distance_cmB;
digitalWrite(btrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(btrigPin, LOW);
duration_usB = pulseIn( bechoPin, HIGH);
distance_cmB = 0.017 * duration_usB;

int duration_us; distance_cm;
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = 0.017 * duration_us;

// generate 10-microsecond pulse to TRIG pin
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);

digitalWrite(btrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(btrigPin, LOW);

if((distance_cm <=15) && (distance_cmB>=10));
{
digitalWrite(RELAY_PIN2, LOW);
digitalWrite(RELAY_PIN1, HIGH); // turn on Relay
delay(tmpliga);
digitalWrite(RELAY_PIN1,LOW);
digitalWrite(RELAY_PIN2, LOW);
delay(tmpdesliga);

if((distance_cm >=15) &&(distance_cmB <10));

digitalWrite(RELAY_PIN1, LOW);
digitalWrite(RELAY_PIN2, HIGH); // turn on Relay
delay(tmpliga);
digitalWrite(RELAY_PIN2,LOW);
delay(tmpdesliga);}







 //while(distance_cmB <=10) {
// digitalWrite(RELAY_PIN1, LOW);

 // turn off Relay

//if (distance_cmB <=5 )

//{

// digitalWrite(RELAY_PIN1,LOW);
//digitalWrite(RELAY_PIN2, HIGH); // turn on Relay
// delay(tmpliga);
// digitalWrite(RELAY_PIN2,LOW);
// delay(tmpdesliga);}

// print the value to Serial Monitor
Serial.print("distance: ");
Serial.print(distance_cm);
Serial.println(" cm");

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tanque2:");
lcd.print(distance_cm);
lcd.setCursor(0, 1);
lcd.print("Tanque1:");
lcd.print(distance_cmB);

delay(500);
}

I suspect you are not waiting for the echo from one sensor to die down before you enable the second sensor pulse. Compute the time needed in milliseconds for the echos to die away and delay that time.

How do I do that? I'm very beginner in code. Thank you.

Leave a longer gap between triggering your sensors.

Start at around 30ms.

Typically 30 milliseconds.

Try this sketch. It limits the ping interval to 30 milliseconds.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//(rs,e,d4,d5,d6,d7)

const int TriggerPinA = 9; // Arduino pin connected to Ultrasonic Sensor's TRIG pin
const int EchoPinA = 8; // Arduino pin connected to Ultrasonic Sensor's ECHO pin
const int TriggerPinB = 7; //sensor B
const int EchoPinB = 6; //sensor B

const int RELAY_PIN1 = 13; // Arduino pin connected to Relay's pin
const int RELAY_PIN2 = 10;
const unsigned tmpliga = 2000;
const unsigned tmpdesliga = 2000;

// variables will change:
float duration_us, distance_cm;

unsigned GetDistanceCM(int triggerPin, int echoPin)
{
  static unsigned long lastTriggerTime = 0;
  unsigned long currentTime = millis();

  // Speed of sound:
  // 343 meters per second
  // == 0.002915452 seconds per meter
  // == 2915.452 microseconds per meter
  const float MicrosecondsPerCM = 29.15452;
  const float MicrosecondsPerRoundTripCM = MicrosecondsPerCM * 2;

  const unsigned MinTriggerInterval = 30;
  
  if (currentTime - lastTriggerTime < MinTriggerInterval)
    delay(MinTriggerInterval - (currentTime - lastTriggerTime));

  lastTriggerTime = currentTime;
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  unsigned long duration = pulseIn(echoPin, HIGH, 30000ul);
  return duration / MicrosecondsPerRoundTripCM;
}

void setup()
{
  // initialize serial port
  Serial.begin (115200);
  delay(200);

  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("test");
  delay(5000);
  lcd.clear();

  pinMode(TriggerPinA, OUTPUT); // set arduino pin to output mode
  pinMode(EchoPinA, INPUT); // set arduino pin to input mode
  pinMode(TriggerPinB, OUTPUT);
  pinMode(EchoPinB, INPUT);

  digitalWrite(RELAY_PIN1, HIGH);
  pinMode(RELAY_PIN1, OUTPUT);
  digitalWrite(RELAY_PIN2, HIGH);
  pinMode(RELAY_PIN2, OUTPUT);
}

void loop()
{
  static boolean blink1 = false;
  static boolean blink2 = false;

  unsigned distanceA = GetDistanceCM(TriggerPinA, EchoPinA);
  unsigned distanceB = GetDistanceCM(TriggerPinB, EchoPinB);
  
  Serial.print("distanceA: ");
  Serial.print(distanceA);
  Serial.println(" cm");
  Serial.print("distanceB: ");
  Serial.print(distanceB);
  Serial.println(" cm");

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Tanque2:");
  lcd.print(distanceA);
  lcd.setCursor(0, 1);
  lcd.print("Tanque1:");
  lcd.print(distanceB);

  if (distanceA != 0 && distanceB != 0)
  {
    blink1 = distanceA <= 15 && distanceB >= 10;
    blink2 = distanceA >= 15 && distanceB < 10;
  }

  if (blink1)
  {
    digitalWrite(RELAY_PIN2, LOW);
    digitalWrite(RELAY_PIN1, HIGH); // turn on Relay
    delay(tmpliga);
    digitalWrite(RELAY_PIN1, LOW);
    delay(tmpdesliga);
  }

  if (blink2)
  {
    digitalWrite(RELAY_PIN1, LOW);
    digitalWrite(RELAY_PIN2, HIGH); // turn on Relay
    delay(tmpliga);
    digitalWrite(RELAY_PIN2, LOW);
    delay(tmpdesliga);
  }
}

Sir johnwasser, you are a mage of Arduino! That worked, I just made a change that I realized after your code that was returning one of the problems that was making the relays cycle between themselves :

 if (blink1)
  {
   //digitalWrite(RELAY_PIN2, LOW);  **<< I REMOVED THIS LINE**
    digitalWrite(RELAY_PIN1, HIGH); // turn on Relay
    delay(tmpliga);
    digitalWrite(RELAY_PIN1, LOW);
    delay(tmpdesliga);
  }

  if (blink2)
  {
    digitalWrite(RELAY_PIN1, LOW);  **<< I REMOVED THIS LINE**
    digitalWrite(RELAY_PIN2, HIGH); // turn on Relay
    delay(tmpliga);
    digitalWrite(RELAY_PIN2, LOW);
    delay(tmpdesliga);
  }
}

Thank you sir.

I gonna need a lot of help in the future, I hope to find you soon! :slight_smile: