from machine import Pin, I2C, time_pulse_us
from time import sleep_us, sleep

# Configuración I2C para MPU6050
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000)
MPU6050_ADDR = 0x68
PWR_MGMT_1 = 0x6B
ACCEL_XOUT_H = 0x3B
GYRO_XOUT_H = 0x43

# Inicialización del MPU6050
i2c.writeto_mem(MPU6050_ADDR, PWR_MGMT_1, b'\x00')

# Configuración del sensor de proximidad HC-SR04
trigger_pin = Pin(5, Pin.OUT)
echo_pin = Pin(18, Pin.IN)

# Configuración del LED rojo
led_rojo = Pin(16, Pin.OUT)

# Función para medir la distancia con el HC-SR04
def medir_distancia():
    trigger_pin.off()
    sleep_us(2)
    trigger_pin.on()
    sleep_us(10)
    trigger_pin.off()
    
    duracion = time_pulse_us(echo_pin, 1, 1000000)  # Tiempo máximo de espera de 1 segundo

    if duracion < 0:
        return float('inf')  # Retorna infinito si hay timeout
    
    distancia_cm = (duracion / 2) / 29.1  # 29.1 us por cm
    return distancia_cm

# Función para leer datos del MPU6050
def leer_mpu6050(addr):
    data = i2c.readfrom_mem(MPU6050_ADDR, addr, 2)
    valor = int.from_bytes(data, 'big')
    if valor > 32767:
        valor -= 65536
    return valor

# Función principal
def main():
    while True:
        # Leer aceleración y giro del MPU6050
        accel_x = leer_mpu6050(ACCEL_XOUT_H)
        accel_y = leer_mpu6050(ACCEL_XOUT_H + 2)
        accel_z = leer_mpu6050(ACCEL_XOUT_H + 4)

        gyro_x = leer_mpu6050(GYRO_XOUT_H)
        gyro_y = leer_mpu6050(GYRO_XOUT_H + 2)
        gyro_z = leer_mpu6050(GYRO_XOUT_H + 4)

        # Imprimir datos del MPU6050
        print("Aceleración: X={:.2f}, Y={:.2f}, Z={:.2f}".format(accel_x/16384, accel_y/16384, accel_z/16384))
        print("Giroscopio: X={:.2f}, Y={:.2f}, Z={:.2f}".format(gyro_x/131, gyro_y/131, gyro_z/131))

        # Medir distancia
        distancia = medir_distancia()
        print("Distancia: {:.2f} cm".format(distancia))

        # Controlar el LED rojo
        if distancia < 300:  # 500 cm = 5 metros
            led_rojo.on()
            print("Objeto detectado a menos de 5 metros. LED encendido.")
        else:
            led_rojo.off()
            print("No se detecta objeto a menos de 5 metros. LED apagado.")
        
        sleep(1)  # Esperar 1 segundo antes de la siguiente lectura

# Ejecutar la función principal
main()
$abcdeabcde151015202530354045505560fghijfghij