Contexte
Le RaceBox Micro envoie la tension d'alimentation dans chaque point live (batteryLevel byte = tension × 10). Actuellement la lib ne fait rien avec cette valeur.
⚠️ Limitation importante : il n'existe pas de commande BLE pour éteindre le RaceBox (le protocole rev 8 n'en expose pas). Le callback batterie permet de détecter le niveau critique, mais l'action (couper un relais GPIO, mettre l'ESP32 en deep sleep…) est laissée à l'utilisateur. stopRecording() n'est utile que si l'enregistrement est actif — en mode live uniquement, il n'a aucun effet sur la consommation du device.
Description
API proposée
Option A — seuil manuel
// Appelle cb(voltage) dès que la tension passe sous threshold
ble.setBatteryThresholdCallback(11.5f, [](float volts) {
rec.stopRecording(); // si enregistrement actif
digitalWrite(RELAY_PIN, LOW); // couper l'alim RaceBox via relais
esp_deep_sleep_start(); // mettre l'ESP32 en veille
});
Option B — auto-détection du type de batterie ⭐
// Déduit le type de batterie depuis le premier voltage mesuré
// et applique le seuil critique correspondant automatiquement
ble.setBatteryAutoThreshold([](float volts, const char* batteryType) {
Serial.printf("Low battery! %.1fV (%s)\n", volts, batteryType);
// action à définir par l'utilisateur
});
Option C — détection alimentation fixe (pas de batterie)
Si le voltage est très stable sur les 50 premiers points (stddev < 0.05V) et à niveau "plein" → flag onFixedPower : pas besoin de surveillance, désactiver le threshold.
Logique d'auto-détection du type
Depuis le premier voltage reçu, on déduit le type :
| Plage détectée |
Type déduit |
Seuil warning |
Seuil critique |
| > 10.0 V |
12V plomb (voiture) |
< 12.0 V |
< 11.5 V |
| 6.0–9.0 V |
LiPo 2S |
< 7.0 V |
< 6.6 V |
| 4.0–6.0 V |
USB 5V |
< 4.5 V |
< 4.3 V |
| 2.8–4.2 V |
LiPo 1S |
< 3.5 V |
< 3.3 V |
| Stable ± 0.05V |
Alim fixe |
— |
désactivé |
Voltages de référence — 12V plomb (cas principal BikeTrace)
| Tension |
État |
| 14.0–14.4 V |
En charge (moteur tournant) |
| 12.6–12.8 V |
Pleine, moteur coupé |
| 12.0–12.4 V |
~50–80% |
| 11.5–12.0 V |
Faible (< 20%) |
| < 11.5 V |
⚠️ Critique — couper les consommateurs |
| < 10.5 V |
💀 Batterie morte |
Voltages de référence — LiPo 2S
| Tension |
État |
| 8.2–8.4 V |
Pleine |
| 7.4 V |
Nominale |
| 7.0–7.2 V |
Faible |
| < 6.6 V |
⚠️ Critique |
Voltages de référence — LiPo 1S
| Tension |
État |
| 4.1–4.2 V |
Pleine |
| 3.7 V |
Nominale |
| 3.5 V |
Faible |
| < 3.3 V |
⚠️ Critique |
Fichiers concernés
src/RaceBoxBle.h — ajout de setBatteryThresholdCallback(), setBatteryAutoThreshold(), membres internes
src/RaceBoxBle.cpp — logique dans _drainFifo() après parsing live data
test/test_battery_threshold.cpp — tests natifs
README.md — section battery monitoring + note limitation shutdown
Plan d'implémentation
- Ajouter membres privés :
_batteryThreshold, _batteryThresholdCb, _batteryAutoMode, _batteryTypeDetected, buffer stddev
- Implémenter
setBatteryThresholdCallback(float threshold, cb) — mode manuel
- Implémenter
setBatteryAutoThreshold(cb) — auto-détecte le type sur le 1er voltage, calcule le seuil
- Détecter alimentation fixe (stddev sur 50 points)
- Dans
_drainFifo(), après parsing live data : vérifier le voltage et fire le callback si seuil franchi (avec hystérésis +0.3V)
- Tests natifs : seuil manuel franchi/pas franchi, hystérésis, auto-détection des 4 types, détection alim fixe
- README avec exemples + note sur la limitation shutdown
Critères d'acceptation
Complexité
S/M — ~2-3 h
Contexte
Le RaceBox Micro envoie la tension d'alimentation dans chaque point live (
batteryLevelbyte = tension × 10). Actuellement la lib ne fait rien avec cette valeur.stopRecording()n'est utile que si l'enregistrement est actif — en mode live uniquement, il n'a aucun effet sur la consommation du device.Description
API proposée
Option A — seuil manuel
Option B — auto-détection du type de batterie ⭐
Option C — détection alimentation fixe (pas de batterie)
Si le voltage est très stable sur les 50 premiers points (stddev < 0.05V) et à niveau "plein" → flag
onFixedPower: pas besoin de surveillance, désactiver le threshold.Logique d'auto-détection du type
Depuis le premier voltage reçu, on déduit le type :
Voltages de référence — 12V plomb (cas principal BikeTrace)
Voltages de référence — LiPo 2S
Voltages de référence — LiPo 1S
Fichiers concernés
src/RaceBoxBle.h— ajout desetBatteryThresholdCallback(),setBatteryAutoThreshold(), membres internessrc/RaceBoxBle.cpp— logique dans_drainFifo()après parsing live datatest/test_battery_threshold.cpp— tests natifsREADME.md— section battery monitoring + note limitation shutdownPlan d'implémentation
_batteryThreshold,_batteryThresholdCb,_batteryAutoMode,_batteryTypeDetected, buffer stddevsetBatteryThresholdCallback(float threshold, cb)— mode manuelsetBatteryAutoThreshold(cb)— auto-détecte le type sur le 1er voltage, calcule le seuil_drainFifo(), après parsing live data : vérifier le voltage et fire le callback si seuil franchi (avec hystérésis +0.3V)Critères d'acceptation
setBatteryThresholdCallback(11.5f, cb)firecbquand voltage < 11.5VsetBatteryAutoThreshold(cb)détecte correctement les 4 types + alim fixemake test)Complexité
S/M — ~2-3 h