/main/pm.c
#include <stdint.h>
#include "driver/gpio.h"
#include "esp_sleep.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "gfx.h"
#include "pm.h"
void deep_sleep() {
// Set ~SHDN low
gpio_set_level(GPIO_NUM_14, 0);
// Turn off display
gfx_set_power(0);
u8g2_ClearBuffer(&u8g2);
u8g2_SendBuffer(&u8g2);
// Wait for a bit for the button to be released.
vTaskDelay(1000 / portTICK_PERIOD_MS);
// Set GPIO25-27 high
gpio_set_level(GPIO_NUM_25, 1);
gpio_set_level(GPIO_NUM_26, 1);
gpio_set_level(GPIO_NUM_27, 1);
// Set ~SHDN, GPIO25-27 HOLD
gpio_hold_en(GPIO_NUM_14);
gpio_hold_en(GPIO_NUM_25);
gpio_hold_en(GPIO_NUM_26);
gpio_hold_en(GPIO_NUM_27);
// Set hold in deep sleep
gpio_deep_sleep_hold_en();
// Trigger wakeup on any keyboard row going high
esp_sleep_enable_ext1_wakeup(
1ull << 34 | 1ull << 35 | 1ull << 36 | 1ull << 39,
ESP_EXT1_WAKEUP_ANY_HIGH
);
// See you on the other side
esp_deep_sleep_start();
}