Hi,
I'm pretty new to this so please be kind!
I'm helping a mate out who has asked me to help him with a video wall. He wants the scene to change as someone walks from 4m away from the wall upto the wall, with a signal going via four relay pins to the video controller every 0.5m.
I am using the standard HC-SR04 sensor to measure the distance. I am using four outputs from the Arduino to a 4 channel relay board. The four outputs will give eight different dry closed circuit contacts to the video wall controller.
So far everything works quite well. I want to improve the code because the relays are clicking away all the time (dependent on what delay I've put in).
The video wall controller only requires a 20ms pulse to change the scene and the scene wont change until one of the inputs change. So if the person isn't moving the scene wont change so there is no need to keep sending a signal from the Arduino to the wall controller.
In other words, I want to stop the relays doing their thing until the person moves into a different zone.
As I said I've jumped into this without much experience of coding and I have tried all sorts of things with out success.
Any advice would be much appreciated.
Cheers
// This uses Serial Monitor to display Range Finder distance readings
// and outputs on four digital lines in HEX code.
// Include NewPing Library
#include "NewPing.h"
// Hook up HC-SR04 with Trig to Arduino Pin 2, Echo to Arduino pin 3
//Hook up relay board IN1, IN2, IN3, IN4 to Arduino pins 4,5,6,7
// Maximum Distance is 400 cm
#define trigger_pin 2
#define echo_pin 3
#define max_distance 400
NewPing sonar(trigger_pin, echo_pin, max_distance);
float duration;
float distance;
int iterations = 10;
int d = 1000; // Means I can change all the delays by changing this value
void setup() {
Serial.begin (9600); //Begin serial data
pinMode(4, OUTPUT); //
pinMode(5, OUTPUT); // Define pins as outputs
pinMode(6, OUTPUT); //
pinMode(7, OUTPUT); //
digitalWrite(7, HIGH); // Write pins HIGH
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
void loop() {
delay(50);
duration = sonar.ping_median(iterations); //Calculates duration with 10 iterations
// Determine distance from duration
// Use 343 metres per second as speed of sound
distance = (duration / 2) * 0.0343;
// Send results to Serial Monitor
Serial.print("Duration = ");
Serial.println(duration);
Serial.print(" Distance = ");
if ((distance < 400) && (distance >= 350)) {
Serial.println("Between 4 and 3.5");
digitalWrite(7, HIGH); //
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, LOW); // Activates relay on IN1
delay(d);
digitalWrite(7, HIGH); //Reset all relays to open
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance < 350) && (distance >= 300)) {
Serial.println("Between 3.5 and 3");
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW); //Activates relay IN2
digitalWrite(4, HIGH);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance < 300) && (distance >= 250)) {
Serial.println("Between 3 and 2.5");
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance < 250) && (distance >= 200)) {
Serial.println("Between 2.5 and 2");
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance < 200) && (distance >= 150)) {
Serial.println("Between 2 and 1.5");
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
digitalWrite(4, LOW);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance < 150) && (distance >= 100)) {
Serial.println("Between 1.5 and 1");
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance < 100) && (distance >= 50)) {
Serial.println("Between 1 and 0.5");
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else if ((distance <50) && (distance >=1)) {
Serial.println("Between 0.5 and 0.01");
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
delay(d);
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, HIGH);
digitalWrite(4, HIGH);
}
else
{
Serial.println("Out of range");
}
}