detection_chute.ino
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
}