Zum Hauptinhalt springen

Deep Sleep und die Wake-up-Taste

Was dieses Beispiel zeigt​

Versetzen Sie den ESP32-S3 in den Deep Sleep und wecken Sie ihn entweder nach 120 Sekunden oder durch Drücken der Wake-up-Taste (IO18). Bei jedem Aufwachen startet das Board erneut in setup(), zählt den Start und zeigt an, wodurch es aufgeweckt wurde. Der Boot-Zähler liegt im RTC-Speicher, der seinen Wert während des Deep Sleep behält.

Dieses Beispiel verwendet außerdem Funktionen des ESP32-Board-Pakets (die ESP-IDF-Schlafmodi), die nicht Teil der Inkplate-Bibliothek sind.

Beispielcode​

Select Board
Inkplate7SPECTRA_Wake_Up_Button.ino
#include <Inkplate.h>

// Conversion factor for micro seconds to seconds
#define uS_TO_S_FACTOR 1000000ULL
// Time ESP32 will go to sleep (in seconds)
#define TIME_TO_SLEEP 120

// Initiate Inkplate object
Inkplate inkplate;

// Store int in rtc data, to remain persistent during deep sleep
RTC_DATA_ATTR int bootCount=0;

void setup() {
inkplate.begin();
inkplate.setTextColor(INKPLATE_BLACK);
++bootCount;

// Our function delcared below
displayInfo();

// Go to sleep for TIME_TO_SLEEP seconds
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
// Enable wakeup from deep sleep on gpio 18 (wake button)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_18, 0);
// Start deep sleep (this function does not return). Program stops here.
esp_deep_sleep_start();

}

void loop() {
// Never here! If you use deep sleep, the whole program should be in setup() because the board restarts each
// time. loop() must be empty!

}

void displayInfo(){
// First, lets delete everything from frame buffer
inkplate.clearDisplay();

// Set text cursor and size
inkplate.setCursor(10,180);
inkplate.setTextSize(1);

inkplate.print(F("Boot count: "));
inkplate.println(bootCount, DEC); // Print the number

// Set next line cursor position
inkplate.setCursor(10,220);

// Display wake up reason
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason){
case ESP_SLEEP_WAKEUP_EXT0:
inkplate.println("Wakeup caused by WakeUp button");
break;
case ESP_SLEEP_WAKEUP_TIMER:
inkplate.println("Wakeup caused by timer");
break;
default:
inkplate.println("Wakeuo was not caused by deep sleep");
break;
}
inkplate.display();

}

Verwendete Funktionen​

Inkplate()returns None

Erstellt das Inkplate-Objekt. Inkplate 7SPECTRA hat nur einen einzigen Sechs-Farben-Modus, deshalb benötigt der Konstruktor kein Modus-Argument.

ReturnsKonstruktor; kein Rückgabewert.

inkplate.begin()returns void

Initialisiert die Bibliothek, die Peripherie und den Framebuffer. Nach dem Deep Sleep startet das Board neu, daher ruft setup() sie bei jedem Aufwachen erneut auf.

ReturnsNichts.

inkplate.setTextColor(uint16_t c)returns void

Legt die Textfarbe fest, hier INKPLATE_BLACK.

ReturnsNichts.

inkplate.clearDisplay()returns void

Füllt den Framebuffer mit Weiß. Das Panel wird dadurch nicht verändert.

ReturnsNichts.

inkplate.setCursor(int16_t x, int16_t y)returns void

Legt fest, wo der nächste ausgegebene Text beginnt, in Pixeln von der linken oberen Ecke.

ReturnsNichts.

inkplate.setTextSize(uint8_t s)returns void

Legt die Textvergrößerung fest; 1 ist die Basisschrift mit 5×7 Pixeln.

ReturnsNichts.

inkplate.print(value)returns size_t

Gibt Text an der Cursorposition in den Framebuffer aus, wie Serial.print().

ReturnsAnzahl der ausgegebenen Bytes.

inkplate.println(value, format)returns size_t

Wie print(), setzt den Cursor danach aber in die nächste Zeile. Mit DEC wird eine Zahl dezimal ausgegeben.

ReturnsAnzahl der ausgegebenen Bytes.

inkplate.display(bool _leaveOn = 0)returns void

Sendet den gesamten Framebuffer an das Panel und aktualisiert es.

ReturnsNichts.

esp_sleep_enable_timer_wakeup(uint64_t time_in_us)returns esp_err_t

ESP32-Board-Paket: weckt den Chip nach der angegebenen Zeit in Mikrosekunden aus dem Deep Sleep, hier 120 × 1.000.000.

ReturnsESP_OK bei Erfolg.

esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level)returns esp_err_t

ESP32-Board-Paket: weckt den Chip, wenn der Pin den angegebenen Pegel erreicht. Der Sketch verwendet GPIO_NUM_18, die Wake-up-Taste, und Pegel 0 (Low).

ReturnsESP_OK bei Erfolg.

esp_deep_sleep_start()returns void

ESP32-Board-Paket: versetzt den Chip in den Deep Sleep. Die Funktion kehrt nicht zurück; beim nächsten Aufwachen startet der Sketch von vorn.

ReturnsKehrt nicht zurück.

esp_sleep_get_wakeup_cause()returns esp_sleep_wakeup_cause_t

ESP32-Board-Paket: meldet, was den Chip geweckt hat, zum Beispiel ESP_SLEEP_WAKEUP_EXT0 (die Taste) oder ESP_SLEEP_WAKEUP_TIMER.

ReturnsDie Aufwachursache.

Was Sie erwarten können​

Nach dem Hochladen zeigt der Bildschirm Boot count: 1 und Wakeuo was not caused by deep sleep (die Schreibweise stammt aus dem Beispiel). Anschließend schläft das Board. Drücken Sie die Wake-up-Taste, und der Zähler steigt mit Wakeup caused by WakeUp button; warten Sie 120 Sekunden, und es erscheint Wakeup caused by timer. Der Sketch gibt nichts im Serial Monitor aus.

🔗Vollständiges Beispiel öffnen

examples/Inkplate7SPECTRA/Advanced/DeepSleep/Inkplate7SPECTRA_Wake_Up_Button

→