ESP32 risparmio energetico pratico: sveglia dal light sleep via UART e GPIO – 6

Spread the love

Con l’esp32, quando si utilizza un sonno leggero, un sonno profondo o uno stato di ibernazione, è necessario selezionare la sorgente di risveglio per far tornare attivo il dispositivo.

ESP32 practical power saving light-sleep UART and GPIO wake-up
ESP32 practical power saving light-sleep UART and GPIO wake-up

Ci sono molte soluzioni, ma per il light sleep ce ne sono altre 2 che sono molto utili in alcune situazioni.

Sorgenti di risveglio solo per il sonno leggero

Il sonno leggero ha qualche fonte di risveglio aggiuntiva e ricorda che questo tipo di sonno ha caratteristiche diverse, controlla i capitoli precedenti.

Risveglio tramite UART

Quando ESP32 riceve l’input UART esterno, può essere necessario riattivare il chip quando i dati di input sono disponibili. La periferica UART contiene una funzionalità che consente di riattivare il chip da un light sleep quando riceve un certo numero di input positivi sul pin RX. Questo numero di input positivi possono essere impostati utilizzando la funzione uart_set_wakeup_threshold(). Nota che il carattere che attiverà il risveglio (e tutti i caratteri precedenti) non verrà ricevuto dall’UART dopo il risveglio. Ciò significa che il dispositivo esterno in genere dovrà inviare un carattere aggiuntivo all’ESP32 per la riattivazione, prima di inviare i dati utili.

Per maggiori informazioni sul dispositivo fare riferimento a “DOIT ESP32 DEV KIT v1 immagine di piedinatura ad alta risoluzione e specifiche“.

esp_sleep_enable_uart_wakeup() può essere utilizzata per abilitare questa sorgente di risveglio.

Per impostare la sorgente di risveglio sono necessari solo questi due comandi:

    uart_set_wakeup_threshold(UART_NUM_0, wake_thresh);
    esp_sleep_enable_uart_wakeup(UART_NUM_0);

Fai attenzione al fatto che UART_NUM_2 (Serial2) non funziona come sorgente di risveglio, quindi usiamo (UART_NUM_0Serial.

Useremo Serial2 per il debug, qui lo schema di connessione.

esp32 DOIT DEV KIT v1 Serial2 FTDI breadboard schema
esp32 DOIT DEV KIT v1 Serial2 FTDI breadboard schema

Qui lo sketch completo:

/*
 *  ESP32
 *  Light Sleep and Serial (UART) wake up
 *  by Mischianti Renzo <https://mischianti.org>
 *
 *  https://mischianti.org
 *
 */

#include <esp_sleep.h>
#include <driver/uart.h>

int variable = 0;

void setup() {
	Serial2.begin(115200);

	while(!Serial2){delay(500);}

	delay(1000);
    Serial2.print("Variable = ");
    Serial2.println(variable);

    variable += 10;

    Serial2.println();
    Serial2.println("LIGHT SLEEP ENABLED FOR 5secs");
    delay(100);

    int wake_thresh = 3;
//    int wake_thresh = 0x3ff;

    uart_set_wakeup_threshold(UART_NUM_0, wake_thresh);
    esp_sleep_enable_uart_wakeup(UART_NUM_0);

    esp_light_sleep_start();

	Serial.begin(115200);
	while(!Serial){delay(500);}
	// Clean Serial from wake up message
	Serial.flush();
	Serial.readString();

    Serial2.println();
    Serial2.println("LIGHT SLEEP WAKE UP");

    Serial2.print("Variable = ");
    Serial2.println(variable);
}

void loop() {
    while (Serial.available()>0){
    	Serial2.write(Serial.read());
    }
}

Qui l’output della Serial (COM26) e Serial2 (COM3):

Variable = 0

LIGHT SLEEP ENABLED

>>Send to COM26: "mess"<<

LIGHT SLEEP WAKE UP
Variable = 10

>>Send to COM26: "prova"<<
prova
>>Send to COM26: "prova2"<<
prova2

GPIO come sorgente di risveglio

esp32 DOIT DEV KIT v1 Serial2 FTDI multiple external wake-up on breadboard
esp32 DOIT DEV KIT v1 Serial2 FTDI multiple external wake-up on breadboard

Oltre alle sorgenti di riattivazione EST0 ed EST1 descritte sopra, è disponibile un altro metodo di riattivazione da ingressi esterni in modalità di sospensione leggera. Con questa sorgente di risveglio, ogni pin può essere configurato individualmente per attivare il risveglio a livello alto o basso utilizzando la  funzione gpio_wakeup_enable(), mentre ricordo che le sorgenti di riattivazione EXT0 ed EST1, che possono essere utilizzate solo con gli I/O RTC, questa sorgente di riattivazione può essere utilizzata con qualsiasi I/O (RTC o digitale).

La funzione

esp_err_t gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type)

abilita la funzione di riattivazione GPIO.

Ritorna
ESP_OK Successo
ESP_ERR_INVALID_ARG Errore dei parametri

Parametri
gpio_num: numero del GPIO.
intr_type: tipo di risceglio GPIO. Solo GPIO_INTR_LOW_LEVEL o GPIO_INTR_HIGH_LEVEL possono essere usati.

Ed è necessario abilitare questa modalità di attivazione con esp_sleep_enable_gpio_wakeup();

