So I want to make a project where it tells you from which direction something came from and is going. I have two IR sensors, one for the left and one for the right. The idea was to have the code be if (digitalRead(12) == LOW && digitalRead(13) == LOW) {
(turn on lights in that direction)
}
Unfortunately that does not get me the outcome that is desirable.
So I was wondering how I could make a if statement that only works if say the right sensor goes off after the left one.
Save the time (use millis()) when each sensor is activated. Then compare the times to know which one was first.
Welcome to the forum
We are going to know a lot more details before providing any answers. Start by posting your full sketch that does not do what you want. Help us by giving the pins names rather than using anonymous numbers and use code tags when you post the code
check which sensor is on first
if (digitalRead(left) == LOW && digitalRead(right) == HIGH) first ='l';
else if (digitalRead(right) == LOW && digitalRead(right) == HIGH) first ='r';
if (digitalRead(left) == LOW && digitalRead(left) == LOW)
{
Serial.println(F("first was ")); Serial.println(first);
}
or vice versa, which one is first off...
here is the full code:
//sensors
int right = 12;
int left = 13;
void setup() {
//lights
pinMode(53,OUTPUT); // rightmost light
pinMode(51,OUTPUT);
pinMode(49,OUTPUT);
pinMode(47,OUTPUT);
pinMode(45,OUTPUT);
pinMode(43,OUTPUT);
pinMode(41,OUTPUT);
pinMode(39,OUTPUT);
pinMode(37,OUTPUT); // leftmost light
//IR sensors
pinMode(13,INPUT);
pinMode(12,INPUT);
}
void loop() {
if (digitalRead(right) == LOW && digitalRead(left) == LOW ) { //this is meant to only be set off if the left sensor goes off after the right
//turn the lights on from right to left
digitalWrite(53,HIGH);
delay(1000);
digitalWrite(53,LOW);
digitalWrite(51,HIGH);
delay(1000);
digitalWrite(51,LOW);
digitalWrite(49,HIGH);
delay(1000);
digitalWrite(49,LOW);
digitalWrite(47,HIGH);
delay(1000);
digitalWrite(47,LOW);
digitalWrite(45,HIGH);
delay(1000);
digitalWrite(45,LOW);
digitalWrite(43,HIGH);
delay(1000);
digitalWrite(43,LOW);
digitalWrite(41,HIGH);
delay(1000);
digitalWrite(41,LOW);
digitalWrite(39,HIGH);
delay(1000);
digitalWrite(39,LOW);
digitalWrite(37,HIGH);
delay(1000);
digitalWrite(37,LOW);
}
else if (digitalRead(left) == LOW && digitalRead(right) == LOW) { // this is only meant to be set off if the right sensor goes off after the left
//turn lights on from left to right
digitalWrite(37,HIGH);
delay(1000);
digitalWrite(37,LOW);
digitalWrite(39,HIGH);
delay(1000);
digitalWrite(39,LOW);
digitalWrite(41,HIGH);
delay(1000);
digitalWrite(41,LOW);
digitalWrite(43,HIGH);
delay(1000);
digitalWrite(43,LOW);
digitalWrite(45,HIGH);
delay(1000);
digitalWrite(45,LOW);
digitalWrite(47,HIGH);
delay(1000);
digitalWrite(47,LOW);
digitalWrite(49,HIGH);
delay(1000);
digitalWrite(49,LOW);
digitalWrite(51,HIGH);
delay(1000);
digitalWrite(51,LOW);
digitalWrite(53,HIGH);
delay(1000);
digitalWrite(53,LOW);
}
else {
//keep lights off
digitalWrite(53,LOW);
digitalWrite(51,LOW);
digitalWrite(49,LOW);
digitalWrite(47,LOW);
digitalWrite(45,LOW);
digitalWrite(43,LOW);
digitalWrite(41,LOW);
digitalWrite(39,LOW);
digitalWrite(37,LOW);
}
}
Hello wanderingtraveler
Check and test this sketch.
I´ve made some mods wrt the if() conditions.
All untested.
//sensors
int right = 12;
int left = 13;
void setup()
//lights
{
pinMode(53, OUTPUT); // rightmost light
pinMode(51, OUTPUT);
pinMode(49, OUTPUT);
pinMode(47, OUTPUT);
pinMode(45, OUTPUT);
pinMode(43, OUTPUT);
pinMode(41, OUTPUT);
pinMode(39, OUTPUT);
pinMode(37, OUTPUT); // leftmost light
//IR sensors
pinMode(13, INPUT);
pinMode(12, INPUT);
}
void loop() {
if (digitalRead(right) == HIGH && digitalRead(left) == LOW ) //this is meant to only be set off if the left sensor goes off after the right
//turn the lights on from right to left
{
digitalWrite(53, HIGH);
delay(1000);
digitalWrite(53, LOW);
digitalWrite(51, HIGH);
delay(1000);
digitalWrite(51, LOW);
digitalWrite(49, HIGH);
delay(1000);
digitalWrite(49, LOW);
digitalWrite(47, HIGH);
delay(1000);
digitalWrite(47, LOW);
digitalWrite(45, HIGH);
delay(1000);
digitalWrite(45, LOW);
digitalWrite(43, HIGH);
delay(1000);
digitalWrite(43, LOW);
digitalWrite(41, HIGH);
delay(1000);
digitalWrite(41, LOW);
digitalWrite(39, HIGH);
delay(1000);
digitalWrite(39, LOW);
digitalWrite(37, HIGH);
delay(1000);
digitalWrite(37, LOW);
}
if (digitalRead(left) == LOW && digitalRead(right) == HIGH) // this is only meant to be set off if the right sensor goes off after the left
//turn lights on from left to right
{
digitalWrite(37, HIGH);
delay(1000);
digitalWrite(37, LOW);
digitalWrite(39, HIGH);
delay(1000);
digitalWrite(39, LOW);
digitalWrite(41, HIGH);
delay(1000);
digitalWrite(41, LOW);
digitalWrite(43, HIGH);
delay(1000);
digitalWrite(43, LOW);
digitalWrite(45, HIGH);
delay(1000);
digitalWrite(45, LOW);
digitalWrite(47, HIGH);
delay(1000);
digitalWrite(47, LOW);
digitalWrite(49, HIGH);
delay(1000);
digitalWrite(49, LOW);
digitalWrite(51, HIGH);
delay(1000);
digitalWrite(51, LOW);
digitalWrite(53, HIGH);
delay(1000);
digitalWrite(53, LOW);
}
if (digitalRead(left) == LOW && digitalRead(right) == LOW)
{
//keep lights off
digitalWrite(53, LOW);
digitalWrite(51, LOW);
digitalWrite(49, LOW);
digitalWrite(47, LOW);
digitalWrite(45, LOW);
digitalWrite(43, LOW);
digitalWrite(41, LOW);
digitalWrite(39, LOW);
digitalWrite(37, LOW);
}
}
unfortunately that code did not work for it
These are the same condition ??
As a state machine
if state = idle
{
if right trigger
{
state := right
}
else if left trigger
{
state := left
}
}
else if state = right
{
if left trigger
{
do left actions
state := idle
}
}
else // must be left state by elimination
{
if right trigger
{
do right actions
state := idle
}
}
or similar
Are you two timing us writing code somewhere else
I'm doing assignment like K&R should have done.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.