ESP32 risparmio energetico pratico: sveglia dal light sleep via UART e GPIO – 6
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.
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_0
) Serial
.
Useremo Serial2 per il debug, qui lo schema di connessione.
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
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.
RitornaESP_OK
SuccessoESP_ERR_INVALID_ARG
Errore dei parametri
Parametrigpio_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
- ESP32: piedinatura, specifiche e configurazione dell’Arduino IDE
- ESP32: fileSystem integrato SPIFFS
- ESP32: gestire più seriali e logging per il debug
- ESP32 risparmio energetico pratico
- ESP32 risparmio energetico pratico: gestire WiFi e CPU
- ESP32 risparmio energetico pratico: modem e light sleep
- ESP32 risparmio energetico pratico: deep sleep e ibernazione
- ESP32 risparmio energetico pratico: preservare dati al riavvio, sveglia a tempo e tramite tocco
- ESP32 risparmio energetico pratico: sveglia esterna e da ULP
- ESP32 risparmio energetico pratico: sveglia da UART e GPIO
- ESP32: filesystem integrato LittleFS
- ESP32: filesystem integrato FFat (Fat/exFAT)
- ESP32-wroom-32
- ESP32-CAM
- ESP32: ethernet w5500 con chiamate standard (HTTP) e SSL (HTTPS)
- ESP32: ethernet enc28j60 con chiamate standard (HTTP) e SSL (HTTPS)
- Come usare la scheda SD con l’esp32
- esp32 e esp8266: file system FAT su memoria SPI flash esterna
- Gestione aggiornamenti firmware e OTA
- Gestione del firmware
- Aggiornamento OTA con Arduino IDE
- Aggiornamento OTA con browser web
- Aggiornamenti automatici OTA da un server HTTP
- Aggiornamento del firmware non standard
- Integrare LAN8720 con ESP32 per la connettività Ethernet con plain (HTTP) e SSL (HTTPS)
- Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
- ESP32-C3: piedinatura, specifiche e configurazione dell’IDE Arduino
- Integrazione del modulo W5500 su ESP32 con Core 3: supporto nativo ai protocolli Ethernet con SSL e altre funzionalità
- Integrazione del modulo LAN8720 su ESP32 con Core 3: supporto nativo del protocollo Ethernet con SSL e altre funzionalità.
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
Hi Giovanni,
pay attention that it’s not rtc gpio and you must use gpio wake up not rtc wake up.
For serial try to change thresold.
Bye Renzo
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.
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