- esp32
- sommeil profond
- gpio rtc
- systèmes embarqués
- basse consommation
Réveil de l’ESP32 après un sommeil profond : sources et limites des broches

Un ESP32 qui se réveille après un sommeil profond ne reprend pas l’exécution à l’instruction qui l’a mis en veille. Il éteint la plus grande partie de la puce, attend qu’une petite section toujours alimentée détecte une condition, puis redémarre l’application. La difficulté consiste à choisir une source de réveil qui existe sur la puce exacte et la broche utilisées.
Ce que le sommeil profond de l’ESP32 éteint réellement
Le sommeil profond est une décision concernant les domaines d’alimentation, et non une version plus lente de l’exécution normale. La logique numérique principale, les processeurs, la plus grande partie de la RAM et le contrôle GPIO ordinaire sont éteints ou déconnectés. Le contrôleur RTC, la source d’horloge lente du RTC, la mémoire RTC sélectionnée et les circuits nécessaires à la source de réveil choisie peuvent rester alimentés.
Les circuits restants surveillent le temps, le niveau d’une broche, une mesure tactile ou un programme exécuté dans un coprocesseur à très faible consommation disponible. Lorsque leur condition est remplie, ils déclenchent un événement de réveil. La puce passe ensuite par la réinitialisation et le démarrage, initialise les horloges et les périphériques, puis lance l’application à partir de son point d’entrée.
Voici la conséquence principale : le réveil après un sommeil profond est un redémarrage, et non un retour depuis esp_deep_sleep_start(). Le code placé avant le sommeil est exécuté de nouveau, à moins que le programme n’enregistre l’état dans la mémoire RTC, un stockage non volatile ou un appareil externe. Un compteur de démarrages dans la mémoire RTC conservée peut distinguer les cycles de réveil répétés, mais la disponibilité et le comportement de la mémoire conservée diffèrent selon la puce et la configuration du sommeil.
L’horloge lente du RTC est également importante. Un réveil par minuterie est basé sur cette horloge, généralement un oscillateur interne à faible consommation ou une source externe de 32,768 kHz lorsqu’elle est prise en charge. La source interne privilégie la simplicité matérielle au prix d’une dérive liée à la tension et à la température. Un réveil prévu après un intervalle approximatif convient généralement; une mesure minutée ou un cycle de service radio peut nécessiter un étalonnage à l’aide d’une référence connue.
Les sources de réveil et leurs limites physiques
En pratique, choisissez la source la moins coûteuse qui répond aux exigences de synchronisation et d’entrée. Un coprocesseur n’est pas automatiquement une amélioration si une minuterie ou une seule broche peut accomplir la tâche.
| Source de réveil | Matériel maintenu actif | Tolérance du déclenchement | Cause fréquente d’échec |
|---|---|---|---|
| Minuterie RTC | Contrôleur RTC et horloge lente | La dérive de l’horloge détermine l’erreur de temps | Le réveil se produit plus tôt ou plus tard que prévu lorsque la température et la tension changent |
| Broche externe, ext0 | Logique RTC et une entrée RTC | Sensible au niveau; l’entrée doit rester au niveau sélectionné | Le rebond d’un bouton, une entrée flottante ou une mauvaise polarité provoque un réveil immédiat |
| Broches externes, ext1 | Logique RTC et masque d’entrées RTC | La combinaison de broches est évaluée selon le mode logique sélectionné | Une broche non RTC est incluse ou une entrée inutilisée reste électriquement indéfinie |
| Capteur tactile | Circuits tactiles RTC et électrodes tactiles sélectionnées | Le seuil change selon l’humidité, le câblage, le revêtement et le bruit | Le seuil fonctionne à l’atelier, mais échoue après une modification du boîtier ou de l’interface utilisateur |
| Coprocesseur ULP ou RTC | Mémoire RTC, horloge RTC et coprocesseur pris en charge | Dépend de l’échantillonnage du capteur, de la dérive de l’horloge et des limites du programme | La variante d’ESP32 sélectionnée ou la version du logiciel ne prend pas en charge l’exemple copié |
Une minuterie est le premier choix pour un échantillonnage périodique. Elle ne comporte aucun câblage externe susceptible de perturber son fonctionnement et utilise la logique d’application la moins complexe. Ajoutez une marge de réveil si l’action suivante dépend d’une échéance réelle.
Utilisez une broche externe pour un contact de porte, un interrupteur à lames, un bouton-poussoir, un comparateur ou un signal d’alimentation correcte lorsque le signal peut être maintenu à un niveau défini. Une résistance de rappel vers le haut ou vers le bas doit rester efficace pendant le sommeil profond. Les résistances de rappel internes ne sont pas équivalentes sur toutes les broches, et une résistance externe est souvent plus facile à comprendre une fois la carte, le câble et le boîtier installés.
La forme ext0 utilise une seule broche GPIO RTC et une condition de niveau. La forme ext1 surveille un masque de broches GPIO RTC et applique une condition logique telle que n’importe quelle broche sélectionnée ou toutes les broches sélectionnées, selon la cible et l’API ESP-IDF utilisée. Ne déduisez pas la logique disponible d’un exemple de code écrit pour une autre famille de puces.
Le réveil tactile est utile pour une interface utilisateur dissimulée, mais il s’agit d’un problème de mesure plutôt que d’un interrupteur numérique. La pastille, l’électrode, le revêtement, la capacitance du câble, l’humidité et les matériaux mis à la terre à proximité influencent tous la lecture. Étalonnez le seuil une fois les pièces mécaniques installées dans leur position finale, et prévoyez une hystérésis dans la logique de décision lorsque le logiciel le permet.
Un coprocesseur ULP ou RTC peut échantillonner un capteur pendant que le processeur principal dort, ce qui est utile lorsque la décision de réveil nécessite plus qu’un niveau de broche. Cela demande du temps de conception, de la mémoire conservée et un autre comportement dépendant de l’horloge. Si un comparateur peut produire un signal GPIO RTC propre, ce matériel externe constitue souvent une option technique préférable. N’ajoutez pas de coprocesseur pour corriger un problème qui relève du conditionnement du signal.
Le GPIO RTC est une capacité de broche, pas un numéro GPIO
Seules les broches compatibles RTC peuvent réveiller un ESP32 après un sommeil profond au moyen d’une source de réveil GPIO externe. Un numéro GPIO qui fonctionne pour une sortie, des interruptions ou un sommeil léger n’est pas automatiquement utilisable pour un réveil après un sommeil profond.
Les ensembles courants de GPIO RTC comprennent :
- ESP32 original : GPIO0, 2, 4, 12 à 15, 25 à 27 et 32 à 39.
- ESP32-S2 et ESP32-S3 : les GPIO RTC sont généralement les GPIO0 à GPIO21, sous réserve de la fiche technique et du boîtier précis.
- ESP32-C3 : les GPIO RTC sont les GPIO0 à GPIO5.
- ESP32-C6 : les GPIO RTC sont les GPIO0 à GPIO7.
Ces listes décrivent les capacités des puces, et non ce qui est physiquement disponible sur une carte de développement. Un module peut laisser une broche non connectée, la réserver pour la mémoire flash ou la PSRAM, la relier à un circuit présent sur la carte ou l’exposer sous une désignation propre à la carte. Consultez la fiche technique de la puce cible et le schéma de la carte avant d’attribuer l’entrée de réveil.
L’ESP32 original comporte un piège supplémentaire : les GPIO34 à GPIO39 sont des entrées seulement et ne fournissent pas les fonctions habituelles de résistance de rappel interne vers le haut ou vers le bas. Si l’une de ces broches est utilisée pour le réveil, le circuit externe doit établir un niveau valide. Une entrée flottante peut ressembler à un événement de réveil, surtout avec un long fil placé près d’une charge commutée.
Le même numéro GPIO peut avoir un statut RTC différent dans une autre famille d’ESP32. C’est pourquoi du code copié peut être compilé et téléversé, puis échouer sans indication : le code peut configurer correctement un GPIO normal alors que le contrôleur de réveil après un sommeil profond ne peut pas voir cette pastille. Utilisez les définitions de capacité de broche propres à la cible lorsqu’elles sont disponibles, puis confirmez le mappage dans la fiche technique.
Concevez le circuit de réveil avant d’écrire le code de sommeil
Commencez par l’état électrique pendant le sommeil, et non par l’appel d’API. Pour chaque entrée de réveil, documentez le niveau qui correspond à l’éveil, le niveau qui correspond au sommeil, la résistance de rappel qui crée cet état et tous les autres composants reliés à ce nœud.
Voici une liste de vérification utile :
- Confirmez que la broche est compatible RTC avec la révision exacte du silicium et la carte.
- Mesurez le niveau de la broche lorsque la carte est alimentée et lorsque l’interrupteur externe est dans chacun des deux états.
- Vérifiez si le capteur ou la résistance de rappel reste alimenté pendant le sommeil profond.
- Ajoutez un anti-rebond pour les contacts mécaniques; le sommeil profond ne supprime pas le rebond des contacts.
- Gardez les fils de réveil courts ou filtrez-les lorsqu’ils quittent la carte.
- Confirmez le niveau de réveil sélectionné avant d’appeler la fonction de sommeil.
- Consignez la cause de réinitialisation au démarrage afin de ne pas confondre un réveil par minuterie avec une chute de tension ou une réinitialisation par chien de garde.
- Testez le réveil avec le boîtier final, le cheminement des câbles et les charges activées.
Pour un bouton, une résistance et un petit condensateur peuvent réduire les déclenchements intempestifs, mais le condensateur ralentit également le front. Pour un interrupteur à lames, examinez à la fois l’état du contact et la disposition de l’aimant. Pour un capteur alimenté, vérifiez que sa sortie ne devient pas indéfinie avant que l’ESP32 passe en sommeil.
Le logiciel doit également restaurer ce que le sommeil profond a supprimé. Initialisez l’affichage, les bus, la radio et l’état de l’application à chaque démarrage. Stockez uniquement le petit état qui doit franchir la limite du sommeil dans la mémoire RTC ou un autre stockage approprié. Si l’appareil doit reprendre une transaction exactement là où elle s’est arrêtée, le sommeil profond n’est pas le bon modèle mental; concevez un point de contrôle explicite et un chemin de récupération.
Choisir la bonne API pour la cible
ESP-IDF comporte des contraintes propres aux cibles et des changements d’API d’une version à l’autre. Les anciens appels de réveil externe, comme esp_sleep_enable_ext0_wakeup() et esp_sleep_enable_ext1_wakeup(), ne signifient pas que chaque cible expose les mêmes broches ou le même comportement ext1. Les versions plus récentes peuvent ajouter des formes propres à la cible pour configurer le réveil par GPIO RTC. Consultez la référence de l’API pour la version d’ESP-IDF et la cible sélectionnées, puis examinez la configuration générée au lieu de vous fier à un tutoriel écrit pour l’ESP32 original.
Une séquence de test fiable est la suivante :
- Affichez la cause de réinitialisation et la cause du réveil au démarrage.
- Configurez un GPIO RTC connu avec une résistance de rappel externe fixe.
- Activez uniquement cette source de réveil.
- Passez en sommeil profond et mesurez la broche sur la puce.
- Modifiez l’état de l’entrée, réveillez l’appareil et vérifiez la cause signalée.
- Répétez avec le micrologiciel final, l’alimentation, le câble et le boîtier définitifs.
Pour une conception esp32 deep sleep wakeup, ce test prouve davantage qu’une compilation réussie. Il vérifie ensemble le niveau physique, le routage RTC, l’API sélectionnée et le chemin de réinitialisation. Si le résultat change entre un ESP32 original et un ESP32-C3, soupçonnez le mappage des GPIO RTC et l’API de réveil avant de soupçonner l’interrupteur.
Questions fréquentes
L’ESP32 reprend-il l’exécution là où le code s’est arrêté après un sommeil profond?
Non. Un réveil après un sommeil profond réinitialise l’application et recommence l’exécution au début du programme. La mémoire RTC conservée peut transporter certaines variables au-delà de la réinitialisation, mais les périphériques et l’état ordinaire du programme doivent être initialisés de nouveau.
N’importe quel GPIO d’un ESP32 peut-il provoquer un réveil après un sommeil profond?
Non. Seules les broches compatibles RTC peuvent réveiller la puce après un sommeil profond au moyen d’une source GPIO externe. Les GPIO RTC disponibles diffèrent selon les variantes d’ESP32, et une carte de développement peut n’en exposer qu’une partie.
Pourquoi le code ext1 copié se compile-t-il, mais ne provoque-t-il jamais de réveil?
La broche n’est peut-être pas un GPIO RTC sur la cible, la carte peut la relier à un autre circuit, l’entrée peut flotter pendant le sommeil, ou l’API et la logique ext1 peuvent différer selon la version d’ESP-IDF ou la famille de puces. Vérifiez dans cet ordre la fiche technique de la cible, le schéma de la carte, le niveau électrique et le journal de la cause du réveil.
The Boss Factory réalise sur commande de l’électronique ESP32 et des logiciels de commande dans le cadre de ses services Électronique sur mesure et systèmes intelligents et Logiciels, sites Web et applications; demandez une soumission.
Services associés
Tous les services →Vous avez un projet en tête?
Dites-nous ce que vous voulez faire fabriquer — nous répondons en 24 à 48 heures.