detection_chute.ino

Arduino Nicla Sense ME · Archivo : detection_chute.ino · Lenguaje : Arduino · Uso : Détecter une chute libre (apportable)

En caída libre la norma del vector de aceleración se desploma por debajo de 0,3 g: este sketch la vigila a 200 Hz y enciende el LED rojo tres segundos tras el evento. El detector de paquete caído, sensor arrancado o aviso de persona caída.

Hardware

Una Arduino Nicla Sense ME (nRF52832, solo BLE) con hub Bosch BHI260AP, BMM150, BMP390, BME688, LED RGB en driver I2C y cargador LiPo. La placa sola. Prueba: soltarla desde 30 cm sobre un cojín: la norma baja de 0,3 g durante la caída.

Cableado

Sin cableado. Fijar bien la placa si el objetivo es detectar la caída de un objeto, no la suya.

Funcionamiento

El bucle de 5 ms muestrea lo bastante rápido para caídas de menos de un segundo; el umbral de 0,3 g evita falsos positivos en movimiento normal. El LED RGB (IS31FL3194) da la señal visual.

Ejecución

Programación desde Arduino IDE (core ArduinoCore-mbed); librerías Arduino_BHY2 y Nicla_System; USB por puente serie.

Variantes

Notificar la caída por BLE a un reloj, cruzar con la presión (detectar el impacto), o registrar las marcas de tiempo de los golpes en memoria para un informe de transporte.

detection_chute.ino

// Détection de chute : la norme d'accélération tombe sous 0,3 g
// en chute libre. Usage : colis fragile, capteur tombé au sol,
// alerte homme-couché. La LED RVB passe au rouge sur événement.

#include "Arduino_BHY2.h"
#include "Nicla_System.h"

SensorAccel accel(0);
unsigned long derniereChute = 0;

void setup() {
  Serial.begin(115200);
  nicla::begin();
  nicla::leds.begin();
  BHY2.begin();
  accel.begin();
  BHY2.update();
}

void loop() {
  BHY2.update();

  if (accel.checkNewData()) {
    float n = sqrtf(accel.x() * accel.x() +
                    accel.y() * accel.y() +
                    accel.z() * accel.z());
    if (n < 0.3) {                 // quasi-impesanteur = chute
      derniereChute = millis();
      Serial.print("CHUTE detectee (norme=");
      Serial.print(n);
      Serial.println(" g)");
    }
  }

  // Signal visuel 3 s après l'événement
  if (millis() - derniereChute < 3000) {
    nicla::leds.setColor(red);
  } else {
    nicla::leds.setColor(green);
  }
  delay(5);   // boucle rapide : la chute dure < 1 s
}

← Volver a la ficha