How can I make a if statement that uses if something happens after something?

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.

1 Like

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 ??

1 Like

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 :face_with_raised_eyebrow:

I'm doing assignment like K&R should have done. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.