#include <BluetoothSerial.
h>
BluetoothSerial BT;
// Pines para SEMAFOROS
// Semáforo 1
int R1 = 2;
int AM1 = 4;
int V1 = 5;
// Semáforo 2
int R2 = 12;
int AM2 = 13;
int V2 = 14;
// Semáforo 3
int R3 = 25;
int AM3 = 26;
int V3 = 27;
// Variables del sistema
String cmd = "";
bool modoAuto = false;
unsigned long lastChange = 0;
int estadoSemaforo = 0; // 0=Verde, 1=Amarillo, 2=Rojo
unsigned long tVerde = 5000;
unsigned long tAmarillo = 2000;
unsigned long tRojo = 5000;
// ======================================
// SETUP
// ======================================
void setup() {
pinMode(R1, OUTPUT); pinMode(AM1, OUTPUT); pinMode(V1, OUTPUT);
pinMode(R2, OUTPUT); pinMode(AM2, OUTPUT); pinMode(V2, OUTPUT);
pinMode(R3, OUTPUT); pinMode(AM3, OUTPUT); pinMode(V3, OUTPUT);
apagarTodo();
[Link](115200);
if () {
[Link]("Error iniciando Bluetooth");
} else {
[Link]("Bluetooth iniciado como ESP32_SEMAFORO");
}
}
// ======================================
// LOOP
// ======================================
void loop() {
// -------- LECTURA DE BLUETOOTH --------
if ([Link]()) {
char c = [Link]();
if (c == '\n') {
procesarComando(cmd);
cmd = "";
} else {
cmd += c;
}
}
// -------- MODO AUTOMÁTICO --------
if (modoAuto) {
cicloAutomatico();
}
}
// ======================================
// MANEJO DE COMANDOS
// ======================================
void procesarComando(String c) {
[Link]();
// ----- activar ciclo automático -----
if (c == "AUTO") {
modoAuto = true;
estadoSemaforo = 0;
lastChange = millis();
[Link]("Modo automatico activado");
return;
}
// ----- volver a modo manual -----
if (c == "MAN") {
modoAuto = false;
apagarTodo();
[Link]("Modo manual activado");
return;
}
// Si está en automático, ignoramos comandos manuales
if (modoAuto) return;
// ============ SEMÁFORO 1 ============
if (c == "A") digitalWrite(R1, HIGH);
if (c == "a") digitalWrite(R1, LOW);
if (c == "B") digitalWrite(AM1, HIGH);
if (c == "b") digitalWrite(AM1, LOW);
if (c == "C") digitalWrite(V1, HIGH);
if (c == "c") digitalWrite(V1, LOW);
// ============ SEMÁFORO 2 ============
if (c == "D") digitalWrite(R2, HIGH);
if (c == "d") digitalWrite(R2, LOW);
if (c == "E") digitalWrite(AM2, HIGH);
if (c == "e") digitalWrite(AM2, LOW);
if (c == "F") digitalWrite(V2, HIGH);
if (c == "f") digitalWrite(V2, LOW);
// ============ SEMÁFORO 3 ============
if (c == "G") digitalWrite(R3, HIGH);
if (c == "g") digitalWrite(R3, LOW);
if (c == "H") digitalWrite(AM3, HIGH);
if (c == "h") digitalWrite(AM3, LOW);
if (c == "I") digitalWrite(V3, HIGH);
if (c == "i") digitalWrite(V3, LOW);
[Link]("OK: ");
[Link](c);
}
// ======================================
// CICLO AUTOMÁTICO
// ======================================
void cicloAutomatico() {
unsigned long tiempo = millis();
switch (estadoSemaforo) {
case 0: // VERDE
if (tiempo - lastChange == 0) encenderVerde();
if (tiempo - lastChange >= tVerde) {
estadoSemaforo = 1;
lastChange = tiempo;
}
break;
case 1: // AMARILLO
if (tiempo - lastChange == 0) encenderAmarillo();
if (tiempo - lastChange >= tAmarillo) {
estadoSemaforo = 2;
lastChange = tiempo;
}
break;
case 2: // ROJO
if (tiempo - lastChange == 0) encenderRojo();
if (tiempo - lastChange >= tRojo) {
estadoSemaforo = 0;
lastChange = tiempo;
}
break;
}
}
// ======================================
// FUNCIONES DE SEMÁFORO
// ======================================
void encenderVerde() {
apagarTodo();
digitalWrite(V1, HIGH);
digitalWrite(V2, HIGH);
digitalWrite(V3, HIGH);
}
void encenderAmarillo() {
apagarTodo();
digitalWrite(AM1, HIGH);
digitalWrite(AM2, HIGH);
digitalWrite(AM3, HIGH);
}
void encenderRojo() {
apagarTodo();
digitalWrite(R1, HIGH);
digitalWrite(R2, HIGH);
digitalWrite(R3, HIGH);
}
void apagarTodo() {
digitalWrite(R1, LOW); digitalWrite(AM1, LOW); digitalWrite(V1,
LOW);
digitalWrite(R2, LOW); digitalWrite(AM2, LOW); digitalWrite(V2,
LOW);
digitalWrite(R3, LOW); digitalWrite(AM3, LOW); digitalWrite(V3,
LOW);
}