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
GND
surRST
. Le reset aura lieu au flanc montant. En temps normal,RST
doit être maintenu àVCC
ou é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
GPIO16
qui 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()
{}