Estimados,
Realicé un proyecto para detectar trenes en bloques con sensores IR. El problema que tengo es que debería poder analizar el bloque en el que me encuentro y prender los semáforos del bloque anterior y posterior.
He tratado pero el proyecto parece un arbolito de navidad encendiendo y apagando leds.
Les dejo el diagrama de placa y el código para ver si alguien puede ayudarme.
Muchas gracias!
// Sensores IR
int Sensor1 = A0; //Sensor 1 is setup on pin A0
int Sensor2 = A1; //Sensor 2 is setup on pin A1
int Sensor3 = A2;
int Sensor4 = A3;
int Sensor5 = A4;
int Sensor6 = A5;
int Sensor7 = A6;
int Sensor8 = A7;
int Sensor9 = A8;
int Sensor10 = A9;
int Sensor11 = A10;
int Sensor12 = A11;
// Leds verdes y rojos
int Green1 = 7;
int Red1 = 6;
int Green2 = 4;
int Red2 = 3;
int Green3 = 22;
int Red3 = 24;
int Green4 = 26;
int Red4 = 28;
int Green5 = 30;
int Red5 = 32;
int Green6 = 34;
int Red6 = 36;
int Green7 = 40;
int Red7 = 42;
int Green8 = 46;
int Red8 = 48;
int Green9 = 23;
int Red9 = 25;
int Green10 = 29;
int Red10 = 31;
int Green11 = 35;
int Red11 = 37;
// banderas para determinar su estado anterior
int bloq1 = 0;
int bloq2 = 0;
int bloq3 = 0;
int bloq4 = 0;
int bloq5 = 0;
int bloq6 = 0;
int bloq7 = 0;
int bloq8 = 0;
int bloq9 = 0;
int bloq10 = 0;
int bloq11 = 0;
void setup() {
Serial.begin(9600);
//Establish all of our pins at inputs or outputs
// Inicializo los sensores IR
pinMode(Sensor1, INPUT);
pinMode(Sensor2, INPUT);
pinMode(Sensor3, INPUT);
pinMode(Sensor4, INPUT);
pinMode(Sensor5, INPUT);
pinMode(Sensor6, INPUT);
pinMode(Sensor7, INPUT);
pinMode(Sensor8, INPUT);
pinMode(Sensor9, INPUT);
pinMode(Sensor10, INPUT);
pinMode(Sensor11, INPUT);
pinMode(Sensor12, INPUT);
// Inicializo los leds
pinMode(Green1, OUTPUT);
pinMode(Red1, OUTPUT);
pinMode(Green2, OUTPUT);
pinMode(Red2, OUTPUT);
pinMode(Green3, OUTPUT);
pinMode(Red3, OUTPUT);
pinMode(Green4, OUTPUT);
pinMode(Red4, OUTPUT);
pinMode(Green5, OUTPUT);
pinMode(Red5, OUTPUT);
pinMode(Green6, OUTPUT);
pinMode(Red6, OUTPUT);
pinMode(Green7, OUTPUT);
pinMode(Red7, OUTPUT);
pinMode(Green8, OUTPUT);
pinMode(Red8, OUTPUT);
pinMode(Green9, OUTPUT);
pinMode(Red9, OUTPUT);
pinMode(Green10, OUTPUT);
pinMode(Red10, OUTPUT);
pinMode(Green11, OUTPUT);
pinMode(Red11, OUTPUT);
}
// ///////////////// Comienzo el LOOP ///////////////////////////////////////////////////////////////////////
void loop() {
// tomo los valores de los sensores para saber que bloques están ocupados.
int valA1 = analogRead(Sensor1);
int valA2 = analogRead(Sensor2);
int valA3 = analogRead(Sensor3);
int valA4 = analogRead(Sensor4);
int valA5 = analogRead(Sensor5);
int valA6 = analogRead(Sensor6);
int valA7 = analogRead(Sensor7);
int valA8 = analogRead(Sensor8);
int valA9 = analogRead(Sensor9);
int valA10 = analogRead(Sensor10);
int valA11 = analogRead(Sensor11);
int valA12 = analogRead(Sensor12);
// Sets up the values of the different signals we will be reading
Serial.println(valA1);
Serial.println(valA2);
Serial.println(valA3);
Serial.println(valA4);
/* Serial.println(valA5);
Serial.println(valA6);
Serial.println(valA7);
Serial.println(valA8);
Serial.println(valA9);
Serial.println(valA10);
Serial.println(valA11);
Serial.println(valA12);
*/
Serial.println("//////////////");
Serial.println(bloq1);
Serial.println("//////////////");
// Evaluo si hay algún bloque ocupado. Si no hay pongo todo en verde.
if ((valA1 > 300) and (valA2 > 300) and (valA2 > 300) and (valA4 > 300) and (valA5 > 300) and (valA6 > 300) and (valA7 > 300) and (valA8 > 300) and (valA9 > 300) and (valA10 > 300)
and (valA11 > 300) and (bloq1 == 0) and (bloq2 == 0) and (bloq3 == 0) and (bloq4 == 0) and (bloq5 == 0) and (bloq6 == 0) and (bloq7 == 0) and (bloq8 == 0) and (bloq9 == 0)
and (bloq10 == 0) and (bloq11 == 0))
{
digitalWrite(Green1, LOW);
digitalWrite(Red1, HIGH);
digitalWrite(Green2, LOW);
digitalWrite(Red2, HIGH);
digitalWrite(Green3, LOW);
digitalWrite(Red3, HIGH);
digitalWrite(Green4, LOW);
digitalWrite(Red4, HIGH);
digitalWrite(Green5, LOW);
digitalWrite(Red5, HIGH);
digitalWrite(Green6, LOW);
digitalWrite(Red6, HIGH);
digitalWrite(Green7, LOW);
digitalWrite(Red7, HIGH);
digitalWrite(Green8, LOW);
digitalWrite(Red8, HIGH);
digitalWrite(Green9, LOW);
digitalWrite(Red9, HIGH);
digitalWrite(Green10, LOW);
digitalWrite(Red10, HIGH);
digitalWrite(Green11, LOW);
digitalWrite(Red11, HIGH);
//delay(200);
}
else {
// Si hay bloque/a ocupado/s identifico cual o cuales son.
// A futuro podría hacer que si detecta un bloque ocupado no solo ponga su bloque en rojo si no que modifique los valores de VAL siguiente
// para que muestre ocupado y escriba los digitalwrite del bloque pasado en rojo.
// Bloque 1
Serial.println("valA1");
Serial.println(valA1);
Serial.println(bloq1);
if ((valA1 < 300) or (bloq1 == 1)) {
digitalWrite(Green1, HIGH);
digitalWrite(Red1, LOW);
bloq1 = 1;
bloq2 = 0;
}
else {
digitalWrite(Green1, LOW);
digitalWrite(Red1, HIGH);
Serial.println("o por aca");
bloq1 = 0;
}
// Bloque 2
Serial.println("///////////////");
Serial.println("valA2");
Serial.println(valA2);
Serial.println(bloq2);
if ((valA2 < 300) or (bloq2 == 1)) {
digitalWrite(Green2, HIGH);
digitalWrite(Red2, LOW);
bloq2 = 1;
bloq1 = 0;
bloq3 = 0;
}
else {
digitalWrite(Green2, LOW);
digitalWrite(Red2, HIGH);
bloq2 = 0;
}
// Bloque 3
Serial.println("///////////////");
Serial.println("valA3");
Serial.println(valA3);
Serial.println(bloq3);
if ((valA3 < 300) or (bloq3 == 1)) {
digitalWrite(Green3, HIGH);
digitalWrite(Red3, LOW);
bloq3 = 1;
bloq2 = 0;
bloq4 = 0;
}
else {
digitalWrite(Green3, LOW);
digitalWrite(Red3, HIGH);
bloq3 = 0;
}
// Bloque 4
if ((valA4 < 300) or (bloq4 == 1)) {
digitalWrite(Green4, HIGH);
digitalWrite(Red4, LOW);
bloq4 = 1;
bloq3 = 0;
bloq5 = 0;
}
else {
digitalWrite(Green4, LOW);
digitalWrite(Red4, HIGH);
bloq4 = 0;
}
// Bloque 5
if ((valA5 < 300) or (bloq5 == 1)) {
digitalWrite(Green5, HIGH);
digitalWrite(Red5, LOW);
bloq5 = 1;
bloq4 = 0;
bloq6 = 0;
}
else {
digitalWrite(Green5, LOW);
digitalWrite(Red5, HIGH);
bloq5 = 0;
}
if ((valA6 < 300) or (bloq6 == 1)) {
digitalWrite(Green6, HIGH);
digitalWrite(Red6, LOW);
bloq6 = 1;
bloq5 = 0;
bloq7 = 0;
}
else {
digitalWrite(Green6, LOW);
digitalWrite(Red6, HIGH);
bloq6 = 0;
}
if ((valA7 < 300) or (bloq7 == 1)) {
digitalWrite(Green7, HIGH);
digitalWrite(Red7, LOW);
bloq7 = 1;
bloq6 = 0;
bloq8 = 0;
}
else {
digitalWrite(Green7, LOW);
digitalWrite(Red7, HIGH);
bloq7 = 0;
}
if ((valA8 < 300) or (bloq8 == 1)) {
digitalWrite(Green8, HIGH);
digitalWrite(Red8, LOW);
bloq8 = 1;
bloq7 = 0;
bloq9 = 0;
}
else {
digitalWrite(Green8, LOW);
digitalWrite(Red8, HIGH);
bloq8 = 0;
}
if ((valA9 < 300) or (bloq9 == 1)) {
digitalWrite(Green9, HIGH);
digitalWrite(Red9, LOW);
bloq9 = 1;
bloq8 = 0;
bloq10 = 0;
}
else {
digitalWrite(Green9, LOW);
digitalWrite(Red9, HIGH);
bloq9 = 0;
}
if ((valA10 < 300) or (bloq10 == 1)) {
digitalWrite(Green10, HIGH);
digitalWrite(Red10, LOW);
bloq10 = 1;
bloq9 = 0;
bloq11 = 0;
}
else {
digitalWrite(Green10, LOW);
digitalWrite(Red10, HIGH);
bloq10 = 0;
}
if ((valA11 < 300) or (bloq11 == 1)) {
digitalWrite(Green11, HIGH);
digitalWrite(Red11, LOW);
bloq11 = 1;
bloq10 = 0;
}
else {
digitalWrite(Green11, LOW);
digitalWrite(Red11, HIGH);
bloq11 = 0;
}
}
}
// ///////////////////////////// FIN LOOP ///////////////////////////////////////////////