/*
 *  ESP32
 *  Light Sleep and GPIO wake up
 *  by Mischianti Renzo <https://mischianti.org>
 *
 *  https://mischianti.org
 *
 */

#include <esp_sleep.h>

int variable = 0;

void setup() {
	Serial2.begin(115200);

	while(!Serial2){delay(500);}

	delay(1000);
    Serial2.print("Variable = ");
    Serial2.println(variable);

    variable += 10;

    Serial2.println();
    Serial2.println("LIGHT SLEEP ENABLED");
    delay(100);

    gpio_wakeup_enable(GPIO_NUM_4, GPIO_INTR_HIGH_LEVEL);
    esp_sleep_enable_gpio_wakeup();

    esp_light_sleep_start();

	Serial.begin(115200);
	while(!Serial){delay(500);}
	// Clean Serial from wake up message
	Serial.flush();
	Serial.readString();

    Serial2.println();
    Serial2.println("LIGHT SLEEP WAKE UP");

    Serial2.print("Variable = ");
    Serial2.println(variable);
}

void loop() {
    while (Serial.available()>0){
    	Serial2.write(Serial.read());
    }
}

Grazie

  1. ESP32: piedinatura, specifiche e configurazione dell’Arduino IDE
  2. ESP32: fileSystem integrato SPIFFS
  3. ESP32: gestire più seriali e logging per il debug
  4. ESP32 risparmio energetico pratico
    1. ESP32 risparmio energetico pratico: gestire WiFi e CPU
    2. ESP32 risparmio energetico pratico: modem e light sleep
    3. ESP32 risparmio energetico pratico: deep sleep e ibernazione
    4. ESP32 risparmio energetico pratico: preservare dati al riavvio, sveglia a tempo e tramite tocco
    5. ESP32 risparmio energetico pratico: sveglia esterna e da ULP
    6. ESP32 risparmio energetico pratico: sveglia da UART e GPIO
  5. ESP32: filesystem integrato LittleFS
  6. ESP32: filesystem integrato FFat (Fat/exFAT)
  7. ESP32-wroom-32
    1. ESP32-wroom-32: flash, piedinatura, specifiche e configurazione dell’Arduino IDE
  8. ESP32-CAM
    1. ESP32-CAM: piedinatura, specifiche e configurazione dell’Arduino IDE
    2. ESP32-CAM: upgrade CamerWebServer con gestione della luce flash
  9. ESP32: ethernet w5500 con chiamate standard (HTTP) e SSL (HTTPS)
  10. ESP32: ethernet enc28j60 con chiamate standard (HTTP) e SSL (HTTPS)
  11. Come usare la scheda SD con l’esp32
  12. esp32 e esp8266: file system FAT su memoria SPI flash esterna
  13. Gestione aggiornamenti firmware e OTA
    1. Gestione del firmware
      1. ESP32: flash del firmware binario compilato (.bin)
      2. ESP32: flash del firmware e filesystem (.bin) con strumenti grafici
    2. Aggiornamento OTA con Arduino IDE
      1. Aggiornamenti OTA su ESP32 con Arduino IDE: filesystem, firmware e password
    3. Aggiornamento OTA con browser web
      1. Aggiornamenti OTA su ESP32 tramite browser web: firmware, filesystem e autenticazione
      2. Aggiornamenti OTA su ESP32 tramite browser web: caricamento in HTTPS (SSL/TLS) con certificato autofirmato
      3. Aggiornamenti OTA su ESP32 tramite browser web: interfaccia web personalizzata
    4. Aggiornamenti automatici OTA da un server HTTP
      1. Aggiornamento automatico Firmware OTA dell’ESP32 dal server
      2. Aggiornamento automatico Firmware OTA dell’ESP32 dal server con controllo della versione
      3. Aggiornamento automatico Firmware OTA dell’ESP32 in HTTPS (SSL/TLS) con certificato autofirmato affidabile
    5. Aggiornamento del firmware non standard
      1. Aggiornamento firmware e filesystem ESP32 dalla scheda SD
      2. Aggiornamento firmware e filesystem ESP32 con client FTP
  14. Integrare LAN8720 con ESP32 per la connettività Ethernet con plain (HTTP) e SSL (HTTPS)
  15. Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
  16. ESP32-C3: piedinatura, specifiche e configurazione dell’IDE Arduino
  17. i2c esp32: gestione rete a 5v, 3.3v e interfaccia aggiuntiva
  18. […]

Spread the love

4 Risposte

  1. Rossati Giovanni ha detto:

    Hi
    Thank for your scripts.
    I used for implement my demo on sleep/interrupt using GPIO and UART.
    I have tried to use GPIO5 but it is alwais HIGH (my be it is link to led?). GPIO4 instead works.
    For UARTI have tried to use the serial monitor assuming that it is UART_NUM_0 but with no success
    Regards
    Giovanni Rossati

  2. Rossati Giovanni ha detto:

    Thanks Renzo,

    in my demo I use both wake up: GPI04 for gpio wakeup (I know tha it can also used for rtc wake up) and
    GPIO13 for rtc wake up. For completeness I use for the wake up touch GPIO15.
    Best regards.

    • Renzo Mischianti ha detto:

      Hi Giovanni,
      Is it possible that you are checking when the pin goes HIGH and you don’t use pull down resistor?
      But you have to keep in mind that the GPIO4 has an internal pull-down, instead GPIO5 has an internal pull-up in the ESP32 DEV KIT board.
      Bye Renzo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *