Analog reading to Digital

if ((valA1 > 500) && (valA2 >500) && (valA3<300) && (valA4>300)){
    signalState = ST_GY;

How can i changes this to digital format?

bool D1 = analogRead(A1)>500;
(and so on)
...

if(D1&&D2&&D3&&D4)

Is one way. Hard to tell if it's the best way, as is usual with these "snippet posts" we love to hate. Context is always important.

Please describe what you actually want to do.

2 Likes

I am railroading, i have 3 tracks going in and out of a tunnel. I have Analog Sensors in the track and also digital sensors in fixtures. I am going make signals Red & Green to show a track in the tunnel is occupied.

Okay, so what I suggested should work, though it's a tad inelegant. Did you try it? Or is there something you don't understand in what I wrote? I can't see the confusion on your face from here.

1 Like

This is the original code and it works with Analog sensors. I would like to use the same with the digital sensors.

int Sensor1 = A0; //Sensor 1 is setup on pin A0
int Sensor2 = A1; //Sensor 2 is setup on pin A1
int Green1 = 13; // Green Signal 1 is digital pin 2
int Yellow1 = 3;// Yellow Signal 1 is digital pin 3
int Red1 = 4;// Red Signal 1 is digital pin 4
int Green2 = 5;// Green Signal 2 is digital pin 5
int Yellow2 = 6;// Yellow Signal 1 is digital pin 6
int Red2 = 7;//Red Signal 2 is digital pin 7
int blockASend=8;// The transmit pin for the previous block in the sequence
int blockBSend=9;// The transmit pin for the next block in the sequence
int blockARec=10;// The recieve pin for the previous block in the sequence
int blockBRec=11;// The recieve pin for the next block in the sequence
int clearcount;

void setup() {
  Serial.begin(9600);

  //Establish all of our pins at inputs or outputs

  pinMode(Sensor1, INPUT);
  pinMode(Sensor2, INPUT);
  pinMode(Green1, OUTPUT);
  pinMode(Yellow1, OUTPUT);
  pinMode(Red1, OUTPUT);
  pinMode(Green2, OUTPUT);
  pinMode(Yellow2, OUTPUT);
  pinMode(Red2, OUTPUT);
  pinMode(blockASend, OUTPUT);
  pinMode(blockBSend, OUTPUT);
  pinMode(blockARec, INPUT);
  pinMode(blockBRec, INPUT);
  
}

enum SIGNALSTATES
{
  ST_GG,
  ST_GY,
  ST_YG,
  ST_YY,
  ST_RR1,
  ST_RR2,
  ST_RR3,
  ST_YY1,
}; //Sets up different signal states for the entire program

SIGNALSTATES signalState = ST_GG; //Sets default state to Green and Green

void loop(){
  int valA1 = analogRead(Sensor1);
  int valA2 = analogRead(Sensor2);
  int valA3 = digitalRead(blockARec);
  int valA4 = digitalRead(blockBRec);
  // Sets up the values of the different signals we will be reading
  Serial.println(valA1);
  Serial.println(valA2);
  Serial.println(valA3);
  Serial.println(valA4);
  // Sets up the different values to be read on the serial monitor in the Arduino IDE
  delay(200);

  switch(signalState)
  {
    case ST_GG:
    signalgg(valA1, valA2, valA3, valA4);
    break;
    case ST_GY:
    signalgy(valA1, valA2, valA3, valA4);
    break;
    case ST_YG:
    signalyg(valA1, valA2, valA3, valA4);
    break;
    case ST_YY:
    signalyy(valA1, valA2, valA3, valA4);
    break;
    case ST_RR1:
    signalrr1(valA1, valA2, valA3, valA4);
    break;
    case ST_RR2:
    signalrr2(valA1, valA2, valA3, valA4);
    break;
    case ST_RR3:
    signalrr3(valA1, valA2, valA3, valA4);
    break;
    case ST_YY1:
    signalyy1(valA1, valA2, valA3, valA4);
    break;
    //this sets up our different loops within the main loop for our different signal states
  }
}

void signalgg(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, LOW); //Sets Green1 to ON
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, LOW); //Sets Green2 to ON
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);
  clearcount=0;

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==1)){
    signalState = ST_GY;//block not occupied but Block B is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==0)){
    signalState = ST_YG;//block not occupied but Block A is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==1)){
    signalState = ST_YY;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalgy(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, LOW); //Sets Green1 to ON
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, LOW);//Sets Yellow2 to ON
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GG;//block not occupied No adjacent blocks occupied
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==0)){
    signalState = ST_YG;//block not occupied but Block A is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==1)){
    signalState = ST_YY;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalyg(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, LOW);//Sets Yellow1 to ON
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, LOW);//Sets Green2 to ON
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GG;//block not occupied No adjacent blocks occupied
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==1)){
    signalState = ST_GY;//block not occupied but Block B is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==1)){
    signalState = ST_YY;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalyy(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, LOW);//Sets Yellow1 to ON
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, LOW);//Sets Yellow2 to ON
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GG;//block not occupied No adjacent blocks occupied
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GY;//block not occupied but Block B is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==0)){
    signalState = ST_YG;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalrr1(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, LOW);//Sets Red1 to ON
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, LOW);//Sets Red2 to ON
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, HIGH); //this will transmit a signal to Block B
  delay(200);

  if ((valA1>500) && (valA2<500)){
    signalState = ST_RR3; //switched to transition Red signal state
  }
}

void signalrr2(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, LOW);//Sets Red1 to ON
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, LOW);//Sets Red2 to ON
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, 1023); //this will transmit a signal to Block B
  delay(200);

  if ((valA1<500) && (valA2>HIGH)){
    signalState = ST_RR3; //switched to transition Red signal state
  }
}

void signalrr3(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, LOW);//Sets Red1 to ON
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, LOW);//Sets Red2 to ON
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, HIGH); //this will transmit a signal to Block B
  delay(200);

  if ((valA1>500) && (valA2>500)){
    signalState = ST_YY1;
  }
}

void signalyy1(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, HIGH); //this will transmit a signal to Block B
  delay(1000);

    if ((valA1>500) && (valA2>500) && (clearcount<5)){
    clearcount++;
    }
    else if((valA1<500) || (valA2<500) && clearcount<5){ clearcount=0;
    }
    else if((valA1>500) && (valA2>500) && (clearcount>4)){
   signalState = ST_GG;
    }
  
}

You should be used to my confusion, you have helped me many times before.

1 Like

Yup. So again, do you understand what I'm suggesting? Convert each of your analog readings to a digital variable, then do the comparisons using those variables.
The conversion to a digital is best done once in a section that checks each.
But for what you've described so far, there's little to gain, unless you have further logic than you've shown.

Yes,

I am working on that now.

Thanks

1 Like

So I tried to do it but no luck, I added the bool steps and it compiled but when i went to use them it was a no go.

Any help would be appreciated.

int Sensor1 = A0; //Sensor 1 is setup on pin A0
int Sensor2 = A1; //Sensor 2 is setup on pin A1
int Green1 = 13; // Green Signal 1 is digital pin 2
int Yellow1 = 3;// Yellow Signal 1 is digital pin 3
int Red1 = 4;// Red Signal 1 is digital pin 4
int Green2 = 5;// Green Signal 2 is digital pin 5
int Yellow2 = 6;// Yellow Signal 1 is digital pin 6
int Red2 = 7;//Red Signal 2 is digital pin 7
int blockASend=8;// The transmit pin for the previous block in the sequence
int blockBSend=9;// The transmit pin for the next block in the sequence
int blockARec=10;// The recieve pin for the previous block in the sequence
int blockBRec=11;// The recieve pin for the next block in the sequence
int clearcount;

void setup() {
  Serial.begin(9600);

  //Establish all of our pins at inputs or outputs

  pinMode(Sensor1, INPUT);
  pinMode(Sensor2, INPUT);
  pinMode(Green1, OUTPUT);
  pinMode(Yellow1, OUTPUT);
  pinMode(Red1, OUTPUT);
  pinMode(Green2, OUTPUT);
  pinMode(Yellow2, OUTPUT);
  pinMode(Red2, OUTPUT);
  pinMode(blockASend, OUTPUT);
  pinMode(blockBSend, OUTPUT);
  pinMode(blockARec, INPUT);
  pinMode(blockBRec, INPUT);
  
}

enum SIGNALSTATES
{
  ST_GG,
  ST_GY,
  ST_YG,
  ST_YY,
  ST_RR1,
  ST_RR2,
  ST_RR3,
  ST_YY1,
}; //Sets up different signal states for the entire program

SIGNALSTATES signalState = ST_GG; //Sets default state to Green and Green

void loop(){
  int valA1 = analogRead(Sensor1);
  int valA2 = analogRead(Sensor2);
  int valA3 = digitalRead(blockARec);
  int valA4 = digitalRead(blockBRec);
  // Sets up the values of the different signals we will be reading
  Serial.println(valA1);
  Serial.println(valA2);
  Serial.println(valA3);
  Serial.println(valA4);
  // Sets up the different values to be read on the serial monitor in the Arduino IDE
  delay(200);

  bool D1 =analogRead(valA1)>500;
  bool D2 =analogRead(valA1)<500;
  bool D3 =analogRead(valA2)>500;
  bool D4 =analogRead(valA2)<500;
  bool D5 =analogRead(valA3)>0;
  bool D6 =analogRead(valA3)<1;
  bool D7 =analogRead(valA4)>0;
  bool D8 =analogRead(valA4)<1;

  switch(signalState)
  {
    case ST_GG:
    signalgg(valA1, valA2, valA3, valA4);
    break;
    case ST_GY:
    signalgy(valA1, valA2, valA3, valA4);
    break;
    case ST_YG:
    signalyg(valA1, valA2, valA3, valA4);
    break;
    case ST_YY:
    signalyy(valA1, valA2, valA3, valA4);
    break;
    case ST_RR1:
    signalrr1(valA1, valA2, valA3, valA4);
    break;
    case ST_RR2:
    signalrr2(valA1, valA2, valA3, valA4);
    break;
    case ST_RR3:
    signalrr3(valA1, valA2, valA3, valA4);
    break;
    case ST_YY1:
    signalyy1(valA1, valA2, valA3, valA4);
    break;
    //this sets up our different loops within the main loop for our different signal states
  }
}

  
void signalgg(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, LOW); //Sets Green1 to ON
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, LOW); //Sets Green2 to ON
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);
  clearcount=0;

  if (D1&&D3&&D6&&D7){
    signalState = ST_GY;//block not occupied but Block B is
  }
   if (D1&&D3&&D5&&D8){
    signalState = ST_YG;//block not occupied but Block A is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==1)){
    signalState = ST_YY;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalgy(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, LOW); //Sets Green1 to ON
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, LOW);//Sets Yellow2 to ON
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GG;//block not occupied No adjacent blocks occupied
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==0)){
    signalState = ST_YG;//block not occupied but Block A is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==1)){
    signalState = ST_YY;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalyg(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, LOW);//Sets Yellow1 to ON
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, LOW);//Sets Green2 to ON
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GG;//block not occupied No adjacent blocks occupied
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==1)){
    signalState = ST_GY;//block not occupied but Block B is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==1)){
    signalState = ST_YY;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalyy(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, LOW);//Sets Yellow1 to ON
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, LOW);//Sets Yellow2 to ON
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, LOW); //this will not transmit a signal to Block A
  digitalWrite(blockBSend, LOW); //this will not transmit a signal to Block B
  delay(200);

  if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GG;//block not occupied No adjacent blocks occupied
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==0) && (valA4==0)){
    signalState = ST_GY;//block not occupied but Block B is
  }
   if ((valA1 > 500) && (valA2 >500) && (valA3==1) && (valA4==0)){
    signalState = ST_YG;//block not occupied but Block B and Block A are
  }
   if ((valA1 < 500) && (valA2 >500)){
    signalState = ST_RR1;// block is occupied entered from Sensor1
   }
    if ((valA1 > 500) && (valA2 <500)){
    signalState = ST_RR2;// block is occupied entered from Sensor2
   }
}

void signalrr1(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, LOW);//Sets Red1 to ON
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, LOW);//Sets Red2 to ON
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, HIGH); //this will transmit a signal to Block B
  delay(200);

  if ((valA1>500) && (valA2<500)){
    signalState = ST_RR3; //switched to transition Red signal state
  }
}

void signalrr2(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, LOW);//Sets Red1 to ON
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, LOW);//Sets Red2 to ON
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, 1023); //this will transmit a signal to Block B
  delay(200);

  if ((valA1<500) && (valA2>HIGH)){
    signalState = ST_RR3; //switched to transition Red signal state
  }
}

void signalrr3(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Red1, LOW);//Sets Red1 to ON
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red2, LOW);//Sets Red2 to ON
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, HIGH); //this will transmit a signal to Block B
  delay(200);

  if ((valA1>500) && (valA2>500)){
    signalState = ST_YY1;
  }
}

void signalyy1(int valA1, int valA2, int valA3, int valA4){
  digitalWrite(Green1, HIGH);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Red1, HIGH);
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red2, HIGH);
  digitalWrite(blockASend, HIGH); //this will transmit a signal to Block A
  digitalWrite(blockBSend, HIGH); //this will transmit a signal to Block B
  delay(1000);

    if ((valA1>500) && (valA2>500) && (clearcount<5)){
    clearcount++;
    }
    else if((valA1<500) || (valA2<500) && clearcount<5){ clearcount=0;
    }
    else if((valA1>500) && (valA2>500) && (clearcount>4)){
   signalState = ST_GG;
    }
  
}type or paste code here

