Test du deep sleep de l’ESP8266
Matériel
Différences entre les 3 modes de veille
https://www.espressif.com/sites/default/files/9b-esp8266-low_power_solutions_en_0.pdf
Modem-sleep
Light-sleep
Deep-sleep
| Item | Modem-sleep | Light-sleep | Deep-sleep |
|---|---|---|---|
| Wi-Fi | OFF | OFF | OFF |
| System clock | ON | OFF | OFF |
| RTC | ON | ON | ON |
| CPU | ON | Pending | OFF |
| Substrate current | 15 mA | 0.4 mA | ~ 20 µA |
| Average current DTIM = 1 | 16.2 mA | 1.8 mA | - |
| Average current DTIM = 3 | 15.4 mA | 0.9 mA | - |
| Average current DTIM = 10 | 15.2 mA | 0.55 mA | - |
Pour comparaison
- un MSP430 consomme 230 µA en mode Active, 0.5 µA en mode Standby et 0.1 µA en mode Off (Datasheet du MSP430).
- un ATtiny consomme 300 µA en mode Active et 0.1 µA en mode Power-down (Datasheet de l’ATtiny).
Deep Sleep
Il y a deux manières de sortir du Deep Sleep
- Débrancher et rebrancher l’alimentation
- Créer une pulse vers
GNDsurRST. Le reset aura lieu au flanc montant. En temps normal,RSTdoit être maintenu àVCCou éventuellement laissé flottant. Cette impulsion peut être crée :- Avec une interruption temporelle : on spécifie la durée d’endormissement dans le programme et l’ESP génère la pulse sur
GPIO16qui doit être connecté àRST. - Avec une interruption matérielle : on connecte un signal en pull up sur
RST. Ce signal doit être exempt de rebonds, sinon l’ESP sera remis à zéro en saccades.
- Avec une interruption temporelle : on spécifie la durée d’endormissement dans le programme et l’ESP génère la pulse sur
Notes
Si on spécifie une durée de 0, l’ESP reste en deep sleep jusqu’au prochain reset sur RST ou lors du prochain branchement.
Si GPIO 16 n’est pas connecté à RST, certaines fonctions de l’ESP sont quand même redémarrées à la fin du temps de veille, car sa consommation augmente à ~10 mA, même avec la RF désactivée…
Montage 1 — Interruption temporelle
L’ESP sort du deep sleep à intervales réguliers. Lors de ce reset, D0 passe à 0 pendant 273.70 µs et doit être connecté à RST. Le reset a lieu lors du flanc montant.
Note : 273.70 µs correspond à 21896 cycles d’horloge à 80 MHz (= 80E+6 * 273.7E-6).
Montage 2 — Interruption externe
L’ESP sort du deep sleep lorsque le bouton connecté en pull-up est pressé. Problème garanti avec ce montage parce que l’ESP sera reseté autant de fois que le bouton sera pressé, y compris lors des rebonds du bouton. Une solution serait d’utiliser une bascule en entrée (https://github.com/esp8266/Arduino/issues/1488).
Programme de test
Note : c’est le même programme qui est utilisé pour les deux montages.
/*
Test Deep Sleep Wemos
avril 2017, ouilogique.com
*/
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}
static const uint8_t LEDverte = D1; // GPIO 5
static const uint8_t LEDorange = D2; // GPIO 4
static const uint8_t LEDbleue = D4; // GPIO 2 ⇒ LED du board
#define LEDverteHIGH digitalWrite( LEDverte, HIGH )
#define LEDverteLOW digitalWrite( LEDverte, LOW )
#define LEDorangeHIGH digitalWrite( LEDorange, HIGH )
#define LEDorangeLOW digitalWrite( LEDorange, LOW )
#define LEDbleueHIGH digitalWrite( LEDbleue, LOW ) // LED du board ⇒ logique inversée
#define LEDbleueLOW digitalWrite( LEDbleue, HIGH )
const int sleepTimeS = 2;
void initHardware()
{
WiFi.mode( WIFI_OFF );
Serial.begin( 115200 );
Serial.print( F( "\n\nSTART\n" ) );
pinMode( LEDverte, OUTPUT );
pinMode( LEDorange, OUTPUT );
pinMode( LEDbleue, OUTPUT );
for( int i=0; i<10; i++ )
{
LEDverteLOW;
LEDorangeLOW;
LEDbleueLOW;
delay( 50 );
LEDverteHIGH;
LEDorangeHIGH;
LEDbleueHIGH;
delay( 50 );
}
Serial.print( F( "FIN DU SETUP\n" ) );
}
void initSleep()
{
rst_info *rsti;
rsti = ESP.getResetInfoPtr();
Serial.println( String( "ResetInfo.reason = " ) + rsti->reason );
// system_deep_sleep_set_option( 0 );
// system_deep_sleep( sleepTimeS * 1000000 );
ESP.deepSleep( sleepTimeS * 1000000, WAKE_RF_DISABLED );
}
void setup()
{
initHardware();
initSleep();
}
void loop()
{}Sources
© ouilogique.com


