detection_chute.ino

Arduino Nicla Sense ME · Fichier : detection_chute.ino · Langage : Arduino · Usage : Détecter une chute libre (apportable)

En chute libre, la norme du vecteur accélération s’effondre sous 0,3 g : ce sketch la surveille à 200 Hz et allume la LED rouge trois secondes après l’événement. Le détecteur de colis tombé, de capteur arraché ou d’alerte homme-couché.

Matériel requis

Une Arduino Nicla Sense ME (nRF52832 dans un module ANNA-B112, BLE seul, pas de Wi-Fi) avec hub capteurs Bosch BHI260AP, magnétomètre BMM150, baromètre BMP390, capteur de gaz BME688, LED RVB sur pilote I2C et chargeur LiPo BQ25120. La carte seule. Test : la lâcher de 30 cm sur un coussin — la norme passe sous 0,3 g le temps de la chute.

Câblage

Aucun câblage. Fixer solidement la carte si le but est de détecter la chute d’un objet, pas la sienne.

Fonctionnement

La boucle à 5 ms échantillonne assez vite pour une chute de moins d’une seconde ; le seuil 0,3 g évite les fausses détections en mouvement normal. La LED RVB (IS31FL3194) donne le signal visuel.

Exécution

Programmation via Arduino IDE (core ArduinoCore-mbed, target NICLA_SENSE_ME) ; bibliothèques Arduino_BHY2 (capteurs) et Nicla_System (LED, chargeur) ; USB via pont série SAMD11.

Variantes

Notifier la chute en BLE vers une montre, croiser avec la pression (détecter l’impact), ou consigner l’horodatage des chocs en mémoire pour un rapport de transport.

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
}

← Retour à la fiche