Hi,
I am using two HC-SR04 sensors to detect the position of a ram and basically my aim was to use a couple of relays to switch the polarity and reverse the direction of the ram.
When the first sensor is triggered by the head of the ram it should reverse direction until it hits the second sensor and reverse again. However as far as I can tell the sensor resets as soon as the ram moves away from it and so does the output which triggers it to reverse. This causes the ram to just move back and forth into and out of the range of the first sensor.
My question is, is there a way to program a latch onto the reversing output so that it ignores the first sensor until it can be reset by the second sensor being triggered?
(first time asking a question here so I'm just pasting my code in here)
the delays and relays 1 and 2 are just for circuit protection so I don't trip anything out while reversing the polarity. The relays I would want to latch are 3 and 4. (please excuse any random misprints in the code, I have been fiddling with the circuit and code all day to get it working so there may be a random bracket/ peice of code out of place)
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(relayPin4, LOW);
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
digitalWrite(relayPin3, LOW);
//clears trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
//sets trigPin to HIGH for 10 microseconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
//Reads echoPin input + returns travel time
duration = pulseIn(echoPin, HIGH);
//Calculates distance
distanceCm = duration*0.034/2;
Serial.print("Distance: ");
Serial.println(distanceCm);
Serial.print(distanceCm);
Serial.print(" cm");
//clears trigPin
digitalWrite(trigPin2, LOW);
delayMicroseconds(2);
//sets trigPin to HIGH for 10 microseconds
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
//Reads echoPin input + returns travel time
duration2 = pulseIn(echoPin2, HIGH);
//Calculates distance
distanceCm2 = duration2*0.034/2;
Serial.print("Distance: ");
Serial.println(distanceCm2);
Serial.print(distanceCm2);
Serial.print(" cm");
//relay control section
if(distanceCm < 20)
{
digitalWrite(relayPin1, HIGH);
digitalWrite(relayPin2, HIGH);
delay(500);
digitalWrite(relayPin3, HIGH);
digitalWrite(relayPin4, HIGH);
delay(500);
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
}
if(relayPin3, HIGH){
if(distanceCm2 < 20)
{
digitalWrite(relayPin1, HIGH);
digitalWrite(relayPin2, HIGH);
delay(500);
digitalWrite(relayPin3, LOW);
digitalWrite(relayPin4, LOW);
delay(500);
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
}
}
else{
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
digitalWrite(relayPin3, LOW);
digitalWrite(relayPin4, LOW);
}