🛠 Optimisation énergétique par veille profonde et réveil RTC sur ToughC5
Objectifs
Dans les déploiements IoT extérieurs alimentés par batterie, chaque microampère compte. Ce tutoriel avancé vise à configurer le M5Stack ToughC5 pour minimiser la consommation en veille tout en assurant une précision temporelle via le module RTC RX8130CE. Nous apprendrons à désactiver les interfaces non essentielles (Wi-Fi, BLE, écran) et à programmer un réveil périodique précis.
Matériel nécessaire
- Carte M5Stack ToughC5 IoT Dev Kit (module ESP32-C5HR8)
- Batterie Li-ion 3,7V ou alimentation USB (pour le développement)
- Câble USB-C pour la programmation
- Multimètre (optionnel, recommandé pour valider la consommation réelle)
- Environnement Arduino IDE ou ESP-IDF configuré pour les cibles ESP32-C5
Étapes
Assurez-vous que votre bibliothèque M5Stack est à jour. Pour le mode avancé, il est souvent préférable d'utiliser des fonctions bas niveau ou de vérifier que les bibliothèques standard ne maintiennent pas les horloges actives. ``cpp #include <M5ToughC5.h> #include <RTC.h> // Bibliothèque spécifique au RX8130CE ``
- Configuration de l'environnement de développement
Avant d'entrer en veille, sauvegardez l'état nécessaire dans la RAM retenue (RTC memory) si disponible, ou dans la Flash si les données doivent persister après une perte totale d'alimentation. Configurez le RTC pour un réveil futur. ```cpp void setup() { M5.begin(); // Initialisation du RTC RX8130CE Rtc.begin(); // Désactivation de l'écran ILI9342C pour économiser l'énergie M5.Display.setBrightness(0); M5.Display.sleep();
- Initialisation du RTC et préparation des GPIO
// Désactivation des interfaces radio (Wi-Fi/BLE) WiFi.mode(WIFI_OFF); BLEDevice::deinit(true);
// Configuration d'une broche GPIO comme entrée de réveil externe (optionnel) // ou utilisation du timer interne pour un réveil périodique } ```
Le cœur RISC-V du ESP32-C5 consomme très peu en veille, mais les périphériques externes (Flash, PSRAM, capteurs) doivent être mis en veille. Utilisez la fonction de mise en sommeil profonde en spécifiant une durée ou une source de réveil. ```cpp void loop() { uint64_t deepSleepTimeUs = 60000000; // Exemple : 60 secondes
- Programmation du mode Deep Sleep
// Désactivation des périphériques non essentiels // Note : Vérifiez les registres spécifiques au C5 pour couper l'alimentation // de la mémoire PSRAM si le code ne s'exécute pas depuis la RAM.
// Appel à la fonction de veille profonde // Sur ESP32-C5, assurez-vous que le RTC reste alimenté par la batterie esp_deep_sleep(deepSleepTimeUs); } ```
À chaque réveil, le code reprend au début de setup(). Il est crucial de vérifier la raison du réveil pour décider si l'on effectue une tâche lourde (envoi de données) ou si l'on retourne immédiatement en veille. ```cpp void setup() { M5.begin(); esp_sleep_wakeup_cause_t wakeup_reason; wakeup_reason = esp_sleep_get_wakeup_cause();
- Gestion du réveil et reprise
if (wakeup_reason == ESP_SLEEP_WAKEUP_TIMER) { // Réveil par timer : exécuter la tâche M5.Display.setBrightness(100); M5.Display.clear(); M5.Display.print("Wake up!"); delay(2000); M5.Display.setBrightness(0); } // Retour à la veille via loop() } ```
Vérification
Pour valider l'optimisation, déconnectez l'alimentation USB et connectez un multimètre en série avec la batterie. En veille profonde, la consommation doit chuter proche de 10,41 µA (spécification constructeur). Vérifiez que l'écran est bien éteint et que les LEDs ne clignotent pas. Utilisez une commande série (si activée en veille) ou une LED témoin connectée à un GPIO pour confirmer que le réveil a lieu à l'heure prévue.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
toughc5_gpio_button_buzzer.inoC++ (Arduino)toughc5_wifi6_scanner.inoC++ (Arduino)toughc5_rtc_battery_log.inoC++ (Arduino)toughc5_ili9342c_touch_ui.inoC++ (Arduino)toughc5_rs485_modbus_master.inoC++ (Arduino)toughc5-rs485-modbus-master.inoArduino C++