//#include <MsTimer2.h> // Uso MsTimer2 para evitar conflictos con servo.h
#include <Servo.h>
#include <LowPower.h>
// Servomotores para las barreras
Servo barrera1;
Servo barrera2;
const int pinBarrera1 = 3;
const int pinBarrera2 = 5;
// zumbador
const int pinZumbador = 8;
//sensor ultrasónico 1
const int pinTrig1 = 9;
const int pinEcho1 = 10;
int distanciaSensor1;
long duracionSensor1;
// sensor ultrasónico 2
const int pinTrig2 = 11;
const int pinEcho2 = 12;
int distanciaSensor2;
long duracionSensor2;
// LED
const int pinLedRojo = 2; // Pin del LED
static bool estadoLedRojo = LOW;
const unsigned long interval = 1000000; //determina el tiempo entre encendido y apagado del LED
//banderas
bool trenCruzando = false;
bool trenAproximandose = false;
void setup() {
Serial.begin(9600); // Inicializar comunicación serial
pinMode(pinZumbador, OUTPUT);
barrera1.attach(pinBarrera1); // Pin del servomotor 1
barrera2.attach(pinBarrera2); // Pin del servomotor 2
// Posición inicial de las barreras: alta
barrera1.write(0);
barrera2.write(0);
pinMode(pinTrig1, OUTPUT); // Pin del sensor 1
pinMode(pinEcho1, INPUT); // Pin del sensor 1
pinMode(pinTrig2, OUTPUT); // Pin del sensor 2
pinMode(pinEcho2, INPUT); // Pin del sensor 2
pinMode(pinZumbador, OUTPUT); // Pin del zumbador
// Modo de bajo consumo si no hay tren cruzando
if (trenCruzando == false) {
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // Dormir por 8 segundos
}
}
void loop() {
detectarTren(); //funcion para detectar tren con el primer sensor (pin 9 y 10)
//Ahorro de energia
if (trenCruzando == false) {
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // Dormir por 8 segundos
}
trenYaPaso(); //funcion que detecta si el tren ya cruzo con el segundo sensor (pin 11 y 12)
if (trenAproximandose) {
activarCruce();
trenAproximandose = false;
}
if (trenCruzando) {
Serial.println("BARRERA BAJA ¡TREN CRUZANDO! (cruce activo)");
encenderLEDRojo();
if (distanciaSensor1 > 30 || distanciaSensor2 < 30) {
desactivarCruce();
}
}
else {
Serial.println("BARRERA ALTA, PUEDE PASAR... (cruce desactivado)");
// barreras altas
barrera1.write(0);
barrera2.write(0);
digitalWrite(pinLedRojo, LOW); // Desactivar LED rojo
digitalWrite(pinZumbador, LOW); // Desactivar zumbador
}
}
void encenderLEDRojo() {
if (trenCruzando) {
Serial.println("El Led Rojo esta parpadeando (cruce activo)");
digitalWrite(pinLedRojo, estadoLedRojo); // nuevo estado al LED
estadoLedRojo = !estadoLedRojo; // Cambiar el estado del LED
} else {
digitalWrite(pinLedRojo, LOW); // si no hay tren cruzando el LED esta apagado
}
}
void detectarTren() {
digitalWrite(pinTrig1, LOW);
delayMicroseconds(2);
digitalWrite(pinTrig1, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig1, LOW);
duracionSensor1 = pulseIn(pinEcho1, HIGH);
distanciaSensor1 = duracionSensor1 * 0.034 / 2;
if (distanciaSensor1 < 30 && !trenCruzando) {
trenAproximandose = true;
}
}
void trenYaPaso() {
digitalWrite(pinTrig2, LOW);
delayMicroseconds(2);
digitalWrite(pinTrig2, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig2, LOW);
duracionSensor2 = pulseIn(pinEcho2, HIGH);
distanciaSensor2 = duracionSensor2 * 0.034 / 2;
if (distanciaSensor2 < 30 && !trenCruzando) {
trenCruzando = false;
}
}
void activarCruce() {
// Bajar barreras
Serial.println("BARRERA BAJANDO (cruce activo)");
barrera1.write(90);
barrera2.write(90);
// Activar zumbador
digitalWrite(pinZumbador, HIGH); // Se genera el tono en el zumbador
Serial.println("El Zumbador comienza a sonar (cruce activo)");
trenCruzando = true;
}
void desactivarCruce() {
trenCruzando = false;
}