#include <Wire.h>
#include <MPU6050.h>
MPU6050 mpu;
// Pines de LEDs
const int leds[] = {3, 4, 5, 6, 7, 8, 9, 10};
const int ledRojo = 10;
const int botonPin = 2; // Pin para el pulsador de reinicio
int estadoBoton = 0;
// Parámetros de frenado
float aceleracionUmbralBaja = 0.5; // Aceleración para encender LEDs verdes
float aceleracionUmbralMedia = 1.0; // Aceleración para encender LEDs amarillos
float aceleracionUmbralAlta = 1.5; // Aceleración para encender LEDs azules
float aceleracionCritica = 2.0; // Aceleración crítica para impacto
bool airbagActivado = false;
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
// Configuración de LEDs y pulsador
for (int i = 0; i < 8; i++) {
pinMode(leds[i], OUTPUT);
digitalWrite(leds[i], LOW);
}
pinMode(botonPin, INPUT); // Pulsador con resistencia interna
if (mpu.testConnection()) {
Serial.println("MPU6050 conectado correctamente");
} else {
Serial.println("Error de conexión con el MPU6050");
}
}
void loop() {
estadoBoton = digitalRead(botonPin);
// Leer la aceleración en el eje X
int16_t ax, ay, az;
mpu.getAcceleration(&ax, &ay, &az);
float aceleracion = abs(ax) / 16384.0; // Convertir a g (1 g = 9.81 m/s²)
Serial.println(aceleracion);
// Si el sistema está activado por impacto, esperar a reinicio
if (airbagActivado) {
digitalWrite(ledRojo, HIGH); // Mantener LED rojo encendido
// Espera a que se pulse el botón para rearmar
if (estadoBoton == HIGH) {
airbagActivado = false;
apagarTodosLeds();
}
delay(100);
return;
}
// Encender LEDs según el nivel de aceleración
if (aceleracion >= aceleracionCritica) {
// Impacto crítico, activar airbag
activarAirbag();
} else if (aceleracion >= aceleracionUmbralAlta) {
encenderLeds(7); // Encender hasta el LED azul 2
} else if (aceleracion >= aceleracionUmbralMedia) {
encenderLeds(5); // Encender hasta el LED amarillo 2
} else if (aceleracion >= aceleracionUmbralBaja) {
encenderLeds(3); // Encender hasta el LED verde 3
} else {
apagarTodosLeds(); // Apagar todos los LEDs si la frenada es leve
}
delay(100);
}
// Función para encender los LEDs hasta un índice específico
void encenderLeds(int hasta) {
apagarTodosLeds();
for (int i = 0; i <= hasta; i++) {
digitalWrite(leds[i], HIGH);
}
}
// Función para apagar todos los LEDs
void apagarTodosLeds() {
for (int i = 0; i < 8; i++) {
digitalWrite(leds[i], LOW);
}
}
// Función para activar el airbag
void activarAirbag() {
airbagActivado = true;
for (int i = 0; i < 8; i++) {
digitalWrite(leds[i], HIGH); // Encender todos los LEDs
}
}