Hey guys, I am working on this project that uses ultrasonic to measure distance then activate a relay when a certain distance is met and so on. It worked well with one ultrasonic and the relay module. I got confused when I have 2 ultrasonics measuring 2 different things.
The code below works ok but the delay to blink the relay would delay the entire loop. Just curious if there is a more efficient way to do this.
Thanks in advance.
#define ultrasonic1_vcc 13
#define ultrasonic2_vcc 12
#define red_light1 10
#define green_light1 9
#define red_light2 8
#define green_light2 7
#define ultrasonic1_echoPin 5
#define ultrasonic1_trigPin 4
#define ultrasonic2_echoPin 3
#define ultrasonic2_trigPin 2
void setup() {
Serial.begin (9600);
pinMode(ultrasonic1_vcc, OUTPUT);
digitalWrite(ultrasonic1_vcc, HIGH);
pinMode(ultrasonic2_vcc, OUTPUT);
digitalWrite(ultrasonic2_vcc, HIGH);
pinMode(ultrasonic1_trigPin, OUTPUT);
pinMode(ultrasonic1_echoPin, INPUT);
pinMode(ultrasonic2_trigPin, OUTPUT);
pinMode(ultrasonic2_echoPin, INPUT);
pinMode(green_light1, OUTPUT);
pinMode(red_light1, OUTPUT);
pinMode(green_light2, OUTPUT);
pinMode(red_light2, OUTPUT);
}
void loop() {
long ultrasonic1_duration, ultrasonic1_distance;
digitalWrite(ultrasonic1_trigPin, LOW);
delayMicroseconds(2);
digitalWrite(ultrasonic1_trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(ultrasonic1_trigPin, LOW);
ultrasonic1_duration = pulseIn(ultrasonic1_echoPin, HIGH);
ultrasonic1_distance = (ultrasonic1_duration/2) / 29;
long ultrasonic2_duration, ultrasonic2_distance;
digitalWrite(ultrasonic2_trigPin, LOW);
delayMicroseconds(2);
digitalWrite(ultrasonic2_trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(ultrasonic2_trigPin, LOW);
ultrasonic2_duration = pulseIn(ultrasonic2_echoPin, HIGH);
ultrasonic2_distance = (ultrasonic2_duration/2) / 29;
if (ultrasonic1_distance <= 15){
Serial.print(ultrasonic1_distance);
Serial.println(" cm roll 1 still full Green Light On");
digitalWrite(green_light1, LOW);
digitalWrite(red_light1, HIGH);
}
else {
if (ultrasonic1_distance > 15 && ultrasonic1_distance <= 18){
Serial.print(ultrasonic1_distance);
Serial.println(" cm roll 1 is running low Red Light On");
digitalWrite(green_light1, HIGH);
digitalWrite(red_light1, LOW);
}
else {
Serial.print(ultrasonic1_distance);
Serial.println(" cm roll 1 critically low Red Light Blinking");
digitalWrite(green_light1, HIGH);
digitalWrite(red_light1, HIGH);
delay(400);
digitalWrite(red_light1, LOW);
delay(400);
}
}
if (ultrasonic2_distance <= 15){
Serial.print(ultrasonic2_distance);
Serial.println(" cm roll 2 still full Green Light On");
digitalWrite(green_light2, LOW);
digitalWrite(red_light2, HIGH);
}
else {
if (ultrasonic2_distance > 15 && ultrasonic2_distance <= 18){
Serial.print(ultrasonic2_distance);
Serial.println(" cm roll 2 is running low Red Light On");
digitalWrite(green_light2, HIGH);
digitalWrite(red_light2, LOW);
}
else {
Serial.print(ultrasonic2_distance);
Serial.println(" cm roll 2 critically low Red Light Blinking");
digitalWrite(green_light2, HIGH);
digitalWrite(red_light2, HIGH);
delay(400);
digitalWrite(red_light2, LOW);
delay(400);
}
}
delay(100);
}