Be more descriptive with your expectations versus your observations.

[edit] You have nine delays totaling over two seconds. Might the trains pass the sensor before being detected?

2 Likes

So this is what I have so far, just working on center rail to start. The lights trip from the Left side no problem. But they will not reset when i trip the second sensor when leaving. Also it just works in one direction. Trying to keep it simple with just red and green lights.

Any help would be appreciated..

const int sensorPin1 = A14; // Define pin connected to first sensor
const int sensorPin2 = A2; // Define pin connected to second sensor
const int green_rightPin2 = 14;//Center pin Right green
const int red_rightPin5 = 10;//Center pin Right red
const int green_leftPin2 = 34;//Center pin Left green
const int red_leftPin5 = 35;//Center pin Left red

int sensorState1 = HIGH;  // Variable to store sensor state for first sensor
int sensorState2 = HIGH;  // Variable to store sensor state for second sensor 
int prevSensorState1 = LOW; // Variable to store previous state of first sensor
int prevSensorState2 = LOW; // Variable to store previous state of second sensor 

void setup() {
  pinMode(sensorPin1, INPUT); 
  pinMode(sensorPin2, INPUT);
  pinMode(red_rightPin5, OUTPUT); 
  pinMode(green_rightPin2, OUTPUT);
  pinMode(red_leftPin5, OUTPUT); 
  pinMode(green_leftPin2, OUTPUT);
  
  digitalWrite(red_rightPin5, LOW); // Turn off red light initially
  digitalWrite(green_rightPin2, HIGH); // Turn on green light initially
  digitalWrite(red_leftPin5, LOW); // Turn off red light initially
  digitalWrite(green_leftPin2, HIGH); // Turn on green light initially
  delay(2000);
}

void loop() {
  sensorState1 = analogRead(sensorPin1); // Read sensor 1 state
  sensorState2 = analogRead(sensorPin2); // Read sensor 2 state 

  // Check if a train is approaching from the first sensor
  if (sensorState1 == LOW && prevSensorState1 == HIGH) {
    digitalWrite(red_rightPin5, HIGH); // Turn on red light 
    digitalWrite(green_rightPin2, LOW); // Turn off green 
    digitalWrite(red_leftPin5, HIGH); // Turn oN red light 
    digitalWrite(green_leftPin2, LOW); // Turn oFF green light
    delay(2000);
  } 

  // Check if a train is approaching from the second sensor
  if (sensorState2 == LOW  && prevSensorState2 == HIGH) {
    digitalWrite(red_rightPin5, HIGH); // Turn on red light 
    digitalWrite(green_rightPin2, LOW); // Turn off green 
    digitalWrite(red_leftPin5, HIGH); // Turn oN red light 
    digitalWrite(green_leftPin2, LOW); // Turn oFF green light
    delay(2000);
  } 

  // Check if the train has left both sensors
  if (sensorState1 == HIGH && sensorState2 == HIGH) {
   digitalWrite(red_rightPin5, LOW); // Turn off red light 
   digitalWrite(green_rightPin2, HIGH); // Turn on green light 
   digitalWrite(red_leftPin5, LOW); // Turn off red light 
   digitalWrite(green_leftPin2, HIGH); // Turn on green light 
   delay(2000); 
  }

  // Update previous sensor states
  prevSensorState1 = sensorState1; 
  prevSensorState2 = sensorState2; 
}


You are using a Mega2560?

I doubt that. Describe "works" and describe how each state of the project should proceed. All I am seeing is a set of LEDs always on.

You are using analog sensors as digital sensors... and the code does not show which is which. Make your code describe every device without knowing "1" is one thing and "2" is another.

I am using a Mega so i can add more block to the same controller for the rest of my layout.

Can we modify the Level crossing program to do this? Is there a way to look for codes that we have posted before?

not sure where this came from, that's an old post.

Sorry, I thought you wanted to find an old post.

1 Like

The hole point of doing that was so you didn't need to do things like this elsewhere:

if ((valA1 < 500) && (valA2 >500)){

But you've made all the bool variables local to the loop() function.

Learn or review the concept of scope as it applies to C/C++ variables.

Decide whether you want to use functions with parameters, and pass arguments to them when you call them, or whether it is easier for you to just use global variables available to everyone everywhere.

a7

1 Like