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
#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 NoneErstellt 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 voidInitialisiert 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 voidLegt die Textfarbe fest, hier INKPLATE_BLACK.
ReturnsNichts.
inkplate.clearDisplay()returns voidFüllt den Framebuffer mit Weiß. Das Panel wird dadurch nicht verändert.
ReturnsNichts.
inkplate.setCursor(int16_t x, int16_t y)returns voidLegt fest, wo der nächste ausgegebene Text beginnt, in Pixeln von der linken oberen Ecke.
ReturnsNichts.
inkplate.setTextSize(uint8_t s)returns voidLegt die Textvergrößerung fest; 1 ist die Basisschrift mit 5×7 Pixeln.
ReturnsNichts.
inkplate.print(value)returns size_tGibt Text an der Cursorposition in den Framebuffer aus, wie Serial.print().
ReturnsAnzahl der ausgegebenen Bytes.
inkplate.println(value, format)returns size_tWie 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 voidSendet den gesamten Framebuffer an das Panel und aktualisiert es.
ReturnsNichts.
esp_sleep_enable_timer_wakeup(uint64_t time_in_us)returns esp_err_tESP32-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_tESP32-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 voidESP32-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_tESP32-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