Application Flutter cross-platform (Android & iOS) pour le monitoring en temps réel des données IMU du capteur ISM330DHCX sur STM32WB55 via Bluetooth Low Energy.
⚙️ Mise à jour 03/11/2025 : Corrections importantes du parsing des données (gyroscope et accéléromètre inversés).
📖 Voir GYROSCOPE_CORRECTIONS.md pour les détails complets.
✅ Scan BLE - Détection automatique des périphériques STM32 à proximité
✅ Connexion GATT - Connexion sécurisée au périphérique
✅ Données en temps réel - Réception et affichage des données toutes les secondes
✅ Interface moderne - UI Material Design 3 avec animations fluides
✅ Support multi-plateforme - Compatible Android (5.0+) et iOS (12.0+)
✅ Logs détaillés - Suivi en temps réel de la communication BLE
- 🌡️ Température du capteur ISM330DHCX (en °C)
- 🔄 Gyroscope 3 axes (X, Y, Z en dps - degrés par seconde)
- ✨ Calibré automatiquement au démarrage (100 échantillons)
- ✨ Filtré avec moyenne mobile (5 échantillons)
- 📊 Valeurs au repos : ±0.2 dps (après calibration)
- 📊 Accéléromètre 3 axes (X, Y, Z en g - gravité terrestre)
- 📊 Au repos (à plat) : X≈0g, Y≈0g, Z≈1g
lib/
├── main.dart # Point d'entrée + configuration du routing
├── models/ # Modèles de données
│ ├── ble_device_model.dart # Modèle d'un périphérique BLE
│ └── imu_data_model.dart # Modèle des données IMU
├── services/ # Services métier
│ └── ble_service.dart # Service BLE (Singleton) - gère toute la communication
├── screens/ # Écrans de l'application
│ ├── home_screen.dart # Écran d'accueil avec présentation
│ ├── scanner_screen.dart # Scanner BLE
│ └── data_screen.dart # Affichage des données en temps réel
└── utils/ # Utilitaires
└── constants.dart # Constantes (UUIDs, thème, durées)
| Technologie | Version | Utilisation |
|---|---|---|
| Flutter | 3.9.2+ | Framework cross-platform |
| flutter_blue_plus | ^1.32.8 | Communication BLE |
| permission_handler | ^11.3.1 | Gestion des permissions |
| go_router | ^14.6.2 | Navigation moderne |
| provider | ^6.1.2 | State management |
- Flutter SDK (3.9.2 ou supérieur)
- Android Studio ou Xcode (pour iOS)
- Un téléphone physique avec Bluetooth (l'émulateur ne supporte pas le BLE)
- STM32WB55 configuré avec :
- Service BLE IMU actif
- UUID caractéristique :
0000abcd-8e22-4541-9d4c-21edae82ed19 - Format des données : 20 ou 28 bytes (Little-Endian IEEE 754)
git clone <url-du-repo>
cd Projet_BEflutter pub getflutter doctor# Connecter un téléphone Android en USB (mode développeur activé)
flutter run# Connecter un iPhone en USB
flutter runflutter run --releaseLes permissions suivantes sont automatiquement configurées dans android/app/src/main/AndroidManifest.xml :
BLUETOOTH/BLUETOOTH_ADMIN(Android < 12)BLUETOOTH_SCAN/BLUETOOTH_CONNECT(Android 12+)ACCESS_FINE_LOCATION(requis pour le scan BLE)
Les permissions suivantes sont configurées dans ios/Runner/Info.plist :
NSBluetoothAlwaysUsageDescription- Description de l'utilisation du BluetoothUIBackgroundModes- Modebluetooth-centralpour les connexions en arrière-plan
- Présentation des fonctionnalités (carrousel)
- Bouton "Scanner les périphériques"
- Appuyez sur le bouton flottant pour démarrer le scan
- La liste des périphériques découverts s'affiche
- Touchez un périphérique pour vous connecter
- Onglet "Données" : Affichage décrypté avec cartes colorées
- Température (orange)
- Accéléromètre (violet)
- Gyroscope (vert)
- Onglet "Logs" : Logs de débogage en temps réel
Le thème est défini dans lib/utils/constants.dart :
class AppTheme {
static const Color primary = Color(0xFF2196F3); // Bleu
static const Color accent = Color(0xFFFF9800); // Orange
static const Color success = Color(0xFF4CAF50); // Vert
// ...
}Les UUIDs sont définis dans lib/utils/constants.dart :
class AppConstants {
static const String charAllDataUuid = '0000abcd-8e22-4541-9d4c-21edae82ed19';
// ...
}Solutions :
- Vérifiez que le Bluetooth est activé
- Activez la localisation (requis sur Android)
- Vérifiez que le STM32 est en mode advertising
- Rapprochez-vous du périphérique
Solutions :
- Redémarrez le STM32
- Redémarrez l'application
- Vérifiez les logs (onglet "Logs")
Solutions :
- Vérifiez que les notifications BLE sont activées
- Vérifiez que le STM32 envoie bien les données (28 bytes)
- Consultez les logs de débogage
# Nettoyer le projet
flutter clean
flutter pub get
# Régénérer les fichiers natifs
cd android && ./gradlew clean && cd ..
cd ios && rm -rf Pods Podfile.lock && pod install && cd ..Le STM32 envoie des paquets de 28 bytes au format Little-Endian IEEE 754 :
⚠️ Important : L'ordre Gyro/Accel a été inversé le 03/11/2025. Voir GYROSCOPE_CORRECTIONS.md
| Offset | Taille | Données | Unité | Note |
|---|---|---|---|---|
| 0-3 | 4 bytes | Température | °C | Température du capteur ISM330DHCX |
| 4-7 | 4 bytes | Gyro X | dps | ⚡ GYRO vient AVANT (calibré + filtré) |
| 8-11 | 4 bytes | Gyro Y | dps | Valeurs au repos : ±0.2 dps |
| 12-15 | 4 bytes | Gyro Z | dps | Filtrage moyenne mobile (5 échantillons) |
| 16-19 | 4 bytes | Accel X | g | ⚡ ACCEL vient APRÈS |
| 20-23 | 4 bytes | Accel Y | g | Au repos (à plat) : ~0g |
| 24-27 | 4 bytes | Accel Z | g | Au repos (à plat) : ~1g (gravité) |
Projet Bureau d'Étude - ISEN
Projet réalisé dans le cadre du Bureau d'Étude ISEN 5e année.
Note : Cette application nécessite un périphérique physique avec Bluetooth. Les émulateurs/simulateurs ne supportent pas le BLE.