#include #define analogPin A2 // Pin del sensor #define ledPin D0 // Pin donde está conectado el LED #define N 5 // Número de lecturas para el promedio // Variables para parpadeo bool ledState = false; unsigned long previousMillis = 0; const long interval = 500; // intervalo de parpadeo en ms String modo = "apagado"; // modos: "safe", "parpadeo", "apagado" // BLE service y características BLEService ledService("12345678-1234-1234-1234-1234567890ab"); BLEIntCharacteristic safeChar("00000001-0000-1000-8000-00805f9b34fb", BLEWrite); BLEIntCharacteristic blinkChar("00000002-0000-1000-8000-00805f9b34fb", BLEWrite); BLEIntCharacteristic offChar("00000003-0000-1000-8000-00805f9b34fb", BLEWrite); // --- Variables para control de encendido por 10 segundos --- bool ledEncendido = false; unsigned long tiempoEncendido = 0; const unsigned long DURACION_LED = 10000; // 10 segundos en milisegundos // Variables para detección de cambio en botones BLE int lastSafeVal = 0; int lastBlinkVal = 0; int lastOffVal = 0; // --- Funciones del sensor calibrado --- int leerSensorPromedio(int pin, int muestras = 10) { long suma = 0; for (int i = 0; i < muestras; i++) { suma += analogRead(pin); delay(5); } return suma / muestras; } float lecturaAVoltaje(int lecturaADC, float Vref = 3.3, int resolucion = 4095) { return (lecturaADC * Vref) / resolucion; } float voltajeADistanciaCalibrada(float voltaje) { return 513.3 * voltaje - 5.2; // Fórmula calibrada } float promedioSensor() { float suma = 0; for (int i = 0; i < N; i++) { int lectura = leerSensorPromedio(analogPin); float voltaje = lecturaAVoltaje(lectura); float distancia = voltajeADistanciaCalibrada(voltaje); suma += distancia; delay(20); } return suma / N; } void setup() { Serial.begin(115200); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); if (!BLE.begin()) { Serial.println("❌ Error iniciando BLE"); while (1); } BLE.setLocalName("BLE_LEDS"); BLE.setAdvertisedService(ledService); ledService.addCharacteristic(safeChar); ledService.addCharacteristic(blinkChar); ledService.addCharacteristic(offChar); BLE.addService(ledService); BLE.advertise(); Serial.println("🔵 Esperando conexión BLE..."); } void loop() { BLEDevice central = BLE.central(); if (central) { Serial.print("🔗 Conectado a: "); Serial.println(central.address()); while (central.connected()) { manejarBLE(); manejarModo(); } Serial.println("❎ Desconectado"); modo = "apagado"; digitalWrite(ledPin, LOW); ledEncendido = false; ledState = false; } } void manejarBLE() { int safeVal = safeChar.value(); int blinkVal = blinkChar.value(); int offVal = offChar.value(); // Detectar cambios para evitar repetir acciones innecesarias if (offVal == 3 && offVal != lastOffVal) { modo = "apagado"; Serial.println("🛑 Modo: apagado"); digitalWrite(ledPin, LOW); ledEncendido = false; ledState = false; } else if (safeVal == 1 && safeVal != lastSafeVal) { modo = "safe"; Serial.println("🔍 Modo: safe (sensor)"); digitalWrite(ledPin, LOW); ledEncendido = false; ledState = false; } else if (blinkVal == 2 && blinkVal != lastBlinkVal) { modo = "parpadeo"; Serial.println("⚡ Modo: parpadeo"); digitalWrite(ledPin, LOW); ledEncendido = false; ledState = false; previousMillis = millis(); } // Actualizar últimos valores lastSafeVal = safeVal; lastBlinkVal = blinkVal; lastOffVal = offVal; } void manejarModo() { if (modo == "apagado") { digitalWrite(ledPin, LOW); return; } else if (modo == "safe") { float distanciaCm = promedioSensor(); Serial.print("Distancia calibrada: "); Serial.print(distanciaCm, 1); Serial.println(" cm"); unsigned long ahora = millis(); if (distanciaCm >= 100.0 && distanciaCm <= 150.0 && !ledEncendido) { digitalWrite(ledPin, HIGH); ledEncendido = true; tiempoEncendido = ahora; Serial.println("💡 LED encendido por 10 segundos"); } if (ledEncendido && (ahora - tiempoEncendido >= DURACION_LED)) { digitalWrite(ledPin, LOW); ledEncendido = false; Serial.println("⏱️ LED apagado tras 10 segundos"); } } else if (modo == "parpadeo") { unsigned long ahora = millis(); if (ahora - previousMillis >= interval) { previousMillis = ahora; ledState = !ledState; digitalWrite(ledPin, ledState ? HIGH : LOW); } } }