Skip to content

feat: battery voltage threshold callback with auto-detect battery type #20

Description

@lgnap

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

  1. Ajouter membres privés : _batteryThreshold, _batteryThresholdCb, _batteryAutoMode, _batteryTypeDetected, buffer stddev
  2. Implémenter setBatteryThresholdCallback(float threshold, cb) — mode manuel
  3. Implémenter setBatteryAutoThreshold(cb) — auto-détecte le type sur le 1er voltage, calcule le seuil
  4. Détecter alimentation fixe (stddev sur 50 points)
  5. Dans _drainFifo(), après parsing live data : vérifier le voltage et fire le callback si seuil franchi (avec hystérésis +0.3V)
  6. Tests natifs : seuil manuel franchi/pas franchi, hystérésis, auto-détection des 4 types, détection alim fixe
  7. README avec exemples + note sur la limitation shutdown

Critères d'acceptation

  • setBatteryThresholdCallback(11.5f, cb) fire cb quand voltage < 11.5V
  • Le callback ne fire qu'une fois par franchissement (hystérésis +0.3V)
  • setBatteryAutoThreshold(cb) détecte correctement les 4 types + alim fixe
  • Quand alim fixe détectée → surveillance désactivée automatiquement
  • Note dans README : la lib ne peut pas éteindre le RaceBox, l'action est à implémenter côté user (GPIO relais, deep sleep…)
  • Tests natifs verts (make test)

Complexité

S/M — ~2-3 h

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions